如何在LogQL中提取含逗号的数值并转为数字类型?
解决Loki中提取带逗号的EF日志耗时并转为数字类型的问题
问题场景
.NET Entity Framework输出的日志中,当数据库查询耗时≥1000毫秒时,数值会包含逗号分隔符,示例日志如下:
2024-08-11T04:10:49.92983505Z stdout F Executed DbCommand
(3,768ms) [Parameters=[@__param_0='?' (DbType = Object), @__param_2='?' (DbType = Object), @__param_3='?' (DbType = Object),
@__param_4='?' (DbType = Object)], CommandType='Text',
CommandTimeout='30']
使用以下正则提取耗时后,尝试用query_ms > 30s筛选时,带逗号的日志行会出现标签格式错误:
{container="my-container"} |= `Executed DbCommand` | regexp `\((?P<query_ms>[0-9]+\,?[0-9]*ms)\)`
即使尝试捕获不含ms的数值,筛选大于30000的结果,仍会遇到相同问题。
解决方案
需要先清理数值中的逗号,再将字符串转为数字类型,才能进行数值比较。完整查询语句如下:
{container="my-container"} |= `Executed DbCommand` | regexp `\((?P<query_ms_str>[0-9]+(?:\,?[0-9]+)?)ms\)` | replace query_ms_str "," "" | to_number query_ms_str as query_ms | query_ms > 30000
步骤说明
- 正则捕获:通过
regexp捕获括号内的数值部分(如3,768),命名为query_ms_str,不包含单位ms - 清理逗号:使用
replace将query_ms_str中的逗号替换为空字符串,得到纯数字字符串(如3768) - 转数字类型:用
to_number将处理后的字符串转为数字类型,命名为query_ms - 数值筛选:直接使用数字类型的
query_ms进行筛选,30000对应30秒
内容的提问来源于stack exchange,提问作者Eddie Deyo
相关产品推荐
相关产品推荐

