Фильтрация запросов Splunk на основе другого события в том же индексе - PullRequest
2 голосов
/ 28 мая 2020

У меня есть индекс с именем Events

Он содержит кучу разных событий, все события имеют свойство под названием EventName. Теперь я хочу выполнить запрос, в котором я возвращаю все, что соответствует следующему:

ЕСЛИ AccountId существует в событии с EventName AccountCreated И есть как минимум 1 событие с EventName FavoriteCreated с тем же AccountId -> вернуть все события, где EventName == AccountCreated

Примеры событий:

AccountCreated

{
   "AccountId": 1234,
   "EventName": "AccountCreated",
   "SomeOtherProperty": "Some value",
   "Brand": "My Brand",
   "DeviceType": "Mobile",
   "EventTime": "2020-06-01T12:13:14Z"
}

FavoriteCreated

{
   "AccountId": 1234,
   "EventName": "FavoritesCreated,
   "Brand": "My Brand",
   "DeviceType": "Mobile",
   "EventTime": "2020-06-01T12:13:14Z"
}

Учитывая следующие два события, я хотел бы создать 1 запрос, который возвращает событие AccountCreated.

Я пробовал следующее, но это не работает, конечно, мне что-то не хватает просто?

index=events EventName=AccountCreated 
  [search index=events EventName=FavoriteCreated | dedup AccountId | fields AccountId]
| table AccountId, SomeOtherProperty

Я ожидаю ~ 6000 просмотров, но получаю только 2298 событий. Что мне не хватает?

ОБНОВЛЕНИЕ На основании ответа, предоставленного @warren ниже, следующий запрос работает. Единственная проблема заключается в том, что он использует JOIN, который ограничивает нас 50 КБ результатов подисследования. При выполнении этого запроса я получаю всего 5900 результатов = правильно.

index=events EventName=AccountCreated AccountId=*
| stats count by AccountId, EventName
| fields - count
| join AccountId 
    [ | search index=events EventName=FavoriteCreated AccountId=*
    | stats count by AccountId ]
| fields - count
| table AccountId, EventName

Затем я попытался использовать его обновленный пример, подобный этому, но проблема, похоже, в том, что он возвращает события FavoriteCreated вместо AccountCreated. При выполнении этого запроса я получаю 25 494 совпадений = Неверно.

index=events AccountId=* (EventName=AccountCreated OR EventName=FavoriteCreated)
| stats values(EventName) as EventName by AccountId
| eval EventName=mvindex(EventName,-1)
| search EventName="FavoriteCreated"
| table AccountId, EventName

Обновление 2 - РАБОТАЕТ @warren великолепен, вот полный рабочий запрос, который возвращает данные только из событий AccountCreated ЕСЛИ существует 1 или несколько событий FavoriteCreated.

index=events AccountId=* (EventName=AccountCreated OR EventName=FavoriteCreated)
| stats 
    values(Brand) as Brand,
    values(DeviceType) as DeviceType,
    values(Email) as Email,
    values(EventName) as EventName
    values(EventTime) as EventTime,
    values(Locale) as Locale,
    values(ClientIp) as ClientIp
  by AccountId
| where mvcount(EventName)>1
| eval EventName=mvindex(EventName,0)
| eval EventTime=mvindex(EventTime,0)
| eval ClientIp=mvindex(ClientIp,0)
| eval DeviceType=mvindex(DeviceType,0)

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Вы, возможно, обнаружили один фактор ваших проблем - что подисследования ограничены 50,000 (при выполнении join) событий (или 60 секунд (или 10,000 результатов при использовании «обычного» подпроцесса).

Начните с сброса dedup в пользу stats:

index=events EventName=AccountCreated AccountId=*
| stats count by AccountId, SomeOtherProperty [, more, fields, as, desired]
| fields - count
| search 
    [ | search index=events EventName=FavoriteCreated AccountId=*
    | stats count by AccountId 
    | fields - count]
<rest of search>

Если это не приведет вас туда, где вы хотите быть (ie, вы по-прежнему получили слишком много результатов в вашем дополнительном поиске), вы можете попробовать join:

index=events EventName=AccountCreated AccountId=*
| stats count by AccountId, SomeOtherProperty [, more, fields, as, desired]
| fields - count
| join AccountId 
    [ | search index=events EventName=FavoriteCreated AccountId=*
    | stats count by AccountId ]
| fields - count
<rest of search>

Есть есть еще больше способов сделать то, что вы ищете, но эти два должны дать вам долгий путь к вашей цели

Вот подход без join, который ' Я покажу только события «FavoriteCreated»:

index=events AccountId=* (EventName=AccountCreated OR EventName=FavoriteCreated)
| stats values(EventName) as EventName values(SomeOtherProperty) as SomeOtherProperty by AccountId
| eval EventName=mvindex(EventName,-1)
| search EventName="FavoriteCreated"

А вот одно, которое показывает «FavoriteCreated» только , если в тот же период было событие «AccountCreated»:

index=events AccountId=* (EventName=AccountCreated OR EventName=FavoriteCreated)
| stats values(EventName) as EventName values(SomeOtherProperty) as SomeOtherProperty by AccountId
| where mvcount(EventName)>1

И если вы хотите «притвориться», что values() не произошло (ie, выкиньте запись «favouriteCreated»), добавьте это:

| eval EventName=mvindex(EventName,0)
0 голосов
/ 28 мая 2020

Оказывается, Splunk обрезает результат SubSearch, если его результаты больше 10 000 ... Splunk search feedback enter image description here

...