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

时间:2019-01-17 12:18:32

标签: monitoring prometheus

我有一个查询:

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

我只希望在name度量标准内将标签unit_name重命名(或替换)为node_systemd_unit_state。因此,期望的结果是:

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

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

3 个答案:

答案 0 :(得分:3)

我已经厌倦了所有零散的文档,并且我觉得我在这篇文章中提供了更好的答案: 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", "(.*)"))

这是这样的:

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

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

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

  • “ $ 1”是用于在新标签名称中使用字符串的正则表达式,请勿更改 这个

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

答案 1 :(得分:2)

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

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

如果标签名称与其他指标/出口商不匹配,则应向其提交错误。像这样重新标记只能是在寻求适当解决方案时的临时解决方案。

答案 2 :(得分:0)

您可以在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", "(.+)"
)

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

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)
相关问题