是的,在 Splunk 中有几种方法可以做到这一点,每种方法的易用性和扩展能力各不相同。我将逐步介绍子搜索方法:
1) 捕获从 -1d@d 到 @d 期间的所有用户 ID
您想首先验证仅返回 id 列表的搜索,然后将其转换为子搜索:
sourcetype=<MY_SOURCETYPE> earliest=-1d@d latest=-@d | stats values(id) AS id
2) 对于每个用户,从索引开始搜索直到 -1d@d 并通过比较实际 id 字段查看用户 ID 是否已经存在
构造一个具有不同时间范围的主搜索,使用 (1) 中的子搜索来匹配这些 id(请注意,子搜索必须以 开头search
):
sourcetype=<MY_SOURCETYPE> [search sourcetype=<MY_SOURCETYPE> earliest=-1d@d latest=-@d | stats values(id) AS id] earliest=0 latest=-1d@d
这将返回从索引开始到但不包括包含 (1) 中的 id 的 1d@d 的所有事件的原始数据集。
3)如果不存在,则将其添加到计数器中
NOT
使用 a对整个子搜索修改该搜索,并将外部搜索通过管道传输stats
以查看它匹配的 id:
sourcetype=<MY_SOURCETYPE> NOT [search sourcetype=<MY_SOURCETYPE> earliest=-1d@d latest=-@d | stats values(id) AS id] earliest=0 latest=-1d@d | stats values(id)
4) 显示这个最终计数。
修改最后一个stats
命令以返回不同的计数:
sourcetype=<MY_SOURCETYPE> NOT [search sourcetype=<MY_SOURCETYPE> earliest=-1d@d latest=-@d | stats values(id) AS id] earliest=0 latest=-1d@d | stats dc(id)
性能考虑:
上述方法适用于商用硬件上 100 万行以下的数据集。问题是子搜索被阻塞,因此外部搜索需要等待。如果您有更大的数据集要处理,则需要采用替代方法来使其成为有效的搜索。
仅供参考,Splunk 有一个专门的网站,您可以在其中更快地获得此类问题的答案:http: //splunk-base.splunk.com/answers/