假设我在 Splunk 中有以下事件(按时间顺序排列):
- 操作员=zeroPointModule id=123 动作=开始
- 操作员=foobar id=123 动作=开始
- 操作员=zeroPointModule id=123 动作=停止
- 操作员=zeroPointModule id=123 动作=停止
(是的,它停止了两次,或者可以重新启动。请不要对事件的顺序做出任何假设。)
我想要获取 (1) 和 (3) 发生时的所有事件。例如:
操作员 = zeroPointModule id = 123 (动作 = 启动然后动作 = 停止)
我不太关心输出(两个事件,仅第一个或最后一个)。
答案1
这是该命令的一个典型示例transaction
。它可以根据共享字段和开始和/或停止文本对事件进行分组。例如:
index=foo
| transaction startswith="start" endswith="stop" operator
该transaction
命令的性能不是很好,因此,根据您需要搜索的数据量,使用可能会获得更好的结果stats
。
index=foo
| stats range(_time) as duration values(*) as * by operator
答案2
是否有可能发生“停止”前一个“开始”?我怀疑不是——除非你的时间戳提取过程很糟糕。
这意味着你将总是每个有 1 (或 2) 个事件operator
(一个“开始”和一个最终的“停止”)。
我也怀疑你不会更多的operator
对于给定的和,有一个以上的“开始” id
。
假设这是真的:
index=ndx sourcetype=srctp operator=* id=* action IN("start","stop")
| stats values(_time) as times values(action) as action by operator id
| where mvcount(action)>1
| eval elapsed_time_in_seconds=mvindex(times,-1)-mvindex(times,0)
| table operator id elapsed_time_in_seconds
由于问题更新而进行编辑
如果你可以拥有多种的“开始”和“停止”事件,但你想将它们分组,你可以做类似的事情(我曾多次不得不从 Splunk 中获取愚蠢的数据):
index=ndx sourcetype=srctp operator=* id=* action IN("start","stop")
| eval comb=_time+"|"+action
| stats values(comb) as combs by operator id
| where mvcount(combs)>1
| eval cfirst=mvindex(combs,0), clast=mvindex(combs,-1)
| search cfirst="*start" clast="*stop"
| rex field=cfirst "(?<start_time>\d+)"
| rex field=clast "(?<stop_time>\d+)"
| where stop_time>start_time
| table operator id start_time stop_time
| eval start_time=strftime(start_time,"%c"), stop_time=strftime(stop_time,"%c")
PS-很好的《星际之门》参考资料