Splunk search — как выполнить цикл по полю с несколькими значениями

#splunk #splunk-query

#splunk #splunk-запрос

Вопрос:

Мой вариант использования анализирует тикет, чтобы приписать состояние всему статусу конкретного тикета.

Необработанные данные выглядят следующим образом :

ID Версия Статус Время события
0001 1 Новое 2021-01-07T09:14:00Z
0001 1 Завершено — действие выполнено 2021-01-07T09:38:00Z

Данные выглядят следующим образом после выполнения команды транзакции:

ID Версия Статус Время события состояние
0001, 0001 1, 1 Новое, завершено — выполнено действие 2021-01-07T09:14:00Z, 2021-01-07T09:38:00Z Подтверждение, работа

Я использую команду переноса, чтобы рассчитать продолжительность подтверждения и разрешения заявки.

У меня есть предопределенное правило для выбора правильного состояния. Эти правила сравнивают статус n-1 (новый) и текущий статус (завершено — действие выполнено), чтобы выбрать состояние.

Проблема

Каждый билет имеет разное количество статусов. Мы не можем заранее знать максимальный номер состояния. Я не могу написать статический поиск, сравнивающий каждое значение поля состояния.

Ожидаемое решение

У меня есть поле, которое сообщает мне номер индекса в поле статус (номер статуса заявки).

Я хочу использовать цикл (почему бы не цикл для), чтобы выполнить итерацию по каждому индексу состояния поля и сравнить значение i-1 и i.

Я не могу найти, как это сделать. Возможно ли это?

Спасибо

Комментарии:

1. можете ли вы поделиться необработанными событиями вместо таблицы объединенных событий?

2. Привет, Уоррен, я добавил необработанные данные 🙂

Ответ №1:

Обновите, чтобы отразить более подробную информацию

Вот метод, streamstats который должен привести вас к ответу:

 index=ndx sourcetype=srctp Id=* Version=* Status=* EventTime=* state=*
| eval phash=sha256(Version.Status)
| sort 0 _time
| streamstats current=f last(phash) as chash by Id state
| fillnull value="noprev"
| eval changed=if(chash!=phash OR chash="noprev","true","false")
| search NOT changed="false"
| table *
 

оригинальный ответ

Для получения самого последнего статуса должно работать что-то вроде следующего:

 index=ndx sourcetype=srctp Id=* Version=* Status=* EventTime=* state=*
| stats latest(Status) as Status latest(Version) as Version latest(state) state latest(EventTime) as "Event Time" by Id
 

редактировать в свете упоминания transaction команды g

Не используйте transaction , если вам действительно не нужно.

в 99% случаев stats вы выполняете то, что transaction делает быстрее и эффективнее.

Например:

 index=ndx sourcetype=srctp Id=* Version=* Status=* EventTime=* state=*
| stats earliest(Status) as eStatus latest(Status) as lStatus earliest(Version) as eVersion latest(Version) as lVersion earliest(status) as estate latest(state) lstate earliest(EventTime) as Opened latest(EventTime) as MostRecent by Id
 

Выдаст таблицу, с которой вы можете затем манипулировать eval и тому подобное. Например (предполагая, что формат времени поддается вычитанию (т.Е. Все еще в формате эпохи Unix)):

 | eval ticketAge=MostRecent-Opened
| eval Versions=eVersion " - " lVersion
| eval Statuses=eStatus " - " lStatus
| eval State=estate ", ",lstate
| eval Opened=strftime(Opened,"%c"), MostRecent=strftime(MostRecent,"%c")
| eval D=if(ticketAge>86400,round(ticketAge/86400),0)
| eval ticketAge=if(D>0,round(ticketAge-(D*86400)),ticketAge)
| eval H=if(ticketAge>3600,round(ticketAge/3600),0)
| eval ticketAge=if(H>0,round(ticketAge-(H*3600)),ticketAge)
| eval M=if(ticketAge>60,round(ticketAge/60),0)
| eval ticketAge=if(M>0,round(ticketAge-(M*60)),ticketAge)
| rename ticketAge as S
| eval Age=D " days " H " hours" M " minutes" S " seconds"
| table Id Versions Statuses Opened MostRecent State Age
| rename MostRecent as "Most Recent"
 

Примечание: возможно, я отключил преобразование необработанных секунд в дни, часы, минуты, секунды, но оно должно быть близко

Комментарии:

1. Привет, спасибо за ответ. Это не работает, потому что состояние поля не существует в необработанных данных. Я добавил это поле с помощью comparaison. И ваш поиск предоставляет только состояние, сравнивающее первый и последний статус. Я хотел указать состояние при каждом изменении статуса. мои данные должны иметь другое состояние, поскольку они имеют другой статус

2. @ClementRos — в этом случае вы захотите посмотреть streamstats . Я постараюсь привести пример, как только смогу. Пожалуйста, обновите свой вопрос, чтобы отразить дополнительную информацию, которой вы поделились в этом комментарии 🙂

3. Я пытался использовать steamstats и eventstats, но смог получить только первое и последнее значение статуса по идентификатору, а не текущее состояние и предыдущее

4. @ClementRos — пожалуйста, посмотрите Обновление и дайте мне знать, если это приблизит вас