如何编写Splunk查询识别近90天无活动当日活跃的国家
Splunk 90天沉寂后当日活跃国家识别查询实现方案
核心实现逻辑
整个查询用Splunk内置命令即可完成,逻辑分四步:
- 拉取搜索当日往前推91天的全量活动日志,覆盖「前90天验证窗口+当日判定窗口」,时间范围拉取不足会直接导致结果错误
- 按「自然天+国家」维度做聚合,得到每个国家在每一天的活动计数,没有活动的日期补0,避免空值漏判
- 按国家维度归并数据,分别计算每个国家当日的总活动量、前90天的总活动量
- 过滤出「当日活动量>0、前90天总活动量=0」的国家,整理成结构化统计表格输出
用到的核心Splunk命令
timechart:对时间字段按天切分,自动按国家维度拆分列,快速生成每个国家每日的活动统计值fillnull:把没有活动记录的日期对应的空值填充为0,避免统计时把空值误判为有活动eval+case:对日期打标,区分当日数据和前90天的历史数据stats:跨天聚合每个国家的窗口活动指标,完成最终的维度归并where:按规则过滤符合条件的国家relative_time():动态计算时间窗口边界,不用每次手动修改查询的日期参数
可直接复用的SPL代码
# 替换下面的索引名为你实际存储活动日志的索引 index=user_activity_log earliest=-91d@d latest=now() # 替换country为你数据中存储国家信息的实际字段名,统计事件数直接用count即可 | timechart span=1d count as daily_event_count by country | fillnull value=0 | eval time_window = case( _time >= relative_time(now(), "@d"), "current_day", _time >= relative_time(now(), "-90d@d"), "prev_90days", 1=1, "unused" ) | stats sum(eval(if(time_window="current_day", daily_event_count, 0))) as 当日活动事件数, sum(eval(if(time_window="prev_90days", daily_event_count, 0))) as 前90天活动事件数 by country | where 当日活动事件数 > 0 AND 前90天活动事件数 = 0 | rename country as 国家 | table 国家 当日活动事件数 前90天活动事件数
适配调整提示
- 如果你的环境配置了活动相关的加速数据模型,开头的全量扫描可以替换为
tstats查询,大数据量下查询速度能提升数倍:| tstats count as daily_event_count from datamodel=Activity_Log by _time span=1d src_country - 如果不需要按自然天对齐,要按搜索执行时刻往前推满90*24小时算沉寂窗口,把代码里所有
@d的时间修饰符去掉即可 - 如果需要额外展示国家对应的首次回归活动时间、活跃用户数之类的指标,直接在stats块里加对应的聚合计算就行
内容的提问来源于stack exchange,提问作者Off Grid
相关产品推荐
相关产品推荐

