В нашем предыдущем посте мы рассмотрели, как использовать Splunk для определения наиболее изменчивых кодов событий за прошедший день. В этом посте мы вернемся к этой теме в свете некоторых хороших отзывов, а затем посмотрим, как получить подробную разбивку по часам.
Сводный запрос, повторный
Деб Дей отметила в ответ на предыдущее сообщение, что показатель почасового изменения — отношение — не определено, когда знаменатель равен нулю. В то время я не был уверен, является ли эта проблема реальной или чисто академической, но опыт с запросом сразу же показал, что эта проблема очень реальна. Один из сценариев, который мы хотим обнаружить, — это когда релиз ломает то, что раньше работало. Этот сценарий фактически произошел при экспериментировании с метрикой и выявил необходимость исправления.
После рассмотрения различных альтернатив мы в конечном итоге остановились на использовании соотношения (сегодня + 1) / (вчера + 1). Это решает проблему нулевого знаменателя без чрезмерного искажения отношения.
Мы также сделали несколько других улучшений:
- Для целей мониторинга мы больше заботимся о всплывающих окнах, чем о выпадающих, поэтому мы изменили запрос, чтобы сосредоточиться на всплывающих окнах, а не на всплывающих и пропадающих данных.
- Оригинальный запрос посмотрел на сегодняшние события, время Bellevue. Проблема в том, что мы уделяем большое внимание последним событиям в начале дня Bellevue, но более размытому представлению о событиях дня в конце дня Bellevue. Таким образом, мы изменили окно на скользящее окно.
- Сейчас мы смотрим на 8-часовое окно, поскольку это дает нам представление о более свежих событиях.
Вот обновленный запрос:
index=summary reporttype=eventcount reporttime=hourly earliest=-32h@h latest=now | eval currHour = strftime(now(), "%H") | eval prevHour = currHour - 1 | where (prevHour - date_hour) % 24 < 8 | eval near = if(_time >= relative_time(now(), "-24h@h"), 1, 0) | stats sum(count) as jfreq by date_hour EventCode near | eval tmp_nearFreq = if(near == 1, jfreq, 0) | eval tmp_farFreq = if(near == 0, jfreq, 0) | stats max(tmp_farFreq) as farFreq, max(tmp_nearFreq) as nearFreq by date_hour EventCode | where nearFreq > farFreq | eval change = (nearFreq + 1) / (farFreq + 1) | stats sumsq(change) as ssc by EventCode | sort ssc desc | head 10 | eval magnitude = log(ssc)
И вот что он генерирует (смоделированные данные):
EventCode | величина |
---|---|
3232 | 6,1 |
12 | 5,1 |
8819 | 4,7 |
10329 | 4,6 |
1442 | 4.5 |
18 | 4,0 |
309 | 3,7 |
6167 | 3,5 |
10002 | 3,3 |
17 | 3,3 |
Обратите внимание, что показатель «волатильности» теперь является «величиной», поскольку здесь мы рассматриваем только восходящее поведение. Величина равна log_10, как шкала Рихтера.
Детальный запрос
Теперь мы хотим увидеть поведение событий, которые вызвали всплеск популярности за последние восемь часов. Хотя мы могли наблюдать за поведением в течение произвольного периода времени, мы будем использовать восемь часов, чтобы все было просто. Также обратите внимание, что здесь мы хотим видеть как восходящее, так и нисходящее поведение. Другими словами, несмотря на то, что для выбора интересных событий мы рассматривали только всплывающие окна, мы хотим представить события в целом.
Вот запрос:
index=summary reporttype=eventcount reporttime=hourly earliest=-32h@h latest=now | join EventCode | eval currHour = strftime(now(), "%H") | eval prevHour = currHour - 1 | where (prevHour - date_hour) % 24 < 8 | eval near = if(_time >= relative_time(now(), "-24h@h"), 1, 0) | stats sum(count) as jfreq by date_hour EventCode near | eval tmp_nearFreq = if(near == 1, jfreq, 0) | eval tmp_farFreq = if(near == 0, jfreq, 0) | stats max(tmp_farFreq) as farFreq, max(tmp_nearFreq) as nearFreq by date_hour EventCode | eval change = if(nearFreq >= farFreq, (nearFreq + 1) / (farFreq + 1), -((farFreq + 1) / (nearFreq + 1))) | chart median(change) by date_hour, EventCode
Этот запрос использует слегка упрощенную версию сводного запроса в качестве подзапроса. Это делает начальную идентификацию событий, о которых мы заботимся. Затем мы присоединяемся к этим событиям, чтобы получить почасовую разбивку этих событий и нанести их на график (действительные коды событий в легенде исключены):
Ось X — это час дня, а ось Y — показатель изменения логарифмической шкалы, который (примерно) представляет собой отношение сегодняшнего счета к вчерашнему счету для всплывающих окон.
Чтобы увидеть конкретное событие, мы просто наводим курсор на его код в легенде (опять же, действительные коды событий в легенде подавляются):
Этот интерактивный график дает нам хороший способ лучше понять, что происходит с проблемными кодами событий. Мы начнем с просмотра сводного представления (таблицы, в которой перечислены проблемные события в порядке убывания по величине), а затем выделим отдельные события в подробном представлении, чтобы увидеть, была ли проблема решена или еще не завершена.
До следующего раза, счастливого Сплинкинга!
Подтверждения
Спасибо Аману Бутани, Малкольму Джамалу Андерсону, Деб Дей и Каран Шаху за их вклад в работу здесь.