Splunk提取Id、groupId字段后按groupId统计去重Id无结果排障
问题排查与解决方案
1. 正则提取环节错误(概率最高)
你当前使用的rex正则存在匹配不稳定的问题,是查询无结果的最主要原因:
- 原正则中
groupId\W+的泛匹配规则不可靠:你的原始事件中groupId字段的前缀固定为":",使用\W+泛匹配非单词字符在事件格式存在微小波动时就会匹配失败,建议直接写明确的匹配规则 - 冒号的冗余转义可能导致适配问题:Splunk rex语句的正则规则中,冒号不需要额外转义,冗余转义在部分旧版本中会触发匹配异常
- 部分事件可能存在字段顺序颠倒的情况,贪婪匹配
.+可能会出现跨字段匹配失败的问题
修正后的正则如下,你可以先运行以下语句验证字段是否提取成功:
<你的基础查询语句> | rex field=_raw "Id\":\"(?<Id>\d+)\".+groupId\":\"(?<groupId>\w+)" | table _time Id groupId
如果输出结果中Id和groupId列有对应值,说明提取环节已正常。
2. 时间聚合环节异常
如果字段提取正常仍无结果,排查以下两点:
- 确认事件的
_time字段已正确解析:timechart聚合必须依赖标准的_time时间字段,如果你的事件没有被Splunk正确识别时间戳,会直接导致聚合无结果 partial=f参数会丢弃不完整周期:如果你查询的时间范围不是10分钟的整数倍,最后一个未结束的10分钟周期会被直接丢弃,若查询时间范围短于10分钟会直接无输出,可先去掉该参数测试
最终可运行的查询语句
<你的基础查询语句> | rex field=_raw "Id\":\"(?<Id>\d+)\".+groupId\":\"(?<groupId>\w+)" | where isnotnull(Id) AND isnotnull(groupId) | timechart span=10m dc(Id) by groupId
内容的提问来源于stack exchange,提问作者Tobitor
相关产品推荐
相关产品推荐

