Grafana Slack告警模板动态显示指标值失败求助
Grafana v10.3.1 通用Slack告警指标值提取解决方案
问题核心
你当前的困境是:只能在告警规则的Annotations.Description中硬编码{{ humanize $values.B.Value }}%来显示指标值,但想做一个通用的Current Value注解/模板,让所有告警复用、无需逐个配置变量名,尝试后一直失败。
从你的Payload分析关键数据
从你提供的告警Payload能看到,每个告警都自带两个关键字段,可用于动态提取指标值:
__values__:结构化的JSON字符串,存储所有告警变量的键值对(比如{"B":25.516..., "C":1})__value_string__:字符串格式的变量列表,可作为备选,但结构化的__values__更易处理
两种通用解决方案
方案1:在告警规则中配置通用currentValue注解
直接在告警规则的Annotations里添加currentValue,用动态模板替代硬编码的变量名:
{{- $keys := keys $values -}} {{- $targetVal := index $values (index $keys 0) -}} {{- humanize $targetVal.Value }}%
- 逻辑:先获取所有告警变量的键名列表,取第一个键对应的数值,用
humanize格式化后加百分号 - 优势:一次配置到告警规则模板(如果用告警规则组的话),所有同组告警自动复用
方案2:在Slack模板中直接动态解析(无需修改告警规则)
如果不想改动告警规则,直接在Slack模板的slack.text部分替换原来的currentValue判断块,添加动态处理逻辑:
{{ if .Annotations.__values__ }} {{- $valuesObj := parseJson .Annotations.__values__ -}} {{- $firstKey := index (keys $valuesObj) 0 -}} {{- $formattedVal := humanize (index $valuesObj $firstKey) -}} *Current Value:* `{{ $formattedVal }}%` {{ end }}
- 逻辑:解析
__values__为JSON对象,取第一个键对应的数值,格式化后显示 - 优势:无需修改任何告警规则,直接在Slack全局模板中生效
为什么之前的通用尝试失败?
你之前的问题大概率是硬编码了变量名(比如$values.B.Value),但不同告警的变量名可能不同(比如有的是A、B,有的是metric),而通用方案的核心是动态遍历/获取变量,而非指定固定变量名。
额外优化(针对多变量场景)
如果告警存在多个变量(比如Payload里的B和C),需要过滤无效值(比如状态值1),可以在模板中加判断逻辑:
{{- $keys := keys $values -}} {{- range $key := $keys -}} {{- $val := index $values $key -}} {{- if gt $val.Value 1 -}} {{/* 过滤数值小于等于1的状态变量 */}} {{- humanize $val.Value }}% {{- end -}} {{- end -}}
内容的提问来源于stack exchange,提问作者rei
相关产品推荐
相关产品推荐

