查找特定字段已更改的交易
Finding transactions where a specific field has changed
我正在尝试查找 Splunk 中的乱序事件。这个例子类似于我们系统中发生的事情:
...
Time=15:40.09 Id=11 ScenarioId=7 Event=BlockChange Block=A-A
Time=15:40.11 Id=12 ScenarioId=7 Event=BlockChangeConfirmed Block=1-7
Time=15:41.00 Id=13 ScenarioId=2 Event=BlockChange Block=E-6
Time=15:41.01 Id=14 ScenarioId=7 Event=Restart
Time=15:41.05 Id=15 ScenarioId=2 Event=BlockChangeConfirmed Block=B-2
Time=15:41.14 Id=16 ScenarioId=3 Event=BlockChangeConfirmed Block=2-4
Time=15:41.15 Id=17 ScenarioId=2 Event=Restart
Time=15:41.16 Id=18 ScenarioId=3 Event=BlockChange Block=E-1
Time=15:43.24 Id=19 ScenarioId=8 Event=BlockChange Block=C-7
Time=15:43.27 Id=20 ScenarioId=8 Event=BlockChangeConfirmed Block=D-2
Time=15:43.35 Id=21 ScenarioId=8 Event=BlockChange Block=D-2
Time=15:43.40 Id=22 ScenarioId=8 Event=BlockChangeConfirmed Block=4-A
...
针对特定场景发生BlockChange事件后,需要在分配新Block之前对其进行确认。偶尔会在 BlockChange 事件之前收到 BlockChangeConfirmed 事件(参见 ID 16 和 18)。我正在尝试编写一个查询来识别这些乱序事件。
我的方法是只考虑 Block* 事件,在 10 秒的时间跨度内按 ScenarioId 将它们分组为事务,从 BlockChangeConfirmed 开始到 BlockChange 结束。所以从逻辑上来说,它会把上面的数据转化成这样:
ScenarioId=3: Time=15:41.14 Id=16 Event=BlockChangeConfirmed Block=2-4
Time=15:41.16 Id=18 Event=BlockChange Block=E-1
ScenarioId=8: Time=15:43.27 Id=20 Event=BlockChangeConfirmed Block=D-2
Time=15:43.35 Id=21 Event=BlockChange Block=D-2
这正确地识别了 ID 16 和 18,但也错误地识别了 20 和 21。所以我需要包括 Block 字段,因为它总是在相应的 BlockChange 和 BlockChangeConfirmed 事件之间变化。
虽然我在 Splunk 中表达这个有问题。根据我使用的查询,它要么是 returns every BlockChangeConfirmed 事件,要么不识别 Block 字段何时更改。
这是我正在使用的基本查询:
index="foo" sourcetype="bar" Block AND (Event=BlockChange OR Event=BlockChangeConfirmed)
| streamstats latest(Block) AS last earliest(Block) AS first
| transaction ScenarioId startswith="(Event=BlockChangeConfirmed)" endswith="(Event=BlockChange)" maxspan=10s
我已尝试添加条件并将其更改为:
| search first != last
| search eval(first != last)
| where first != last
endswith=eval(first != last)
没有成功。
如何获得我想要的结果?
对于这个特定示例,我通过使用 mvcount 搜索块更改次数大于 1 的位置来解决它:
index="foo" sourcetype="bar" Block AND (Event=BlockChange OR Event=BlockChangeConfirmed)
| streamstats earliest(Block) AS first
| transaction ScenarioId startswith="(Event=BlockChangeConfirmed)" endswith="(Event=BlockChange)" maxspan=10s
| eval numberOfBlocks=mvcount(first)
| search numberOfBlocks > 1
我正在尝试查找 Splunk 中的乱序事件。这个例子类似于我们系统中发生的事情:
...
Time=15:40.09 Id=11 ScenarioId=7 Event=BlockChange Block=A-A
Time=15:40.11 Id=12 ScenarioId=7 Event=BlockChangeConfirmed Block=1-7
Time=15:41.00 Id=13 ScenarioId=2 Event=BlockChange Block=E-6
Time=15:41.01 Id=14 ScenarioId=7 Event=Restart
Time=15:41.05 Id=15 ScenarioId=2 Event=BlockChangeConfirmed Block=B-2
Time=15:41.14 Id=16 ScenarioId=3 Event=BlockChangeConfirmed Block=2-4
Time=15:41.15 Id=17 ScenarioId=2 Event=Restart
Time=15:41.16 Id=18 ScenarioId=3 Event=BlockChange Block=E-1
Time=15:43.24 Id=19 ScenarioId=8 Event=BlockChange Block=C-7
Time=15:43.27 Id=20 ScenarioId=8 Event=BlockChangeConfirmed Block=D-2
Time=15:43.35 Id=21 ScenarioId=8 Event=BlockChange Block=D-2
Time=15:43.40 Id=22 ScenarioId=8 Event=BlockChangeConfirmed Block=4-A
...
针对特定场景发生BlockChange事件后,需要在分配新Block之前对其进行确认。偶尔会在 BlockChange 事件之前收到 BlockChangeConfirmed 事件(参见 ID 16 和 18)。我正在尝试编写一个查询来识别这些乱序事件。
我的方法是只考虑 Block* 事件,在 10 秒的时间跨度内按 ScenarioId 将它们分组为事务,从 BlockChangeConfirmed 开始到 BlockChange 结束。所以从逻辑上来说,它会把上面的数据转化成这样:
ScenarioId=3: Time=15:41.14 Id=16 Event=BlockChangeConfirmed Block=2-4
Time=15:41.16 Id=18 Event=BlockChange Block=E-1
ScenarioId=8: Time=15:43.27 Id=20 Event=BlockChangeConfirmed Block=D-2
Time=15:43.35 Id=21 Event=BlockChange Block=D-2
这正确地识别了 ID 16 和 18,但也错误地识别了 20 和 21。所以我需要包括 Block 字段,因为它总是在相应的 BlockChange 和 BlockChangeConfirmed 事件之间变化。
虽然我在 Splunk 中表达这个有问题。根据我使用的查询,它要么是 returns every BlockChangeConfirmed 事件,要么不识别 Block 字段何时更改。
这是我正在使用的基本查询:
index="foo" sourcetype="bar" Block AND (Event=BlockChange OR Event=BlockChangeConfirmed)
| streamstats latest(Block) AS last earliest(Block) AS first
| transaction ScenarioId startswith="(Event=BlockChangeConfirmed)" endswith="(Event=BlockChange)" maxspan=10s
我已尝试添加条件并将其更改为:
| search first != last
| search eval(first != last)
| where first != last
endswith=eval(first != last)
没有成功。
如何获得我想要的结果?
对于这个特定示例,我通过使用 mvcount 搜索块更改次数大于 1 的位置来解决它:
index="foo" sourcetype="bar" Block AND (Event=BlockChange OR Event=BlockChangeConfirmed)
| streamstats earliest(Block) AS first
| transaction ScenarioId startswith="(Event=BlockChangeConfirmed)" endswith="(Event=BlockChange)" maxspan=10s
| eval numberOfBlocks=mvcount(first)
| search numberOfBlocks > 1