Example of multi-dimensional alerts on time series data

Этот пример показывает, как одно правило оповещения может генерировать несколько экземпляров оповещений — по одному на каждый набор меток (или временной ряд). Это называется многомерным оповещением: одно правило оповещения, много экземпляров оповещений.

В Prometheus каждая уникальная комбинация меток определяет отдельный временной ряд. Grafana Alerting использует ту же модель: каждый набор меток оценивается независимо, и для каждой серии создаётся отдельный экземпляр оповещения.

Этот шаблон распространён в динамических средах при мониторинге группы компонентов, таких как несколько CPU, контейнеров или доступность по каждому хосту. Вместо определения отдельных правил оповещения или агрегированных оповещений вы настраиваете оповещения по каждому измерению — так вы можете обнаружить конкретные проблемы и включить этот уровень детализации в уведомления.

Например, запрос возвращает одну серию на каждый CPU:

Значение метки cpu Использование CPU в процентах
cpu-0 95
cpu-1 30
cpu-2 85

С порогом > 80 это вызвало бы два экземпляра оповещения для cpu-0 и один для cpu-2.

Examples overview

Представьте, что вы хотите вызывать оповещения, когда использование CPU превышает 80 %, и отслеживать каждое ядро CPU независимо.

Вы можете использовать такой запрос Prometheus:

sum by(cpu) (
  rate(node_cpu_seconds_total{mode!="idle"}[1m])
)

Этот запрос возвращает скорость активного использования CPU по каждому ядру, усреднённую за последнюю минуту.

Ядро CPU Скорость активного использования
cpu-0 95
cpu-1 30
cpu-2 85

Это создаёт одну серию для каждого существующего CPU.

Когда Grafana Alerting оценивает запрос, он создаёт отдельный экземпляр оповещения для каждой возвращённой серии.

Экземпляр оповещения Значение
{cpu=“cpu-0”} 95
{cpu=“cpu-1”} 30
{cpu=“cpu-2”} 85

С условием порога, например $A > 80, Grafana оценивает каждый экземпляр отдельно и вызывает оповещения только там, где условие выполнено:

Экземпляр оповещения Значение Состояние
{cpu=“cpu-0”} 95 Firing
{cpu=“cpu-1”} 30 Normal
{cpu=“cpu-2”} 85 Firing

Многомерные оповещения помогают выявлять проблемы на отдельных компонентах — проблемы, которые можно пропустить при оповещении по агрегированным данным (например, по общему использованию CPU).

Каждый экземпляр оповещения нацелен на конкретный компонент, идентифицируемый по его уникальному набору меток. Это делает оповещения более конкретными и действенными. Например, вы можете задать аннотацию summary в вашем правиле оповещения, которая идентифицирует затронутый CPU:

High CPU usage on {{$labels.cpu}}

В предыдущем примере два сработавших экземпляра оповещения отображали бы summary с указанием затронутых CPU:

  • High CPU usage on cpu-0
  • High CPU usage on cpu-2

Try it with TestData

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

  1. Добавьте источник данных TestData через меню Connections.

  2. Перейдите в Alerting и создайте правило оповещения.

  3. Выберите TestData в качестве источника данных.

  4. Настройте сценарий TestData

    • Scenario: Random Walk
    • Labels: cpu=cpu-$seriesIndex
    • Series count: 3
    • Min: 70, Max: 100
    • Spread: 2
    Generating random time series data using the TestData data source

Reduce time series data for comparison

Пример возвращает три временных ряда, как показано выше, со значениями в пределах выбранного диапазона времени.

Чтобы настроить оповещение по каждой серии, вам нужно свести временной ряд к одному значению, которое условие оповещения может оценить и определить состояние экземпляра оповещения.

Grafana Alerting предоставляет несколько способов сведения временных рядов:

  • Функции запроса источника данных. В предыдущем примере использовалась функция Prometheus sum для суммирования результатов rate по cpu, что давало одно значение на каждое ядро CPU.
  • Выражение Reduce. В разделе запроса и условия Grafana предоставляет выражение Reduce для агрегирования временных рядов.
    • В Default mode вход When выбирает редуктор (например, last, mean или min), и порог сравнивает это сведённое значение.
    • В Advanced mode вы можете добавить выражение Reduce (например, last(), mean()) перед определением порога (условия оповещения).

Для демонстрации этот пример использует Advanced mode с выражением Reduce:

  1. Включите Advanced mode в верхней правой части панели запросов, чтобы разрешить добавление дополнительных выражений.

  2. Добавьте выражение Reduce, используя функцию, например mean(), чтобы свести каждый временной ряд к одному значению.

  3. Определите условие оповещения с помощью Threshold, например $reducer > 80.

  4. Нажмите Preview, чтобы оценить правило оповещения.

    Alert preview using a Reduce expression and a threshold condition
    The alert condition evaluates the reduced value for each alert instance and shows whether each instance is Firing or Normal.

    Tip

    Вы можете изучить этот пример оповещений в Grafana Play.

    Откройте пример, чтобы увидеть результаты оценки оповещений, созданные экземпляры оповещений, временную шкалу истории оповещений и сведения о правилах оповещения.

Learn more

Этот пример показывает, как Grafana Alerting реализует модель многомерного оповещения: одно правило, много экземпляров оповещений, и почему для оценки необходимо свести временные ряды к одному значению.

Дополнительные учебные ресурсы: