如何在普罗米修斯的指标中重命名标签

How to rename label within a metric in Prometheus

我有一个问题:

node_systemd_unit_state{instance="server-01",job="node-exporters",name="kubelet.service",state="active"} 1

我希望仅在 node_systemd_unit_state 指标内将标签 name 重命名(或替换)为 unit_name。所以,期望的结果是:

node_systemd_unit_state{instance="server-01",job="node-exporters",unit_name="kubelet.service",state="active"} 1

node-exporters 作业中还有许多其他带有标签名称 name 的指标。这就是为什么我不能在整个工作中使用 relabel 配置。

您可以有多个来源标签,因此:

- source_labels: [__name__, name]
  regex: "node_systemd_unit_state;(.+)"
  target_label: unit_name

如果标签名称与其他 metrics/exporters 不匹配,您应该向他们提交错误。像这样重新标记应该只是一个临时解决方案,同时正在寻求适当的修复。

你可以使用promQL中的label_replace功能,但它也添加了标签,不要替换它

label_replace(
  <vector_expr>, "<desired_label>", "", "<existing_label>", "(.+)"
)

label_replace(
node_systemd_unit_state{instance="server-01",job="node-exporters",name="kubelet.service",state="active"},
"unit_name","","name", "(.+)"
)

因此,为了避免重复,您可以添加:

sum(label_replace(
    node_systemd_unit_state{instance="server-01",job="node-exporters",name="kubelet.service",state="active"},
    "unit_name","","name", "(.+)"
    )
)by(unit_name)

我厌倦了所有支离破碎的文档,我觉得我在 post 中提供了更好的答案: https://medium.com/@texasdave2/replace-and-remove-a-label-in-a-prometheus-query-9500faa302f0

替换不是真正的替换

您的目标是简单地将旧标签名称“old_job_id”替换为新标签名称“new_task_id”。 Prometheus label_replace 将真正“添加”新标签名称。它还会保留旧的标签名称......所以,这可能是个问题,它不是真正的“就地替换”。

所以如果你想“添加”你的新标签名称并“删除”旧标签名称,你需要这样做:

sum without (old_job_id) (label_replace(metric, "new_task_id", "", "old_job_id", "(.*)"))

内容如下:

  • sum without (old_job_id) 将从 查询输出

  • metric 是您的指标,例如“node_filesystem_avail_bytes”

  • “new_task_id”是放置新标签名称的地方

  • “$1”为正则表达式,用于新标签名称中的字符串,不要更改 这个

  • “old_job_id”是您放置旧标签的地方,您想要的标签 摆脱 (.*……。那个烂摊子是正则表达式,它将取代整个 标签名称

Prometheus 允许在以下位置重命名标签:

  • 公制抓取期间。在这种情况下,您需要添加以下 relabeling rules into metric_relabel_configs section at the corresponding scrape_config:
metric_relabel_configs:
- source_labels: [__name__, name]
  regex: "node_systemd_unit_state;(.+)"
  target_label: unit_name
- source_labels: [__name__, name]
  regex: "node_systemd_unit_state;(.+)"
  target_label: name
  replacement: ""

第一条规则将 name 标签值复制到名称为 node_systemd_unit_state 的指标的 unit_name 标签中。第二条规则将名称为 node_systemd_unit_state 的指标的 name 标签值设置为空字符串(例如,删除 name 标签)。

label_join(
  label_join(node_systemd_unit_state, "unit_name", "", "name"),
  "name", "", "non_existing_label"
)

内部label_join()name标签复制到unit_name标签中。外层 label_join() 将原来的 name 标签替换为空字符串(例如删除 name 标签)。

如您所见,label_join() 并不是标签重命名的最佳功能。 label_replace() isn't the best function for label renaming too. While Prometheus doesn't provide better solutions for label renaming, such solution exist in Prometheus-like systems such as VictoriaMetrics. It provides label_move() 函数:

label_move(node_systemd_unit_state, "name", "unit_name")

此外,VictoriaMetrics 为有条件的重新标记规则提供了 if 选项。例如,下面的重新标记规则等同于上面的规则,但更容易理解和维护:

metric_relabel_configs:
- if: 'node_systemd_unit_state{name!=""}'
  source_labels: [name]
  target_label: unit_name
- if: 'node_systemd_unit_state{name!=""}'
  target_label: name
  replacement: ""