如何在 Prometheus 中的度量中重命名标签

Kon*_*tin 15 monitoring prometheus

我有一个疑问:

node_systemd_unit_state{instance="server-01",job="node-exporters",name="kubelet.service",state="active"} 1
Run Code Online (Sandbox Code Playgroud)

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

node_systemd_unit_state{instance="server-01",job="node-exporters",unit_name="kubelet.service",state="active"} 1
Run Code Online (Sandbox Code Playgroud)

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

小智 23

可以在promQL中使用label_replace函数,但它也添加标签,不要替换

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

label_replace(
node_systemd_unit_state{instance="server-01",job="node-exporters",name="kubelet.service",state="active"},
"unit_name","$1","name", "(.+)"
)
Run Code Online (Sandbox Code Playgroud)

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

sum(label_replace(
    node_systemd_unit_state{instance="server-01",job="node-exporters",name="kubelet.service",state="active"},
    "unit_name","$1","name", "(.+)"
    )
)by(unit_name)
Run Code Online (Sandbox Code Playgroud)

  • 这是不做任何配置更改的方法! (3认同)

tex*_*ave 6

我厌倦了所有零散的文档,我觉得我在这篇文章中提供了更好的答案: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", "$1", "old_job_id", "(.*)"))
Run Code Online (Sandbox Code Playgroud)

这是如何读取的:

  • sum without (old_job_id) 将从查询输出中删除旧标签名称

  • metric 是你的指标,比如“node_filesystem_avail_bytes”

  • “new_task_id”是您放置新标签名称的位置

  • “$1”是在新标签名称中使用字符串的正则表达式,不要更改它

  • “old_job_id”是你放置旧标签的地方,你想要摆脱的那个 (.*…….那个混乱是正则表达式,它将替换整个标签名称


bri*_*zil 5

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

- source_labels: [__name__, name]
  regex: "node_systemd_unit_state;(.+)"
  target_label: unit_name
Run Code Online (Sandbox Code Playgroud)

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