Loki的LogQL查询nginx日志时sum和avg返回结果一致是什么原因?
问题核心原因
1. unwrap的字段被过滤后所有值完全相同
你已经在LogQL管道中添加了| status=200的过滤条件,所有参与后续计算的日志行的status值都是200。后续unwrap status拿到的所有样本值全为200,此时avg_over_time计算指定时间窗口内的平均值,结果必然固定为200,和窗口内的日志数量没有任何关系。
2. sum和avg返回结果一致的原因
当你按upstream分组聚合时:
- 你的场景中每个
upstream对应的唯一日志流(由$label_name、job、instance、upstream这些标签共同确定)只有1个,sum(单个200)和avg(单个200)的结果都是200,所以二者返回值完全相同。 - 你所说的“返回了值的总和”是对指标含义的误解:当前语句的返回值完全不能代表200请求的数量,仅和
upstream对应的流数量有关。
3. 语句不符合统计200请求量的需求
如果你是要统计每个upstream的200状态码请求数/请求速率,应该用count_over_time统计时间窗口内的日志行数,不需要unwrap status字段,正确写法参考:
sum(count_over_time({$label_name=~"$label_value", job=~"$job", instance=~"$instance"} | json | status=200 | __error__="" [$__interval])) by (upstream)
只有当你需要统计数值类型字段(如请求延迟、响应大小)的聚合值时,才需要用unwrap取出对应字段做计算。
内容的提问来源于stack exchange,提问作者Abadis
相关产品推荐
相关产品推荐

