Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prometheus Relabel 重写标签 #341

Open
Bpazy opened this issue Nov 28, 2024 · 1 comment
Open

Prometheus Relabel 重写标签 #341

Bpazy opened this issue Nov 28, 2024 · 1 comment

Comments

@Bpazy
Copy link
Owner

Bpazy commented Nov 28, 2024

好文推荐: https://sheldon-lu.github.io/sheldon_Gitbook/sd/service-discovery-with-relabel.html

我这里直接给一下 Prometheus 官方文档的翻译和使用示例:

Prometheus relabeling(标签重写)允许对抓取到的指标进行调整,根据配置可以更改、添加、删除标签等操作。下面是 relabeling 配置的参数说明:

翻译

# 源标签选择现有标签的值。它们的内容使用配置的分隔符连接
# 并根据配置的正则表达式匹配来进行替换、保留和删除操作。
[ source_labels: '[' <labelname> [, ...] ']' ]

# 在连接的源标签值之间放置的分隔符。
[ separator: <string> | 默认 = ; ]

# 替换动作中结果值写入的标签。
# 对于替换动作,这是必需的。正则表达式中的捕获组可用。
[ target_label: <labelname> ]

# 抽取的值与之匹配的正则表达式。
[ regex: <regex> | 默认 = (.*) ]

# 取源标签值的哈希的模数。
[ modulus: <uint64> ]

# 如果正则表达式匹配,则执行的正则替换的替换值。
# 正则表达式的捕获组可用。
[ replacement: <string> | 默认 = $1 ]

# 基于正则匹配执行的动作。
[ action: <relabel_action> | 默认 = replace ]

举个栗子

假设我们有一个指标,它含有多个标签,我们想基于某些标签的值对其进行过滤,然后更改或添加一个新的标签。以下是一个 relabel 配置的例子:

目标:

如果 instance 标签的值为 localhost:9090,我们想要添加或更新一个标签 environment,其值设置为 development
relabel 配置:

- source_labels: [instance]
  regex: 'localhost:9090'
  target_label: environment
  replacement: 'development'
  action: replace

解释:

  • source_labels: 我们从指标中选择 instance 标签作为数据源。
  • regex: 我们使用正则表达式 localhost:9090 来匹配 instance 标签的值。
  • target_label: 我们指定目标标签为 environment
  • replacement: 如果匹配成功,我们将 environment 标签的值设置为 development
  • action: 我们选择的动作是替换(replace),因为我们想要基于 instance 标签的值来更改或添加 environment 标签。
@Bpazy
Copy link
Owner Author

Bpazy commented Nov 28, 2024

用一个复杂的例子理解 relabel

mysqld exporter 支持 1 个 exporter 实例监控多个 MySQL 实例,就是利用了 relabel 能力。

prometheus 配置如下:

# 省略了其他部分
- job_name: mysql
  scrape_interval: 30s
  params:
    auth_module: [client.servers]
  static_configs:
    - targets:
      - 192.168.31.31:3306
  relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: mysqld-exporter:9104

理解 __param_target 参数

让我们一步步分析相关的配置,以理解 __param_target 参数的含义:

  1. 第一个 relabel_configs 规则:
  • source_labels: [__address__]
  • target_label: __param_target
  • 这条规则的作用是将当前 target 的地址(比如:192.168.31.31:3306,即 MySQL 服务器的地址)保存到 __param_target 参数中。这里的 __address__ 是由 Prometheus 自动填充的,表示刮取目标的 address。
  1. 第二个 relabel_configs 规则:
  • source_labels: [__param_target]
  • target_label: instance
  • 这条规则将刚才保存在 __param_target 中的 MySQL 地址标记为 instance 标签。目的是在 Prometheus 的 UI 中更清晰地展示每个 target。
  1. 第三个 relabel_configs 规则:
  • target_label: __address__
  • replacement: mysqld-exporter:9104
  • 这条规则将目标地址(__address__)更改为 mysqld-exporter 服务的地址和端口。意味着 Prometheus 将不会直接刮取 MySQL 服务器,而是去刮取 mysqld-exporter 的 /metrics 端点来收集 MySQL 相关的指标数据。这是因为 mysqld_exporter 是作为代理存在的,它会连接 MySQL,收集指标,然后提供给 Prometheus。

总结关于 __param_target 的理解:

在这个配置中,__param_target 是一个中间步骤,用于将实际的 MySQL 服务器地址传递给 mysqld-exporter。通过这种方式,即使 exporter 位于不同的机器或不直接访问 MySQL 服务器,我们也可以灵活地配置和收集特定 MySQL 实例的指标。通过在 scrape 的 URL query 参数中传递 target(这里通过改写 __param_target 实现),mysqld_exporter 就能了解它需要从哪个 MySQL 实例收集指标数据。

那 192.168.31.31:3306 这个参数是如何传递给 exporter 的?

这里详细解析这个过程是如何工作的:

首先,配置中的 static_configs 部分定义了 MySQL 服务器的地址 (192.168.31.31:3306) 作为抓取目标 (target)。

接着,relabel_configs 的第一条规则将 __address__(即 MySQL 服务器的地址和端口 192.168.31.31:3306)复制到一个临时标签 __param_target 中。这个过程并不改变 __address__ 的实际值,而是仅仅创建了一个参数的副本。

- source_labels: [__address__]
  target_label: __param_target

接下来,relabel_configs 的第二条规则可能会给人一点迷惑,但其实它是为了在 Prometheus 的 UI展示或是为了数据的聚合考虑,将那个包含 MySQL 地址的 __param_target 值设置为目标实例的名称(instance 标签)。

- source_labels: [__param_target]
  target_label: instance

最后,第三条 relabel_configs 规则通过将 __address__ 改写为 mysqld_exporter 的地址和端口号 (mysqld-exporter:9104),使 Prometheus 去请求 mysqld_exporter 服务而不是 MySQL 服务本身。这里的核心在于,当 Prometheus 向 mysqld_exporter 发起 HTTP 请求抓取指标数据时,它会将那个 __param_target 参数包含在请求的查询字符串中。这样,mysqld_exporter 就知道了应该从哪个 MySQL 地址收集指标。

- target_label: __address__
  replacement: mysqld-exporter:9104

至此,通过 Prometheus 对 mysqld_exporter 的请求中包含 target 参数(例如 http://mysqld-exporter:9104/?target=192.168.31.31:3306),mysqld_exporter 接收到这个地址后,知道它需要连接到哪个 MySQL 实例去采集指标数据。这个流程允许 mysqld_exporter 动态地监控不同的 MySQL 实例而不需要为每个 MySQL 实例单独配置 exporter,极大地提高了 Prometheus 在监控 MySQL 数据库方面的灵活性和扩展性。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant