【问题标题】:Splunk - Match different fields in different events from same data sourceSplunk - 匹配来自同一数据源的不同事件中的不同字段
【发布时间】:2016-06-09 22:02:20
【问题描述】:

我有一个数据源,我需要在其中返回来自单个数据源的所有事件对(event1、event2),其中 event1 中的 field1 与 event2 中的 field2 匹配。

例如,假设我有以下数据。

我需要返回一对事件,其中来自 event1 的字段 id 与来自 event2 的字段 referrer_id 匹配。比方说,要获得以下报告。

  • Adam Anderson 于 2016-01-02 08:00:00.000 提及 Betty Burger
  • Adam Anderson 于 2016-01-03 08:00:00.000 转介 Carol Camp
  • Betty Burger 于 2016-01-04 08:00:00.000 推荐 Darren Dougan

在 sql 中,我可以使用以下命令轻松完成此操作。

select a.first_name as first1, a.last_name as last1, b.first_name as first2,
       b.last_name as last2, b.date as date
from myTable a
inner join myTable b on a.id = b.referrer_id;

返回下表,

这正是我需要的数据。

现在,我一直在尝试在 splunk 查询中复制这一点,但遇到了很多问题。首先,我尝试使用 transaction 命令,但它会将所有相关事件聚合在一起,而不是一次将它们匹配一对。

接下来,我尝试使用子搜索,首先找到 id,然后在子搜索中搜索,首先通过 id 搜索第一个事件,然后附加第二个事件referral_id。然后,由于 append 创建一个新行而不是附加到同一行,因此使用 stats 通过匹配的 id 字段聚合结果行。我确实尝试使用 appendcols 但这并没有为我返回任何东西。

...
| table id
| map search="search id=$id$
  | fields first_name, last_name, id
  | rename first_name as first1
  | rename last_name as last1
  | rename id as match_id
  | append [search $id$
    | search referral_id=$id$
    | fields first_name, last_name, referral_id, date
    | rename first_name as first2
    | rename last_name as span2
    | rename referral_id as match_id]"
| fields first1, last1, first2, last2, match_id, time
| stats values(first1) as first1, values(last1) as last1, values(first2) as first2,
  values(last2) as last2, values(time) as time by id

上面的查询对我有用,并为我提供了我需要的表,但由于在整个时间范围内重复搜索,它非常慢,并且还受到地图 ma​​xsearches 的限制,因为不管什么原因,都不能设置为无限制。

这似乎是一个过于复杂的解决方案,尤其是与 sql 查询相比。当然,必须存在一种更简单、更快的方法来完成此操作,它不受任意有限设置或多个重复搜索查询的限制。我将不胜感激。

【问题讨论】:

  • 你考虑过join吗?
  • 我考虑过加入。它没有返回我需要的所有结果 - 它只会返回两行而不是三行,仅在 B 上匹配 A,而不是在 B 和 C 上匹配 A。

标签: splunk


【解决方案1】:

我最终使用了追加。使用 join 给了我更快的结果,但并没有得到每个匹配对,对于我的示例,它将返回 2 行而不是 3 行,返回 Adam 和 Betty,但不返回 Adam 和 Carol。

使用 append 返回了一个完整列表,使用 stats by id 得到了我正在寻找的结果,每个匹配对的完整列表。它还提供了额外的空白字段,因此我必须删除这些字段,然后将生成的 mv 操作到它们自己的单独行中。 Splunk 不提供多字段 mv 扩展,因此我使用了一种解决方法。

...
| rename id as matchId, first_name as first1, last_name as last1
| table matchId, first1, last1
| append [
  search ... 
  | rename referrer_id as matchId, first_name as first2, last_name as last2
  | table matchId, first2, last2, date]
| stats list(first1) as first1, list(last1) as last1, list(first2) as first2, list(last2) as last2, list(date) as date by matchId
| search first1!=null last1!=null first2!=null last2!=null
| eval zipped=mvzip(mvzip(first2, last2, ","), date, ",")
| mvexpand zipped
| makemv zipped delim=","
| eval first2=mvindex(zipped, 0)
| eval last2=mvindex(zipped, 1)
| eval date=mvindex(zipped, 2)
| fields - zipped

这比使用具有多个子搜索的地图要快,并且可以提供所有结果。它仍然受到子搜索的最大大小的限制,但至少提供了必要的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多