如何在Grafana中基于所有日志代码生成占比饼图
日志代码占比饼图实现方案
问题定位
你当前的查询语句问题出在rate的使用场景上——rate是计算时间序列的每秒增长率,而你需要的是代码出现的总次数占比,用rate会把次数按时间间隔平均,导致统计值偏离实际计数。
正确查询语句(Loki LogQL)
根据你的需求,以下两种方式可以实现动态统计所有代码的出现占比,无需硬编码:
方式1:短时间范围统计(直接计数)
sum by(code) (count_over_time({filename=~"$Filename"} | json code="Properties.Code" | __error__="" [$__range]))
count_over_time:统计面板所选时间区间($__range)内每条日志流的出现次数sum by(code):按code维度聚合所有日志流的计数- 在Grafana饼图面板中选择**“Percent”**展示模式,即可自动计算各代码的占比
方式2:长时间范围统计(性能优化)
如果时间范围过长,直接用count_over_time可能性能不佳,可通过速率转总次数的方式实现:
sum by(code) (rate({filename=~"$Filename"} | json code="Properties.Code" | __error__="" [$__interval])) * $__interval_seconds
rate(...):计算每秒的日志出现速率* $__interval_seconds:将每秒速率转换为当前时间间隔内的总次数- 同样在饼图面板中选择占比展示模式即可
额外优化点
- 过滤无效日志:确保
__error__=""确实过滤了解析失败的日志,避免统计到错误的code值 - 排除空值分类:如果存在
code为空的情况,添加| code != ""过滤,避免饼图出现无意义的空值项:sum by(code) (count_over_time({filename=~"$Filename"} | json code="Properties.Code" | __error__="" | code != "" [$__range])) - 动态适配新增代码:以上语句会自动识别所有出现过的
code,新增代码无需修改查询语句,会自动出现在饼图中
内容的提问来源于stack exchange,提问作者Etienne
相关产品推荐
相关产品推荐

