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: ""