Статьи

Лучшие Десять Попсов и Капель со Splunk — Часть 2

В нашем  предыдущем посте мы рассмотрели, как использовать 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 — показатель изменения логарифмической шкалы, который (примерно) представляет собой отношение сегодняшнего счета к вчерашнему счету для всплывающих окон.

Чтобы увидеть конкретное событие, мы просто наводим курсор на его код в легенде (опять же, действительные коды событий в легенде подавляются):

Этот интерактивный график дает нам хороший способ лучше понять, что происходит с проблемными кодами событий. Мы начнем с просмотра сводного представления (таблицы, в которой перечислены проблемные события в порядке убывания по величине), а затем выделим отдельные события в подробном представлении, чтобы увидеть, была ли проблема решена или еще не завершена.

До следующего раза, счастливого Сплинкинга!

Подтверждения

Спасибо Аману Бутани, Малкольму Джамалу Андерсону, Деб Дей и Каран Шаху за их вклад в работу здесь.