PromQL同时获取delta结果与当前值的优化及告警模板访问问题
PromQL优化与告警模板访问别名值方案
一、更优实现方式
你当前用union组合两个查询的方式可行,可从标签一致性和告警规则简洁性两个维度优化:
1. 对齐标签,减少序列歧义
你的sum查询仅保留cluster标签,而delta查询带有environment、instance等大量标签。调整sum的分组标签,让两个序列的核心标签匹配,避免union后序列关联混乱:
union( delta(elasticsearch_cluster_health_number_of_nodes[1m]) < 0, alias( sum(elasticsearch_cluster_health_number_of_nodes[1m]) by(cluster, environment, namespace), "current_state" ) )
2. 告警规则分离查询(推荐)
如果核心需求是告警中附带当前节点数,无需用union合并查询。将告警触发条件保留为原delta查询,在annotations中直接补充当前节点数:
groups: - name: elasticsearch-alerts rules: - alert: ElasticsearchNodeCountDecreased expr: delta(elasticsearch_cluster_health_number_of_nodes[1m]) < 0 for: 1m labels: severity: warning annotations: summary: "集群 {{ $labels.cluster }} 节点数减少" delta: "节点数变化:{{ $value }}" current_nodes: "当前节点数:{{ query \"sum(elasticsearch_cluster_health_number_of_nodes) by(cluster)\" | first | value }}"
这种方式逻辑清晰:告警表达式负责判断触发条件,annotations补充业务上下文,避免查询逻辑混杂。
3. VictoriaMetrics专属优化
如果你使用VictoriaMetrics,可通过vm_label_add将当前节点数作为附加标签关联到delta结果上,避免生成独立序列:
delta(elasticsearch_cluster_health_number_of_nodes[1m]) < 0 | vm_label_add( "current_nodes", "{{ sum(elasticsearch_cluster_health_number_of_nodes) by(cluster) | first | value }}" )
触发告警的序列会直接带上current_nodes标签,模板中可通过{{ $labels.current_nodes }}直接访问。
二、告警模板中访问别名查询的值
用union + alias时,别名会被设为序列的__name__标签。在模板中可遍历$values变量,通过匹配__name__标签提取对应值:
示例模板片段
{{ define "elasticsearch-node-decrease" }} ### 告警详情 - 告警名称:{{ .Alert.Name }} - 集群:{{ .Labels.cluster }} - 节点数变化:{{ range $v := .Values }}{{ if ne $v.Labels.__name__ "current_state" }}{{ $v.Value }}{{ end }}{{ end }} - 当前节点数:{{ range $v := .Values }}{{ if eq $v.Labels.__name__ "current_state" }}{{ $v.Value }}{{ end }}{{ end }} {{ end }}
- 遍历
.Values所有返回序列,用eq $v.Labels.__name__ "current_state"筛选别名对应的序列,提取其值。 - 用
ne排除别名序列,可获取delta的变化值(delta序列的__name__为自动生成的delta_elasticsearch_cluster_health_number_of_nodes)。
注意事项
- 确保
alias设置的名称唯一,避免与其他指标名冲突。 - 多集群场景下,sum查询需保留
cluster等核心标签,确保模板能匹配对应集群的节点数。
内容的提问来源于stack exchange,提问作者Igor Hrcek
相关产品推荐
相关产品推荐

