Prometheus AlertManager关联Kubernetes节点标签的查询与模板配置
解决方案
1. 正确关联两个指标的PromQL写法
你之前报错的原因是group_left语法使用错误,它是向量匹配的修饰符,需要放在运算符右侧、匹配规则之后。两个指标通过公共标签node进行关联,正确的查询语句如下:
kube_node_status_condition{condition="Ready", status=~"unknown|false"} == 1 * on(node) group_left() kube_node_labels
规则说明:
* on(node):指定两个指标通过node标签作为匹配键进行值运算,由于两个指标的取值恒为1,运算后不影响条件判断结果group_left():声明多对一匹配模式,将右侧kube_node_labels指标的所有额外标签全部注入到查询结果中,自然包含所有label_前缀的节点自定义标签
修改后的完整告警规则如下:
- alert: InstanceNotReady expr: kube_node_status_condition{condition="Ready", status=~"unknown|false"} == 1 * on(node) group_left() kube_node_labels for: 1m labels: severity: critical annotations: summary: "Kubernetes node {{ $labels.node }} is in NotReady state" description: | Node entered NotReady unresponsive state, node labels: {{ range $k, $v := $labels }} {{ if hasPrefix $k "label_" }}- {{ $k }}: {{ $v }} {{ end }} {{ end }}
2. Slack通知模板修改
如果使用全局AlertManager Slack通知模板,可以在模板中遍历所有label_前缀的标签进行展示,示例模板片段如下:
{{ define "slack.node.notification" }} { "attachments": [ { "title": "节点NotReady告警", "text": "{{ .CommonAnnotations.summary }}", "fields": [ {{ range .Alerts }} { "title": "节点名称", "value": "{{ .Labels.node }}", "short": true }, {{ range .Labels.SortedPairs }} {{ if hasPrefix .Name "label_" }} { "title": "{{ .Name }}", "value": "{{ .Value }}", "short": true }, {{ end }} {{ end }} {{ end }} { "title": "故障描述", "value": "{{ .CommonAnnotations.description }}", "short": false } ], "color": "danger" } ] } {{ end }}
规则说明:
- 用
range .Labels.SortedPairs遍历告警的所有标签 - 用内置函数
hasPrefix .Name "label_"过滤出前缀匹配的节点自定义标签 - 可以通过
short: true配置让标签字段并排展示,优化Slack通知的显示效果
内容的提问来源于stack exchange,提问作者DmitrySemenov
相关产品推荐
相关产品推荐

