能否在Loki/Grafana中对日志行内数值进行求和?
如何用Loki/Grafana对日志内的指定数值求和?
问题背景
现有日志行如下:
01/02/2022 - my log line - arbitrary number: 40 02/02/2022 - another log line - arbitrary number: 60
需要在Grafana或Loki中将日志里的arbitrary number对应的数值求和得到结果100。实际场景中存在多标签,每个标签对应数千条日志,需制作仪表盘展示每个标签下该类数值的总和。查阅Loki文档后产生疑问:Loki/Grafana是否仅能处理日志流元数据,无法操作日志内的具体数值?
解决方案
当然可以操作日志内的具体数值并求和,Loki的LogQL支持解析日志内容提取字段,再结合聚合函数实现需求,步骤如下:
过滤目标日志流:先通过标签或日志内容过滤出包含
arbitrary number的日志,示例:{job="your-job-label"} |= "arbitrary number:"替换
your-job-label为实际的日志流标签。提取数值字段:用正则表达式解析日志中的数值,通过命名捕获组提取目标数字:
{job="your-job-label"} |= "arbitrary number:" | regexp `arbitrary number: (?P<num>\d+)`按标签分组求和:将提取的字符串数值转为数值类型后,按指定标签聚合求和:
sum by (your-target-label) ( avg_over_time( {job="your-job-label"} |= "arbitrary number:" | regexp `arbitrary number: (?P<num>\d+)` | unwrap num [1m] ) )unwrap num:将提取的字符串类型数值转为数值类型avg_over_time:单条日志对应单个数值,用平均值保留每条日志的数值(也可替换为sum_over_time,效果一致)sum by (your-target-label):按业务需要的标签分组求和,替换为实际标签名即可
如果无需分组,直接简化为:
sum( avg_over_time( {job="your-job-label"} |= "arbitrary number:" | regexp `arbitrary number: (?P<num>\d+)` | unwrap num [1m] ) )
Loki不仅能处理日志流元数据,还支持对日志内容做解析、字段提取,并基于这些字段完成聚合计算,完全满足制作仪表盘展示各标签下数值总和的需求。
内容的提问来源于stack exchange,提问作者solarflare
相关产品推荐
相关产品推荐

