cprobe/cprobe

remote write 设计

UlricQin opened this issue · 0 comments

前言

不同的插件,不管是 MySQL、Redis、MongoDB 还是 Kafka、ElasticSearch、SNMP,采集到数据之后最终都要推送到远端时序库。走 prometheus remote write 协议(后期也可以加入 VictoriaMetrics remote write 协议支持)。

设计考虑

  • 可以配置多个 writer 地址,mirror 写,如果某个后端只想接收特定的数据,通过 metric_relabel_configs 做过滤。不同的 writer 地址可以附加不同的标签,可以配置不同的 relabel 规则。当然,全局也应该有 extra_labels 和 relabel 的配置
  • 每个后端存储要控制一下并发度,如果每个插件的每个 target 采集到数据直接就发了就没发控制并发度了
  • 每个后端准备一个 request queue,只要有数据要写就塞入 queue,有一个消费者来消费,按照并发度来发送
  • request queue 中的每个元素直接就是 http request 即可,不需要是单个的 Sample 数据点,太散了锁的消耗太大
  • 如果后端短暂不可用,就需要重试,发不出去的在内存里临时缓存,一般来讲,cprobe 是配合 vmagent 使用(cprobe 发数据给vmagent,vmagent 发数据给后端时序库),cprobe 只做内存缓存就差不多了,毕竟 vmagent 挂的可能性太小了,不太需要引入复杂的文件缓存,vmagent 已经提供文件缓存应对时序库挂掉的场景

配置文件

cprobe 进程启动的时候,通过命令行参数指定 writer.yaml 的路径,writer.yaml 的内容不需要热加载,如果有改动需求,重启 cprobe 进程。配置样例大概如下:

global:
  extra_labels:
    region: bj
    zone: x
  metric_relabel_configs:
  - source_labels: [__name__]
    regex: '(.*)'
    target_label: env
    replacement: 'production'

writers:
- url: http://127.0.0.1:9090/api/v1/write
  extra_labels:
    from: 9090
  metric_relabel_configs:
  - source_labels: [__name__]
    regex: '(.*)'
    target_label: foo
    replacement: 'bar_${1}'
  concurrency: 10
  retry_times: 100
  retry_interval_millis: 3000
  basic_auth_user: ""
  basic_auth_pass: ""
  headers: []
  connect_timeout_millis: 500
  request_timeout_millis: 5000
  max_idle_conns_per_host: 2
  proxy: ""
  interface: ""
  tls_skip_verify: false
  tls_ca: /etc/ssl/certs/ca-certificates.crt
  tls_cert: /etc/ssl/certs/client.crt
  tls_key: /etc/ssl/certs/client.key
  tls_key_pwd: password
  tls_server_name: prometheus
  tls_min_version: "1.2"
  tls_max_version: "1.3"

- url: http://127.0.0.1:9091/api/v1/write
  extra_labels:
    from: 9091