Prometheus利用remote_rewrite实现对远程数据源的抓取并进行重写转换

一、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。

常见问题补充

如果仍失败,检查以下内容:

  1. Prometheus 版本是否支持–web.enable-remote-write-receiver
    **需要 Prometheus v2.10+。
  • 查看版本:
prometheus --version
  1. 防火墙/网络策略
  • 确保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”,以便远程存储返回相应标签的数据。

四、典型应用场景

  1. 查询特定时间段数据
    如果你只关心远程存储中的特定时间段数据,可以使用 time_rewrite 来调整查询的时间范围。
  2. 修改查询条件
    通过 query_rewrite,你可以对查询请求中的标签或其他条件进行修改,尤其适用于当 Prometheus 查询的数据格式或标签有所不同时。
  3. 标签转换
    有时,标签命名在不同的 Prometheus 实例或存储系统中会有所不同。通过 label_rewrite,你可以将查询中的标签调整为远程存储能够理解的格式。

五、注意事项

remote_rewrite 是在 Prometheus 从远程存储读取数据时应用的,因此它只影响远程读取操作。

  • 在复杂的多层存储架构(如 Thanos、Cortex)中,remote_rewrite 可以优化远程查询的性能,减少不必要的数据返回。
  • 使用 remote_rewrite 时需要谨慎,因为它会修改 Prometheus 查询的行为,可能会影响最终的数据一致性和查询结果。

六、总结

remote_rewrite 是 Prometheus 配置中的一个选项,用于调整和优化从远程存储读取数据时的查询行为。
通过重写时间范围、查询条件或标签,可以灵活地定制 Prometheus 的远程读取过程,优化数据的获取和查询效率。这对于集成长期存储后端(如 Thanos、Cortex)时尤为重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听说唐僧不吃肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值