繁体   English   中英

如何在 Prometheus 的指标中重命名标签

[英]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

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

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

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

您可以在 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)

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

这是这样写的:

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

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

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

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

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

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

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

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

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

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标签值复制到unit_name标签中,用于具有node_systemd_unit_state名称的指标。 对于具有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()也不是标签重命名的最佳功能。 虽然 Prometheus 没有为标签重命名提供更好的解决方案,但此类解决方案存在于类似 Prometheus 的系统中,例如VictoriaMetrics (我是该系统的作者)。 它提供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: ""

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM