如何在普罗米修斯的指标中重命名标签
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(
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: ""
我有一个问题:
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(
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: ""