Здесь я буду собирать полезную информацию по использованию данного продукта.
Настройка панели с собственным временем (относительно текущего):

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
На примере ниже указанного графика видно, что:

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

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

Test rule - кнопка слева внизу, которая поможет понять, какой запрос отправляет Графана и какой ответ получает
Теперь опишем поля ввода:
1. название alert-a
2. как часто проверять значение Х (должно быть кратно 10 секундам, например 30s) - если обнаружится нарушение (Conditions=true) то оповещение переходит в состояние PENDING
3. сколько времени ждать прежде чем отправить алерт (если с момента установки состояния в PENDING прошло указанное тут время, то будет отправлена нотификация), например рассмотрим настройку указанную на скриншоте:
| Минута | Condition | Статус | Alert | Причина |
|---|---|---|---|---|
| 00 | false | OK | не отправлен | |
| 01 | true | PENDING | не отправлен | ждем еще 2 минуты |
| 02 | true | PENDING | не отправлен | ждем еще 1 минуту |
| 03 | true | ALERTING | отправлен | время ожидания вышло |
4. Condition - настройка условия срабатывания alert-а
5. как считать значение Х (при котором сработает alert):
6. какое query использовать для получения значения Х (список значений формируется на вкладке Query)
7. start_time — время, с которого нужно вести расчёт (относительно текущего времени, например, 15m — за 15 минут до текущего времени)
8. end_time — время, до которого нужно вести расчёт (относительно текущего времени в формате now-<time>, например, now-5m — за 5 минут до текущего времени)
заметка, если сейчас 10:00 то:
9. какой логический оператор для проверки значения Х (чтобы сработал alert)
10. при каком значении Х должен сработать alert (критичное значение)
11. действие графаны, если в grafana не смогла получить данные из источника данных
12. действие графаны, если в grafana возникла ошибка или сработал таймаут получения данных из источника данных
Нюансы:

Графана отправляя запрос каждую минуту, отправляет его не всегда ровно в 0 секунд, например (5-ти минутное условие):
| Человеко-понятный вид | timestamp + milliseconds | |
|---|---|---|
| from | March 27, 2023 12:10:45.523 | 1679919045523 |
| to | March 27, 2023 12:15:45.523 | 1679919345523 |
Итог: графана не способна отправлять значения с ровными минутами (минута и 0 секунд), поэтому если база сама не округляет from и to до 0 секунд с группировкой данных по минутам, то алертинг бесполезен (например Elastic не округляет).
Пункты 6 и 7 создают промежуток времени для выборки данных. Например на вкладке Query указан Interval=1m и запрос WHERE field BETWEEN '00:00:30' AND '00:02:30' возвратит три строки из базы данных Elastic:
| Время | Значение | Значение получено за время |
|---|---|---|
| 00:01:00 | 1 | с 00:00:30 по 00:01:00 |
| 00:02:00 | 2 | с 00:01:00 по 00:02:00 |
| 00:03:00 | 1 | с 00:02:00 по 00:02:30 |
Итог: графана не способна сама разделить вторую минуту на две части, чтобы сформировать 2 значения за каждую минуту.
Еще пример: выбираем значение для диапазона в 5 минут, мы видим 6 значений (points), в первом и последнем из которых данные не за всю минуту, а за промежуток указанный Графаной (оставшиеся 30 секунд первой минуты и первые 29 секунд последней минуты):

Оказывается, Графана не хранит никаких состояний и наивно полагать, что функция percent_diff будет вычислять разницу между значениями, которые получены в результате некоторого количества запуска проверок.
На самом деле Графана возьмет первое и последнее значение и применит к ним функцию описанную в шаге 5 (в данном случае функцию percent_diff), это и будет Х
Итог: увы, графана не способна складывать все значения в диапазоне, сохранять себе это значение в память, а при следующей проверке применять функцию описанную в шаге 5 к полученным значениям (старому и новому), просто надо помнить, что графана не хранит никакого состояния.
Работает так же как percent_diff, но без учета знака (+-), например Condition : When : percent_diff_abs query(A,5m,now) это число рассчитанное по формуле: (newest - oldest) / math.Abs(oldest) * 100 и так же как и percent_diff бесполезна при использовании Elastic.
Condition : When : count() - основывается не на общем числе данных, а на количестве результатов. Т.е. если указывая для графика интервал в 1m, а в query прописали query(A, 5m, now) - запрос вернет 6 значений (по одному на каждую минуту) и даже если в каждом из значений будет стоять 0, число Х все-равно будет 6. Вот пример для 60 минут (получаем кол-во значений 61, а не сумму значений, бред какой-то):

Итог: получаем Алерт при нормально работающем приложении.
Увы, этот пункт не помогает, если база возвращает а null сразу для всех значений.
Итог: алертинг сработает, это очень странно получать алертинг при некорректной работе бд (увы, даже не знаю, как это побороть).
В 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 | Сумма всех значений в поле |
Интеграция описана, а нам осталось только настроить мониторинг:
rate(myapp_http_response_count_total{service="myapp"}[$__interval])
Возможности, которые я использую.
Виды визуализации - выбираются тут:

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

Переменные - пример:
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
судя по всему возможны следующие значения:

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

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

Рассмотрим несколько интересных способов.
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_atp.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
Комментарии
Комментариев пока нет.