如何动态限制时间范围?

How to dynamically limit time range?

我有两个来源类型:

A定义活动周期:

_time, entity, start_time, end_time, activity, ...

B 定义实体的二维位置:

_time, entity, x, y, ....

现在我试图只提取 B 中所有实体中在 A 中定义的时间段内的那些行,我该怎么做?看来我无法与命令 'join' for time?

进行比较

你说得对,join 在这里帮不上什么忙。我发现在两个索引中匹配信息的 splunk 方法是从两个索引开始并像处理单个索引一样操作异构事件。

在这种情况下,一种方法使用 streamstats 生成非规范化的事件,以在每个位置事件上包含相关的 activity 字段。首先,确保来自索引 A 的每个事件都将 start_time 视为 _time 字段。然后,使用 streamstats 为每个事件填充 null start_timeend_timeactivity 字段(应来自索引 B),其中 entity 是非空的(应该来自索引 A)。最后过滤掉任何 _time > end_time 的事件,这将是任何落在 activity window.

之外的位置事件
index=A OR index=B
| eval _time=coalesce(start_time, _time)
| streamstats latest(start_time) as activity_start_time, latest(end_time) as activity_end_time, latest(activity) as activity by entity
| where _time<=end_time

请记住,此方法假定活动有序排列,因此没有 activity 重叠。如果活动可以重叠,这会有点棘手。

我有时使用的另一种方法是使用transaction而不是streamstats。这样可以更好地控制一个 activity 何时开始和结束的逻辑,并且每个 activity 产生一个事件,该事件具有多值字段。如果您选择这条路线,您会希望从每个位置的单个 "point" 字段开始。