Алерты-выражения
Алерт-выражение вычисляет произвольное выражение на языке запросов и определяет статус алерта на основе результата вычисления. Например, с помощью выражения можно настроить алерт на процентиль по значению множества метрик.
Создание алерта-выражения
Выражение объединяет загрузку данных, их обработку и логику перехода алерта в нужный статус. В этом состоит отличие алерта-выражения от обычного алерта, где запрос и условия срабатывания настраиваются отдельно.
Порядок создания алерта-выражения аналогичен созданию обычного алерта, при этом:
- Вместо запроса задается выражение.
- В условиях срабатывания доступны только два параметра: Окно вычисления и Задержка вычисления.
Примечание
В один алерт или подалерт можно загрузить не более 1 000 метрик. Если нужно выполнять вычисления по большему числу метрик, используйте один из следующих вариантов:
- создайте мультиалерт;
- примените функции агрегации к метрикам, которые передаются в Monium Metrics;
- агрегируйте метрики на стороне клиента (например, в приложении) перед отправкой.
Структура выражения
Выражение — программа, которая последовательно загружает данные, преобразует их и вычисляет итоговое значение или статус алерта. Обычно выражение состоит из селекторов метрик, переменных, функций агрегации и преобразования, арифметических и логических операций, а также функций управления статусами.
Выражение составляется на языке запросов со следующими дополнениями:
-
Переменные — позволяют загружать данные и разбивать выражение на логические шаги:
let <var_name> = <expression>;В переменные можно загружать данные из текущего проекта или из других проектов, к которым у вас есть доступ. Для этого укажите метку
project:let data = { project='my_project', cluster='default', service='my_service', host='*', load_state='DONE' }; -
Комментарии:
let a = 10 + 20; // my comment -
Тип данных — вектор.
Сложный тип Vector
— вектор значений определенного типа, например вектор метрик Vector<Timeseries>или вектор чиселVector<Scalar>.Например, следующее выражение вернет вектор метрик
Vector<Timeseries>с различными значениями меткиhost.{cluster='proxy', service='frontend', host='*', name='exceptionCount'}
Управление статусами алерта
Для управления статусами алерта используются функции:
alarm_if(condition: Boolean): Void
warn_if(condition: Boolean): Void
no_data_if(condition: Boolean): Void
ok_if(condition: Boolean): Void
Если условие condition выполняется, функция прерывает выполнение программы и переводит алерт в соответствующий статус. Функции не возвращают значение, поэтому их результат нельзя присвоить переменной.
Важно
Функцию alarm_if необходимо вызывать раньше warn_if. Иначе в результате сравнения значения с порогом функция warn_if не передаст управление дальше, а переведет алерт в статус OK, так как условие для перехода в статус Warning не будет выполнено и алерт не перейдет в статус Alarm.
Пример программы для выражения
// Если по селектору не найдена ни одна метрика, алерт перейдет в статус No data еще до начала выполнения программы.
let data = {project="my_project", cluster="default", service="my_service", name="sinusoid"};
// Если метрика существует, но в окно вычисления алерта не попало ни одной точки — перевести алерт в статус No data.
no_data_if(count(data) == 0);
// Вычислить среднее значение метрики
let value = avg(data);
alarm_if(value > 100); // Перевести алерт в статус Alarm, если value превышает 100.
warn_if(value > 10); // Перевести алерт в статус Warning, если value превышает 10.
В зависимости от результата вычисления алерт переходит в один из следующих статусов:
No data— если метрика отсутствует в Monium, например удалена по TTL, или во временном окне нет точек.Alarm— если значениеvalueпревышает100. Функцияalarm_ifпрерывает выполнение программы.Warning— если значениеvalueнаходится в диапазоне(10, 100]. Функцияwarn_ifпрерывает выполнение программы.OK— если значениеvalueне превышает10. Программа выполняется до конца.
Описание функций
Функции управления статусами
Примечание
После перехода в статус дальнейшее вычисление алерта прекращается. Поэтому сначала проверяйте условие для alarm_if, а затем — для warn_if.
Например, в следующей программе alarm_if никогда не сработает, потому что выполнение остановится на строке с warn_if:
let x = 10;
warn_if(x > 5);
alarm_if(x > 6);
alarm_if
Переводит алерт в статус Alarm при выполнении условия condition.
alarm_if(condition: Boolean): Void
warn_if
Переводит алерт в статус Warning при выполнении условия condition.
warn_if(condition: Boolean): Void
no_data_if
Переводит алерт в статус No data при выполнении условия condition.
no_data_if(condition: Boolean): Void
ok_if
Переводит алерт в статус OK при выполнении условия condition.
ok_if(condition: Boolean): Void
Функции для работы с историей вычислений
alert_evaluation_history
Возвращает историю вычислений алерта или подалерта в виде временного ряда. Точки ряда появляются с задержкой до одной минуты.
Примечание
Если алерт или подалерт находился под действием мьюта, то в сырых метриках статусов к значению прибавляется 128. Например, у алерта в статусе Alarm со значением 4 значение метрики будет равно 132 (4 + 128).
Функция alert_evaluation_history отбрасывает добавленное значение мьюта и возвращает временной ряд, значения которого соответствуют вычисленным статусам.
Функция имеет следующие варианты использования (перегрузки функции) в зависимости от количества входных параметров:
- alert_evaluation_history(): Timeseries — история вычислений текущего алерта.
- alert_evaluation_history(projectId: String, alertId: String): Timeseries — история вычислений алерта, который не является мультиалертом, в проекте.
alertId— идентификатор алерта,projectId— идентификатор проекта. - alert_evaluation_history(projectId: String, alertId: String, parentId: String): Timeseries — история вычислений подалерта в проекте.
projectId— идентификатор проекта,alertId— идентификатор подалерта,parentId— идентификатор родительского мультиалерта.
В значениях projectId, alertId и parentId допускаются шаблоны (glob-выражения)
Пример использования:
let alert_statuses = alert_evaluation_history();
let problems = heaviside(alert_statuses - 1); // Точки со статусами No data и OK отображаются в 0, статусы Alarm, Warning, Error — в 1.
let good_points = drop_if(problems, data); // Из ряда удаляются точки, в которых алерт был в статусе Alarm, Warning или Error.
multi_alert_evaluation_history
Возвращает историю статусов мультиалерта в виде временного ряда. Точки ряда появляются с задержкой до одной минуты.
Примечание
Если подалерт находился под действием мьюта, к значению метки status добавляется суффикс :MUTED. Например, у замьюченного подалерта в статусе Alarm будет записана метрика со значением метки status=ALARM:MUTED.
Функция multi_alert_evaluation_history имеет следующие варианты использования (перегрузки функции) в зависимости от количества входных параметров:
- multi_alert_evaluation_history(): Vector<Timeseries> — полный набор метрик с числом подалертов во всех статусах.
- multi_alert_evaluation_history(status: String): Timeseries — история вычисления подалертов данного мультиалерта с указанным статусом.
status— интересующий статус подалертов (напримерALARM). - multi_alert_evaluation_history(alertId: String, status: String): Timeseries — история вычисления подалертов другого мультиалерта в текущем проекте с указанным статусом.
alertId— идентификатор алерта,status— интересующий статус подалертов (напримерALARM). - multi_alert_evaluation_history(projectId: String, alertId: String, status: String): Timeseries — история вычисления подалертов другого мультиалерта в другом проекте с указанным статусом.
projectId— идентификатор проекта,alertId— идентификатор алерта,status— интересующий статус подалертов (напримерALARM).
В значениях projectId, alertId и status допускаются шаблоны (glob-выражения)
Пример использования:
let alert_statuses = multi_alert_evaluation_history('ALARM'); // Число подалертов в статусе Alarm.
alarm_if(last(alert_statuses) > 10); // Переводит алерт в статус Alarm, если число подалертов в статусе Alarm больше 10.
Особенности использования функций управления статусами
-
Порядок вызова
alarm_ifиwarn_if.В следующем примере статус
Alarmникогда не будет установлен: приvalue > 100сначала выполнится условиеvalue > 10, и алерт перейдет в статусWarning:let data = {project="my_project", cluster="default", service="my_service", name="sinusoid"}; no_data_if(count(data) == 0); let value = avg(data); warn_if(value > 10); alarm_if(value > 100);Чтобы получить ожидаемое поведение, ограничьте условие
warn_ifдиапазоном или измените порядок вызова функций:let data = {project="my_project", cluster="default", service="my_service", name="sinusoid"}; no_data_if(count(data) == 0); let value = avg(data); alarm_if(value > 100); warn_if((value > 10) && (value <= 100)); -
Переменные после функций управления статусами.
Если переменная объявлена после вызова
alarm_if,warn_if,no_data_ifилиok_if, то при прерывании программы значение переменной будет недоступно в аннотациях.Например, в следующей программе значение
{{expression.valuePretty}}будет подставляться в аннотации только для статусаOK. Для остальных статусов аннотация будет пустой строкой:let data = {project="my_project", cluster="default", service="my_service", name="sinusoid"}; no_data_if(count(data) == 0); let value = avg(data); alarm_if(value > 100); warn_if(value > 10); let valuePretty = to_fixed(100 * value, 2) + '%'; -
Разбиение сложного условия.
С помощью нескольких вызовов
alarm_ifможно разбить сложное условие срабатывания на несколько простых условий и добавить пояснение к каждому из них.Например, условие
(requests < 100) || (errors > 20)можно записать так:... let reason = 'Number of requests is low!'; alarm_if(requests < 100); let reason = 'Number of errors is large!'; alarm_if(errors > 20); let reason = 'Everything is ok';Чтобы сохранить информацию, по какому условию сработал алерт, добавьте в алерт аннотацию со значением переменной
{{expression.reason}}.