#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 — пожалуйста, посмотрите Обновление и дайте мне знать, если это приблизит вас