我的目的是添加当alertmanager通过警报媒介发出警报时要在描述或摘要中显示的查询表达式。 可能是下面这样的吗?
- alert: OutOfDiskSpace
expr: node_filesystem_free_bytes / node_filesystem_size_bytes * 100 < 10
for: 1m
labels:
severity: Critical
annotations:
description: "Disk is almost full. The expr query is {{ $labels.expr }}"
我认为您正在寻找的是
$value
它将显示表达式计算的值。例如,考虑以下规则
- alert: service_down
expr: (probe_http_status_code - 0) != 200
for: 1m
labels:
severity: 3
threshold: danger
annotations:
summary: "HTTP : {{ $value }} for URL *{{ $labels.instance }}*."
description: "*{{ $labels.instance }}* of job *{{ $labels.job }}* is down"
在摘要中,您将获得已关闭的 API 的状态代码。
在您的情况下,以下内容应该有效
- alert: OutOfDiskSpace
expr: node_filesystem_free_bytes / node_filesystem_size_bytes * 100 < 10
for: 1m
labels:
severity: Critical
annotations:
description: "Disk is almost full. The expr query is $value"
Prometheus 模板语言基于 Go 模板 系统。
您可以利用这一点将 Prometheus 查询结果放入注释模板中。例如,在
alert.rules.yml
文件中,您可以在 annotations.summary
字段上使用以下内容:
-
alert: TestAlert
expr: go_info == 1
for: 5s
labels:
severity: warning
annotations:
summary: "go_info value: {{ printf `go_info{instance=\"%s\"}` $labels.instance | query | first | value }}"
description: "value: {{ $value }}"
警报时,这将执行
go_info
的 promQL 查询(在本例中)格式为 metric{instance=[alerted instance]}
,它返回一个元组,您可以使用如上所示的处理管道过滤到值。
来源:普罗米修斯文档
由于您明确要求在警报管理器通知中显示表达式,例如通过 slack,我可以向您提供以下解决方法。我将使用 Alertmanager 文档
的概念Alertmanager 移交给通知模板的数据包含每个组的警报数组,该数组包含该组中所有警报对象的列表。由于我按
alertname
进行分组,并且我的警报名称(如果您有基于警报名称的适当抑制规则,也可以工作)是唯一的,该组中的所有警报对象都将具有相同的 GeneratorURL
,其中包含表达式,但解析为 URL 字符串。由于我没有找到反函数urlquery
(请参阅Go模板化默认函数),我使用以下自制的部分反函数作为模板:
{{ (index .Alerts 0).GeneratorURL | reReplaceAll ".*expr=" "" | reReplaceAll "&g0.*" "" | reReplaceAll "%7B" "{" | reReplaceAll "%3D" "=" | reReplaceAll "%3E" ">" | reReplaceAll "%3C" "<" | reReplaceAll "%22" "\"" | reReplaceAll "%2C" "," | reReplaceAll "%21" "!" | reReplaceAll "%7D" "}" | reReplaceAll "\\+" " " | reReplaceAll "%2A" "*" | reReplaceAll "%2F" "/" | reReplaceAll "%28" "(" | reReplaceAll "%29" ")" | reReplaceAll "%5E" "^" | reReplaceAll "%5B" "[" | reReplaceAll "%5D" "]" }}
这将打印出表达式。如果您在表达式中使用其他符号(将由
urlquery
转换),您可能需要添加一些替换步骤。