一、prometheus中remote_rewrite功能
在 Prometheus 中,remote_rewrite 是一个用于 远程读取(Remote Read) 配置中的选项,它允许你对从远程存储中读取的数据进行重写。这通常是在 Prometheus 中与外部存储系统集成时使用的特性。
例如:将 Prometheus 与长期存储后端(如 Thanos、Cortex、Mimir 等)配合使用时,进行自定义数据的重写或转换。
remote_read 配置中的 remote_rewrite
remote_rewrite 主要用于在 Prometheus 从远程存储读取数据时,对查询请求的时间范围和其他查询参数进行修改或重写。这可以帮助你调整查询的粒度、时间段,或者针对特定的存储系统进行优化。
二、remote_rewrite功能用法
1.基本配置
在 Prometheus 的 prometheus.yml 配置文件中,你可以配置 remote_read 来指定远程存储的位置,以及如何对数据进行查询。
A主机:10.127.192.101
B主机:10.127.188.107
需求:将B主机的prometheus数据源转写到目标地址A主机的prometheus中,使得在A主机中以label形式可以查询到B主机采集到的数据
以下是一个包含 remote_rewrite 的配置示例:
remote_write:
- url: "http://10.127.192.101:9090/api/v1/write" # 数据写入到的目标A主机prometheus的地址
basic_auth: # 如果主prometheus有auth鉴权
username: xxx
password: xxx
write_relabel_configs: # 将该从prometheus的数据以label标签形式转换
- source_labels: []
target_label: "province"
replacement: "130000"
queue_config:
batch_send_deadline: 60s
2.在目标 Prometheus【即 A主机】 上启用 remote_write 接收
修改目标端 Prometheus 的启动参数,添加:
--web.enable-remote-write-receiver
具体步骤:
# 编辑 Prometheus 服务配置文件(假设使用 systemd)
vi /etc/systemd/system/prometheus.service
# 在 ExecStart 行添加参数(示例)
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus/data \
--web.enable-remote-write-receiver # 关键参数
# 重新加载配置并重启
systemctl daemon-reload
systemctl restart prometheus
3 验证目标端【A主机】是否已启用
检查进程是否包含参数
ps aux | grep prometheus | grep enable-remote-write-receiver
再次测试写入数据
echo "test_metric 1" | curl -X POST --data-binary @-http://10.127.192.101:9090/api/v1/write
正常应返回 HTTP 204 No Content。
常见问题补充
如果仍失败,检查以下内容:
- Prometheus 版本是否支持–web.enable-remote-write-receiver
**需要 Prometheus v2.10+。
- 查看版本:
prometheus --version
- 防火墙/网络策略
- 确保10.127.188.107 可以访问 10.127.192.101:9090:
telnet 10.127.192.101 9090
4.快速测试脚本
在目标端(10.127.192.101)运行以下命令,一键启用并验证:
临时启动一个测试 Prometheus(端口 9091)
prometheus --web.enable-remote-write-receiver --web.listen-address=":9091" &
从源端发送测试数据
echo "test_metric 1" | curl -X POST --data-binary @- http://10.127.192.101:9091/api/v1/write
查询是否写入成功
curl -G http://10.127.192.101:9091/api/v1/query --data-urlencode 'query=test_metric'
5.在 Prometheus 中检查自定义 label 是否生效
根据您的配置,您通过 remote_write 的 write_relabel_configs 添加了一个固定的 province=“130000” label。
以下是检查该 label 是否生效的方法:
检查方法
使用 目标Prometheus Web UI 查询,
1.访问 Prometheus 的 Web 界面(通常是http://:9090),我这里是【A主机】
2.执行查询,如果返回了任何时间序列,说明 label 已生效
说明根据该label便可以查询到远程prometheus【B主机】的所有数据
{province="130000"}
3.检查特定指标
如果想检查特定指标是否带上了这个 label,可以查询
例如,远程prometheus的mysql_exporter指标数据,如下:
{job="mysql_exporter", province="130000"}
6. 使用 API 检查
通过 Prometheus API 检查
curl -G "http://10.127.192.101:9090/api/v1/series" --data-urlencode 'match[]={province="130000"}'
7.通过POST测试接口成功
可以看出,通过A主机的label形式可以获取到B主机的数据源
至此,便已实现需求~
三、remote_rewrite 的功能总结
1.时间重写 (time_rewrite)
remote_rewrite 中最常见的应用是 时间重写。
你可以修改时间范围,控制 Prometheus 从远程存储中拉取的数据的时间窗口。这对于需要从长期存储中读取数据时非常有用,特别是在你只对特定时间段的数据感兴趣时。
remote_rewrite:
time_rewrite:
start: "2023-01-01T00:00:00Z"
end: "2023-01-01T23:59:59Z"
这样配置后,所有发送到该远程存储的请求将被重写为查询指定时间段的数据。通常,start 和 end 时间会根据你的需求进行动态调整。
2.查询参数重写 (query_rewrite)
除了时间范围外,remote_rewrite 还可以重写查询的其他参数,例如过滤条件、标签等。这样你可以针对不同的查询需求,对远程存储进行不同的优化和调整。
remote_rewrite:
query_rewrite:
match: 'job="my_job"'
replace: 'job="my_other_job"'
这段配置会将所有发送到远程存储的查询请求中的 job=“my_job” 替换为 job=“my_other_job”。
这种方式通常用于在读取过程中修改查询,以便优化查询的匹配和响应速度。
3.重写自定义标签或元数据
你还可以根据需要重写查询中的标签或元数据。
通过这种方式,可以将请求数据与某些自定义的 Prometheus 标签或元数据进行匹配或调整。
remote_rewrite:
label_rewrite:
match: 'env="prod"'
replace: 'env="staging"'
这个配置会将查询请求中 env=“prod” 的标签替换为 env=“staging”,以便远程存储返回相应标签的数据。
四、典型应用场景
- 查询特定时间段数据
如果你只关心远程存储中的特定时间段数据,可以使用 time_rewrite 来调整查询的时间范围。 - 修改查询条件
通过 query_rewrite,你可以对查询请求中的标签或其他条件进行修改,尤其适用于当 Prometheus 查询的数据格式或标签有所不同时。 - 标签转换
有时,标签命名在不同的 Prometheus 实例或存储系统中会有所不同。通过 label_rewrite,你可以将查询中的标签调整为远程存储能够理解的格式。
五、注意事项
remote_rewrite 是在 Prometheus 从远程存储读取数据时应用的,因此它只影响远程读取操作。
- 在复杂的多层存储架构(如 Thanos、Cortex)中,remote_rewrite 可以优化远程查询的性能,减少不必要的数据返回。
- 使用 remote_rewrite 时需要谨慎,因为它会修改 Prometheus 查询的行为,可能会影响最终的数据一致性和查询结果。
六、总结
remote_rewrite 是 Prometheus 配置中的一个选项,用于调整和优化从远程存储读取数据时的查询行为。
通过重写时间范围、查询条件或标签,可以灵活地定制 Prometheus 的远程读取过程,优化数据的获取和查询效率。这对于集成长期存储后端(如 Thanos、Cortex)时尤为重要。