代码之家  ›  专栏  ›  技术社区  ›  ilitirit

查找特定字段已更改的交易记录

  •  0
  • ilitirit  · 技术社区  · 6 年前

    我想找出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事件后,需要在分配新块之前进行确认。偶尔会在BlockChange事件之前收到BlockChangeConfirmation事件(请参阅Ids 16和Ids 18)。我正在尝试编写一个查询来识别这些无序事件。

    我的方法是只考虑Block*事件,按ScenarioId将它们分组到事务中,从BlockChangeConfirmed开始,在10秒内以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和blockchangecommined事件之间变化。

    不过,我很难用Splunk来表达这一点。根据我使用的查询,它要么返回 每一个 BlockChangeConfirmed事件,或无法识别块字段何时更改。

    这是我使用的基本查询:

    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)
    

    没有成功。

    我怎样才能获得我想要的结果?

    1 回复  |  直到 6 年前
        1
  •  0
  •   ilitirit    6 年前

    对于这个特定的示例,我通过使用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