Grafana - tips and trics

Здесь я буду собирать полезную информацию по использованию данного продукта.

Panel

Настройка панели с собственным временем (относительно текущего):

Опции запроса (Query options)

Time shift - при указании 1m сдвинет график влево (без сдвига начало в 11:44 а конец в 11:53)

Relative time - за какой период времени надо отображать данные (начиная от текущего времени и назад в прошлое). Детальнее: меняет дату начала данных на указанное тут время (например мы смотрим данные за последние 5 минут, но указывая тут 10 минут, мы говорим Графане смотреть данные за последние 10 минут).

Min interval - как часто показывать точки (points) на графике (если Relative time = 6, а Min interval = 2m, то видим 6 / 2=3 точки). Как видно значение напрямую воздействующее на Interval (фактически указывает его).

Interval - как видно нельзя задать, т.к. он рассчитывается по формуле, и как видно, это что-то вроде группировки данных, в данном случае получается поминутная группировка данных:

Query inspector - кнопка, которая поможет понять, какой запрос отправляет Графана в Data source

Query : Interval

На примере ниже указанного графика видно, что:

  • Trim Edges - обрезает данные слева и справа на 1 значение интервала (Interval):

Перцентили

Ниже можно увидеть пример того, как можно настроить график сразу по нужным перцентилям:

Alert

Не смотря на то, что есть официальное описание, мне оно показалось недостаточным, поэтому расписываю.

Сразу обозначимся:

  • Х - значение вычисляемое согласно Conditions.
  • Condition - может либо сработать (true) либо нет (false)

Принцип работы: при срабатывании Conditions оповещение переходит в состояние PENDING. Если условие остается нарушенным в течение указанного времени (Conditions=true), оповещение переходит в состояние ALERTING, в противном случае возвращается в состояние OK.

Test rule - кнопка слева внизу, которая поможет понять, какой запрос отправляет Графана и какой ответ получает

Теперь опишем поля ввода:

1. название alert-a

2. как часто проверять значение Х (должно быть кратно 10 секундам, например 30s) - если обнаружится нарушение (Conditions=true) то оповещение переходит в состояние PENDING

3. сколько времени ждать прежде чем отправить алерт (если с момента установки состояния в PENDING прошло указанное тут время, то будет отправлена нотификация), например рассмотрим настройку указанную на скриншоте:

МинутаConditionСтатусAlertПричина
00falseOKне отправлен 
01truePENDINGне отправленждем еще 2 минуты
02truePENDINGне отправленждем еще 1 минуту
03trueALERTINGотправленвремя ожидания вышло

4. Condition - настройка условия срабатывания alert-а

5. как считать значение Х (при котором сработает alert):

  • avg() — среднее значение;
  • min() — минимальное значение;
  • max() — максимальное значение;
  • sum() — сумма всех значений;
  • count() — количество значений;
  • last() — последнее значение;
  • median() — среднее значение по медиане;
  • diff() — разница между значениями;
  • percent_diff() — разница между значениями в процентах (допустим, вы хотите установить сигнал тревоги при увеличении количества на 20 % за последние 30 минут);
  • count_non_null() — количество значений, отличных от null;

6. какое query использовать для получения значения Х (список значений формируется на вкладке Query)

7. start_time — время, с которого нужно вести расчёт (относительно текущего времени, например, 15m — за 15 минут до текущего времени)

8. end_time — время, до которого нужно вести расчёт (относительно текущего времени в формате now-<time>, например, now-5m — за 5 минут до текущего времени)

заметка, если сейчас 10:00 то:

  • 2m, now означает время с 9:58 до 10:00
  • 2m, now-1m означает время с 9:58 до 9:59

9. какой логический оператор для проверки значения Х (чтобы сработал alert)

10. при каком значении Х должен сработать alert (критичное значение)

11. действие графаны, если в grafana не смогла получить данные из источника данных

12. действие графаны, если в grafana возникла ошибка или сработал таймаут получения данных из источника данных

Нюансы:

  1. если alert отправлен и Condition не меняется (все время равен true), то alert не будет отправлен повторно (grafana будет ждать что ситуация наладится - будет ждать статуса OK)
  2. посмотреть историю смены статусов можно нажав на кнопку State history:

Проблемы алертинга

Графана отправляя запрос каждую минуту, отправляет его не всегда ровно в 0 секунд, например (5-ти минутное условие):

 Человеко-понятный видtimestamp + milliseconds
fromMarch 27, 2023 12:10:45.5231679919045523
toMarch 27, 2023 12:15:45.5231679919345523

Итог: графана не способна отправлять значения с ровными минутами (минута и 0 секунд), поэтому если база сама не округляет from и to до 0 секунд с группировкой данных по минутам, то алертинг бесполезен (например Elastic не округляет).

Проблема получаемых значений

Пункты 6 и 7 создают промежуток времени для выборки данных. Например на вкладке Query указан Interval=1m и запрос WHERE field BETWEEN '00:00:30' AND '00:02:30' возвратит три строки из базы данных Elastic:

ВремяЗначениеЗначение получено за время
00:01:001с 00:00:30 по 00:01:00
00:02:002с 00:01:00 по 00:02:00
00:03:001с 00:02:00 по 00:02:30

Итог: графана не способна сама разделить вторую минуту на две части, чтобы сформировать 2 значения за каждую минуту.

Еще пример: выбираем значение для диапазона в 5 минут, мы видим 6 значений (points), в первом и последнем из которых данные не за всю минуту, а за промежуток указанный Графаной (оставшиеся 30 секунд первой минуты и первые 29 секунд последней минуты):  

Проблема функции percent_diff

Оказывается, Графана не хранит никаких состояний и наивно полагать, что функция percent_diff будет вычислять разницу между значениями, которые получены в результате некоторого количества запуска проверок.

На самом деле Графана возьмет первое и последнее значение и применит к ним функцию описанную в шаге 5 (в данном случае функцию percent_diff), это и будет Х

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

percent_diff_abs

Работает так же как percent_diff, но без  учета знака (+-), например Condition : When : percent_diff_abs query(A,5m,now) это число рассчитанное по формуле: (newest - oldest) / math.Abs(oldest) * 100 и так же как и percent_diff бесполезна при использовании Elastic.

Проблема функции count

Condition : When : count() - основывается не на общем числе данных, а на количестве результатов. Т.е. если указывая для графика интервал в 1m, а в query прописали query(A, 5m, now) - запрос вернет 6 значений (по одному на каждую минуту) и даже если в каждом из значений будет стоять 0, число Х все-равно будет 6. Вот пример для 60 минут (получаем кол-во значений 61, а не сумму значений, бред какой-то):

Итог: получаем Алерт при нормально работающем приложении.

If no data or all values are null

Увы, этот пункт не помогает, если база возвращает а null сразу для всех значений.

Итог: алертинг сработает, это очень странно получать алертинг при некорректной работе бд (увы, даже не знаю, как это побороть).

Transform

В 8-ой версии не работают вместе с настроенным алертингом. В следующей таблицесодержится список вычислений, которые вы можете выполнять при трансформации:

РасчетОписание
All nullsИстинно, когда все значения равны нулю
All zerosИстинно, когда все значения равны 0
Change countСколько раз значение поля изменяется
CountКоличество значений в поле
DeltaКумулятивное изменение значения, учитываются только приращения
DifferenceРазница между первым и последним значением поля
Difference percentПроцентное изменение между первым и последним значением поля
Distinct countКоличество уникальных значений в поле
First (not null)Во-первых, ненулевое значение в поле
MaxМаксимальное значение поля
MeanСреднее значение всех значений в поле
VarianceДисперсия всех значений в поле
StdDevСтандартное отклонение всех значений в поле
MinМинимальное значение поля
Min (above zero)Минимальное, положительное значение поля
RangeРазница между максимальным и минимальным значениями поля
StepМинимальный интервал между значениями поля
TotalСумма всех значений в поле

Prometheus With the Nginx Log Exporter

Интеграция описана, а нам осталось только настроить мониторинг:

rate(myapp_http_response_count_total{service="myapp"}[$__interval])

Postgres

Возможности, которые я использую.

Виды визуализации - выбираются тут:

Поиск настройки:

Переменные - пример:

SELECT
  DISTINCT ON (th.tracker_issue_id) tracker_issue_id,
  th.field_value AS status_yesterday
FROM tracker_issue_history th
WHERE th.field_name = 'status' AND th.created_at BETWEEN '${__from:date:YYYY-MM-DD}T10:00:00.242Z' AND '${__to:date:YYYY-MM-DD}T10:00:00.242Z'

Макросы - пример:

SELECT
  $__timeGroupAlias(created_at, $__interval, 0),
  tracker_user_id::varchar AS "metric",
  SUM(field_value::int) AS "value"
FROM tracker_issue_history
WHERE
  $__timeFilter(created_at) AND field_name = 'timespent'
GROUP BY 1,2
ORDER BY 1

Важно:

  • макрос timeGroupAlias это функция, в которую можно передавать аргументы (как и в другим макросы)
  • макрос timeGroupAlias делает значения поля metric отдельным показателем на графике
  • алиасы полей в Графане (AS) имеют большое значение и Графана работает некорректно без них

Чтобы график не прерывался/не смещался вниз, можно сказать, чтобы в случае отсутствия данных он брал предыдущее значение:

$__timeGroupAlias(created_at,$__interval,previous),

ключевое слово: previous 

судя по всему возможны следующие значения:

Собственные переменные:

Собственные переменные - динамичные (значения получаем из данных):

Elastic

Рассмотрим несколько интересных способов.

Таблица на основании обработки ранее заведенных переменных

1. должны быть создана переменная service с обрабатываемыми значениями (см. ниже выпадающий список):

2. настраиваю трансформацию данных: 

График - значения в качестве метрик

Часовые пояса

Графана упорно отправляет данные в Postgres дату времени на 3 часа больше чем сейчас, поэтому приходится вычитать 3600*3:

SELECT
      floor((extract(epoch from created_at) - (3600*3))/60)*60 AS "time",
      count(id) AS "app:links-box"
FROM app_log
WHERE message = 'data-migration:all - finished' AND 
      created_at BETWEEN '${__from:date:YYYY-MM-DDTHH}:00:00' AND '${__to:date:YYYY-MM-DDTHH}:59:59'
GROUP BY created_at
ORDER BY created_at

p.s. тут еще один важный момент - хитрое форматирование даты времени HH}:00:00 (я осознаю, что точность будет в пределах часа), а все дело в том, что графана не поддерживает символ : (colon). 

Однако так, Grafana забирает у нас возможность создавать алерты и говорит: Template variables are not supported in alert queries

Поэтому, чтобы Алерты были доступны Grafana предлагает нам написать этот SQL с помощью конструктора запроса, вот так:

p.s. тут как и выше есть проблема с временем, решается так: created_at - interval '3 hours'

Источники: 1 - 2- 3 - 4- 5 - 6- 7


10.09.2021 21:22

Комментарии

Комментариев пока нет.


Copyrights © 2007 - 2026 YaPro.Ru