如何使用MQL计算Google Cloud Monitoring两个指标的差值与比率
Google Cloud Monitoring MQL 双指标差值与比率计算方案
需求说明
- 计算两个时间序列的差值,用于追踪已启动与已完成的进程数量差异
- 计算两个时间序列的比率,支持优雅处理分母为null的场景
原代码异常原因
原MQL返回结果始终为0的核心原因是:Micrometer的Spring Boot实现在两个指标中生成的标签存在差异,普通join操作无返回结果,outer_join仅返回第二个时间序列,导致运算异常。
解决方案
1. 标签对齐处理
在每个子查询末尾使用map drop[]删除不匹配的标签,也可以使用map keep[]仅保留需要的维度标签,必须保证两个子查询输出的时间序列标签完全一致才能正常执行join操作。
2. 差值计算MQL示例
fetch global | { t_started: metric 'custom.googleapis.com/http/server/requests/count' | filter (metric.service == 'service-a' && metric.uri =~ '/api/started') | align next_older(1m) | map drop[label1, label2] # 替换为实际需要删除的不匹配标签 | group_by [], sum(val()) # 全量聚合时可添加,聚合后无冗余标签 ; t_completed: metric 'custom.googleapis.com/http/server/requests/count' | filter (metric.service == 'service-a' && metric.uri =~ '/api/completed') | align next_older(1m) | map drop[label1, label2] # 和上方删除的标签列表保持一致 | group_by [], sum(val()) } | outer_join 0 | value t_started - t_completed # 计算进行中进程数量
3. 比率计算MQL示例(兼容空/零值分母)
fetch global | { t_started: metric 'custom.googleapis.com/http/server/requests/count' | filter (metric.service == 'service-a' && metric.uri =~ '/api/started') | align next_older(1m) | map drop[label1, label2] | group_by [], sum(val()) ; t_completed: metric 'custom.googleapis.com/http/server/requests/count' | filter (metric.service == 'service-a' && metric.uri =~ '/api/completed') | align next_older(1m) | map drop[label1, label2] | group_by [], sum(val()) } | outer_join 0 # 分母为0时直接返回0,可根据业务需要调整默认返回值 | value if(t_started == 0, 0, t_completed / t_started)
补充说明
outer_join 0会将不存在的序列值用0填充,避免Null值导致运算失败- 如果需要保留特定维度做分组统计,可以调整
group_by的参数,仅删除不需要的差异化标签即可
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

