如何在PromQL中同时获取delta结果与指标当前值?
实现方法:同时获取增量与当前值
完全可以实现,以下是具体方案:
核心思路
通过Prometheus告警规则的注释模板,结合内置的query函数,在触发告警时同时获取增量(即原PromQL中的$value)和指标的当前值。无需修改原触发条件的核心逻辑,只需在告警描述中添加对当前值的查询逻辑。
具体实现步骤
1. 修改告警规则的注释部分
在你的告警规则中,利用query函数根据告警的标签(比如instance、interfacealias)精准查询对应指标的当前值,然后嵌入到告警描述中。
示例告警规则:
groups: - name: interface_errors_alerts rules: - alert: IfInErrorsIncrementAlert # 原触发条件不变 expr: round(delta(ifInErrors{interfacealias=~"ISP.*|INF.*", datacenter="MyDataCenter"}[1h])) > 0 for: 1m annotations: summary: "接口输入错误计数增加" description: "设备{{ $labels.instance }}的ifInErrors在过去1小时内增加了{{ $value }},当前值已达{{ query \"ifInErrors{instance=\\\"{{ $labels.instance }}\\\", interfacealias=\\\"{{ $labels.interfacealias }}\\\", datacenter=\\\"MyDataCenter\\\"}\" | first | value | round }}" labels: severity: warning
2. 关键细节说明
{{ $value }}:直接引用触发告警的增量值(即原PromQL中round(delta(...))的计算结果)。query函数:根据当前告警的instance、interfacealias等标签,查询对应ifInErrors指标的即时值,通过first | value提取数值,再用round保证格式统一。- 注意转义双引号:在
query的字符串参数中,内部的双引号需要用\"转义,避免模板解析错误。
可选优化方案(减少实时查询开销)
如果担心query函数带来的实时查询性能影响,可以先通过记录规则预先计算并保存当前值,再在告警注释中引用:
第一步:创建记录规则
groups: - name: interface_errors_records rules: - record: ifInErrors:current expr: ifInErrors{interfacealias=~"ISP.*|INF.*", datacenter="MyDataCenter"}
第二步:修改告警注释
将query中的目标改为记录的指标:
description: "设备{{ $labels.instance }}的ifInErrors在过去1小时内增加了{{ $value }},当前值已达{{ query \"ifInErrors:current{instance=\\\"{{ $labels.instance }}\\\", interfacealias=\\\"{{ $labels.interfacealias }}\\\"}\" | first | value | round }}"
这样可以复用预先计算的结果,降低实时查询的资源消耗。
内容的提问来源于stack exchange,提问作者Panem
相关产品推荐
相关产品推荐

