如何查询按特定顺序发生的事件?

如何查询按特定顺序发生的事件?

假设我在 Splunk 中有以下事件(按时间顺序排列):

  1. 操作员=zeroPointModule id=123 动作=开始
  2. 操作员=foobar id=123 动作=开始
  3. 操作员=zeroPointModule id=123 动作=停止
  4. 操作员=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-很好的《星际之门》参考资料

相关内容