remote write 设计
UlricQin opened this issue · 0 comments
UlricQin commented
前言
不同的插件,不管是 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