基于正则的LOKI查询中能否使用提取的推断值做分组统计?
核心问题解答
可以使用通过提取得到的推断值。只要通过解析算子(比如regexp、logfmt、json等)从日志行中提取为标签后,不管原始日志是否显式包含这些字段,都可以直接用于过滤、分组、统计操作。
之前查询的错误原因
- 聚合算子用法错误:
count、sum这类聚合算子必须作用于范围向量,直接传入日志查询的即时向量不符合语法要求。 - 过滤条件写法错误:标签过滤需要放在管道流程中,不能直接写在聚合的参数里。
- 缺少分组维度:你需要的是
msg_id+type两个维度的组合计数,之前的查询只按msg_id分组,无法满足统计要求。
正确查询语句
统计过去10分钟内,每个msg_id和type组合的出现次数,直接使用如下LogQL即可:
sum by (msg_id, type) ( count_over_time( {build="runtimeidentifier"} |= "Trace_MSG_" | regexp "(?P<type>(CR|IN)): (?P<msg_id>[a-z0-9.-]{36})" [10m] ) )
如果需要单独统计某类type的计数,比如只统计CR类型的数量,增加过滤条件即可:
sum by (msg_id) ( count_over_time( {build="runtimeidentifier"} |= "Trace_MSG_" | regexp "(?P<type>(CR|IN)): (?P<msg_id>[a-z0-9.-]{36})" | type == "CR" [10m] ) )
查询逻辑说明
- 内层先通过日志选择器和关键字过滤缩小查询范围,再通过regexp提取出
type和msg_id两个自定义标签 - 用
[10m]将即时日志向量转换为10分钟跨度的范围向量,满足聚合算子的参数要求 count_over_time会统计每个唯一标签组合在时间范围内的日志行数- 外层
sum by (msg_id, type)会忽略其他无关标签的干扰,仅按你需要的两个维度聚合计数,返回的结果完全匹配预期格式。
内容的提问来源于stack exchange,提问作者STK
相关产品推荐
相关产品推荐

