编写PromQL查询对比多区域部署的服务版本差异
检测跨区域服务版本不一致的PromQL查询方案
问题背景
服务通过Micrometer暴露Git哈希作为版本标识,对应的指标为PACKAGE_VERSION_total,示例如下:
PACKAGE_VERSION_total{revision="b6d9de0"}, 0
该指标包含两个核心标签:
revision:存储Git哈希值,标识服务版本region:存储服务部署的区域,如eu-west-2
我们需要编写PromQL查询,用于告警同一服务在不同区域运行不同版本的情况(部署期间的版本差异已由告警工具自动忽略)。同时需要纠正一个错误的查询思路:尝试通过对比各区域revision标签、检测版本差异是否超过1的写法是不可行的,错误示例如下:
sum by (revision) (PACKAGE_VERSION_total) by (region) > 1
错误示例分析
上述错误查询存在两个核心问题:
- 语法错误:PromQL不支持连续使用两个
by子句,该查询无法被Prometheus解析 - 逻辑偏差:查询试图先按
revision聚合求和,再按region二次聚合,完全未触及“跨区域版本不一致”的检测目标,无法识别不同区域的版本差异
正确的PromQL查询方案
要准确检测同一服务在不同区域的版本差异,可以使用以下查询:
count by (job) (distinct(revision) by (job, region)) > 1
查询逻辑说明
distinct(revision) by (job, region):按服务(job)和区域(region)维度,提取每个区域对应的唯一版本号(假设同一区域内服务版本一致)count by (job):按服务维度,统计不同区域对应的版本数量> 1:当版本数量超过1时,说明该服务在不同区域运行了不同版本,触发告警
如果需要更严谨的统计(考虑同一区域内可能存在多实例但版本一致的情况),也可以使用以下等价查询:
count by (job) (count by (job, region, revision) (PACKAGE_VERSION_total)) > 1
内容的提问来源于stack exchange,提问作者Kaigo
相关产品推荐
相关产品推荐

