Группируйте или объединяйте несколько событий данных без общего идентификатора события

#azure-log-analytics #azure-data-explorer

#azure-log-analytics #azure-data-explorer

Вопрос:

Исходные данные:

Хост Предупреждение Время события EventStatus
host1 WAN PING 05:40 ПРЕДУПРЕЖДЕНИЕ
host1 WAN PING 05:58 КРИТИЧЕСКИЙ
host1 WAN PING 06:30 ОК
host1 WAN PING 06:40 ПРЕДУПРЕЖДЕНИЕ
host1 WAN PING 07:30 ОК
host2 WAN PING 05:42 ПРЕДУПРЕЖДЕНИЕ
host2 WAN PING 05:46 ОК
host2 WAN PING 06:40 ПРЕДУПРЕЖДЕНИЕ
host2 WAN PING 06:58 КРИТИЧЕСКИЙ
host2 WAN PING 07:30 ОК
host3 WAN PING 06:30 ПРЕДУПРЕЖДЕНИЕ
host3 WAN PING 07:30 ОК

Мне нужно вернуть продолжительность каждого события оповещения.

хост eventStart Завершение события eventDuration
host1 05:40 06:30 00:50
host1 06:40 07:30 00:50
host2 05:42 05:46 00:04
host2 06:40 07:30 00:50
host3 06:30 07:30 01:00

Я боюсь, что нет уникального идентификатора события для группировки данных и запуска join

Мои попытки работают для хостов только с одним «событием»

 T
| where Host == 'host3'
| summarize min(eventTime), max(eventTime) by Host
 

Который возвращает желаемый результат, но если я выполняю это против host1 min=05:40 max=07:30

Есть ли способ сгруппировать эти события по EventStatus?

Ответ №1:

вы могли бы использовать row_window_session() : https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/row-window-session-function

 datatable(Host:string, Alert:string, EventTime:datetime, EventStatus:string)
[
    'host1', 'WAN PING', datetime(2020-12-16 05:40), 'WARNING',
    'host1', 'WAN PING', datetime(2020-12-16 05:58), 'CRITICAL',
    'host1', 'WAN PING', datetime(2020-12-16 06:30), 'OK',
    'host1', 'WAN PING', datetime(2020-12-16 06:40), 'WARNING',
    'host1', 'WAN PING', datetime(2020-12-16 07:30), 'OK',
    'host2', 'WAN PING', datetime(2020-12-16 05:42), 'WARNING',
    'host2', 'WAN PING', datetime(2020-12-16 05:46), 'OK',
    'host2', 'WAN PING', datetime(2020-12-16 06:40), 'WARNING',
    'host2', 'WAN PING', datetime(2020-12-16 06:58), 'CRITICAL',
    'host2', 'WAN PING', datetime(2020-12-16 07:30), 'OK',
    'host3', 'WAN PING', datetime(2020-12-16 06:30), 'WARNING',
    'host3', 'WAN PING', datetime(2020-12-16 07:30), 'OK',
]
| order by Host asc, EventTime asc 
| extend session_start = row_window_session(EventTime, 1d, 1d, Host != prev(Host) or prev(EventStatus) == "OK")
| summarize eventStart = min(EventTime), eventEnd = max(EventTime) by session_start, Host
| project Host, eventStart, eventEnd, duration = eventEnd - eventStart
| order by Host asc, eventStart asc
 

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

1. Удивительно — именно то, что мне было нужно, спасибо