如何在Grafana中累加两个不同Counter指标的数值?
问题描述
我拥有两个Counter指标(假设为c1和c2),希望在Grafana面板中展示两者的总和c1+c2。当执行c1+c1时面板能正确显示数值,但执行c1+c2时返回null值。
可正常运行的查询语句
sum by (level1,level2,level3) ( sum_over_time( sponsored_products_service_counter_total{ cloud_zone=~"$cluster_id", job="$app", namespace="$namespace", container="$container", pod=~"$pod" }[$__interval] ) ) + sum by (level1,level2,level3) ( sum_over_time( sponsored_products_service_counter_total{ cloud_zone=~"$cluster_id", job="$app", namespace="$namespace", container="$container", pod=~"$pod" }[$__interval] ) )
返回null值的查询语句
sum by (level1,level2,level3) ( sum_over_time( sponsored_products_service_counter_total{ cloud_zone=~"$cluster_id", job="$app", namespace="$namespace", container="$container", pod=~"$pod" }[$__interval] ) ) + sum by (level1,level2,level3) ( sum_over_time( display_ads_service_counter_total{ cloud_zone=~"$cluster_id", job="$app", namespace="$namespace", container="$container", pod=~"$pod" }[$__interval] ) )
单独查询结果
sponsored_products_service_counter_total查询结果

display_ads_service_counter_total查询结果

问题原因与解决方案
原因
Prometheus中,两个时间序列相加要求两边的标签集合完全匹配。如果sponsored_products_service_counter_total和display_ads_service_counter_total经过sum by(level1,level2,level3)聚合后,存在某组level1/level2/level3标签只在其中一个指标中存在,相加时这组标签对应的结果就会返回null,最终导致面板显示异常。
而c1+c1能正常运行,是因为两边的标签集合完全一致,所有标签组合都能匹配相加。
解决方案
方案1:放弃维度聚合(简单直接)
如果不需要保留level1/level2/level3维度,直接用sum()聚合所有标签,这样两边都生成单时间序列,即可正常相加:
sum( sum_over_time( sponsored_products_service_counter_total{ cloud_zone=~"$cluster_id", job="$app", namespace="$namespace", container="$container", pod=~"$pod" }[$__interval] ) ) + sum( sum_over_time( display_ads_service_counter_total{ cloud_zone=~"$cluster_id", job="$app", namespace="$namespace", container="$container", pod=~"$pod" }[$__interval] ) )
方案2:补全缺失标签的0值(保留维度)
如果需要保留level1/level2/level3维度,对每个聚合后的结果添加or vector(0),这样缺失标签组合的指标会用0填充,确保所有标签组合都能匹配相加:
(sum by (level1,level2,level3) ( sum_over_time( sponsored_products_service_counter_total{ cloud_zone=~"$cluster_id", job="$app", namespace="$namespace", container="$container", pod=~"$pod" }[$__interval] ) ) or vector(0)) + (sum by (level1,level2,level3) ( sum_over_time( display_ads_service_counter_total{ cloud_zone=~"$cluster_id", job="$app", namespace="$namespace", container="$container", pod=~"$pod" }[$__interval] ) ) or vector(0))
方案3:检查并统一标签组合
查看两个指标的level1/level2/level3标签值,确认是否存在不一致的情况。如果是业务上的标签缺失,需要从指标采集端修正,确保两个指标的标签维度一致。
内容的提问来源于stack exchange,提问作者Kishor Prasad
相关产品推荐
相关产品推荐

