Loki日志查询报错:求AuthFilterTime平均值语法错误求助
Loki查询AuthFilterTime平均值报错排查
问题背景
我的Loki中有如下日志信息:
2023-02-13 12:20:08.675 INFO 30937 --- [lettuce-epollEventLoop-5-1] c.g.poc.Filter.AuthenticationFilter : [ requestId : 904c1292-66, AuthFilterTime : 15 ms ] 2023-02-13 12:16:32.100 INFO 30937 --- [lettuce-epollEventLoop-5-1] c.g.poc.Filter.AuthenticationFilter : [ requestId : f84a572f-65, AuthFilterTime : 4 ms ] 2023-02-13 12:16:31.427 INFO 30937 --- [lettuce-epollEventLoop-5-1] c.g.poc.Filter.AuthenticationFilter : [ requestId : 904c1292-64, AuthFilterTime : 10 ms ]
想要获取AuthFilterTime的平均值,但执行以下查询语句时出现报错:
"parse error at line 5, col 6: syntax error: unexpected NUMBER"
原查询语句:
sum by (filename)( avg_over_time( {filename="/path/to/the/log/file"} |= "AuthFilterTime.*ms" | regexp `AuthFilterTime\s*:\s*(\d+) ms` | $1 )[24h] )
错误原因
- 语法不符合LogQL规范:直接使用
$1引用正则捕获组是错误的,Loki需要通过line_format指令将捕获的内容输出为新的日志行,而非直接引用分组变量。 - 未转换数值类型:正则提取出的数字是字符串格式,
avg_over_time仅支持处理数值流,必须显式转换为数值类型才能进行计算。 - 聚合逻辑不合理:
sum by (filename)包裹avg_over_time的逻辑不符合需求,通常需要先计算时间窗口内的平均值,再按维度聚合(或直接计算整体平均值)。
正确查询语句
场景1:计算过去24小时内所有AuthFilterTime的平均值
avg_over_time( {filename="/path/to/the/log/file"} |= "AuthFilterTime" | regexp `AuthFilterTime\s*:\s*(\d+) ms` | line_format "{{.1}}" | to_number )[24h:]
场景2:按filename聚合(多日志文件场景)
avg by (filename) ( avg_over_time( {filename="/path/to/the/log/file"} |= "AuthFilterTime" | regexp `AuthFilterTime\s*:\s*(\d+) ms` | line_format "{{.1}}" | to_number )[24h:] )
语句说明
| regexpAuthFilterTime\s*:\s*(\d+) ms``:匹配日志中的AuthFilterTime字段,精准捕获时间数字部分| line_format "{{.1}}":将正则捕获的第一个分组(目标数字)作为新的日志内容输出| to_number:将字符串格式的数字转换为数值类型,让avg_over_time可以执行数值计算avg_over_time(...)[24h:]:计算过去24小时内所有数值的平均值,:表示将时间窗口对齐到当前时间
内容的提问来源于stack exchange,提问作者Tushar Rawat
相关产品推荐
相关产品推荐

