Особенности монитора трапов/трейсов


Монитор использует предварительно обработанные данные трапов/трейсов, сохранённые в БД Платформы и прошедшие этапы:

  • Прием

  • Парсинг

  • Обогащение

  • Приведение к требуемому формату

  • Хранение

Функциональные особенности

  1. Аналогия с метрическим монитором:

    • Поддержка агрегированных метрик на основе трапов/трейсов

    • Цикличная работа монитора

  2. Важные отличия от метрического монитора:

    • Источник данных: ClickHouse (для каждого типа монитора своя БД) вместо VictoriaMetrics

    • Разные наборы параметров настройки

Отличия в настройках через UI от метрического монитора

  1. Формирование запроса

    • Скрипт запроса к ClickHouse задаётся в форме полного SQL

Внимание

Для предотвращения негативных последствий монитор должен иметь доступ только на чтение соответствующих БД

  • Отсутствие поддержки полей:

    • «Группировка»

    • «Агрегация»

  • Пользовательские запросы разрешены

  1. Период обновления

    • Минимальный интервал: 5 минут

  2. Обработка NoData

    • Удалён режим: Show last known

    • Добавлен режим: Evaluate as zero - Оценивать как 0 (Default mode)

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

Рассмотрим, например, монитор трапов, который оценивает состояние коммутатора, принимая во внимание только факт наличия/отсутствия события linkUp/linkDown на интервале оценки по правилу:

Результат оценки

Расшифровка

Интерпретация

1

Есть linkDown (a>0), нет linkUp (b=0)

Интерфейс упал → алерт, либо ложное срабатывание, если уже есть алерт

0

Есть linkDown (a>0), есть linkUp (b>0)

Флаппинг, нет реакции

-1

Нет linkDown (a=0), есть linkUp (b>0)

Восстановление после алерта, либо ложное срабатывание, если все уже ОК

NULL

Нет linkDown (a=0), нет linkUp (b=0)

По группе нет данных (NoData), обрабатывается согласно соответствующей настройке

Здесь a - количество трапов с linkDown, b - количество трапов с linkUp по группе на интервале оценки.

Если для такого монитора для режима NoData задана настройка Evaluate as zero, то не будет никакой реакции (монитор воспримет это как флаппинг).

  1. Задержка обработки NoData

    • Минимальное значение: 10 минут

Общие настройки

Настройка прочих параметров идентична метрическому монитору.

Пример общего шаблона запросов к ClickHouse для мониторинга трейсов по http запросам

SELECT
    map(
        'service', group_values.1,
        'host', group_values.2,
        'os_type', group_values.3,
        'span_kind', group_values.4
    ) AS labels,
    <вычисляемое значение> AS value,
    timestamp_max AS timestamp,
    <дополнительные поля>,
    now64(3, 'UTC') AS current_time_utc
FROM (
    SELECT
        tuple(
            ResourceAttributes['service.name'],
            ResourceAttributes['host.name'],
            ResourceAttributes['os.type'],
            SpanKind
        ) AS group_values,
        <агрегатные функции>,
        max(Timestamp) AS timestamp_max
    FROM <имя таблицы>
    PREWHERE 
        Timestamp >= now64(3, 'UTC') - INTERVAL 5 MINUTE
        AND SpanAttributes['http.request.method'] IN ('GET', 'POST', 'PUT', 'PATCH', 'DELETE')
        AND ResourceAttributes['service.name'] != ''
        AND ResourceAttributes['host.name'] != ''
        AND ResourceAttributes['os.type'] != ''
        <дополнительные условия>
    GROUP BY group_values
    HAVING <условие>
)
-- ORDER BY value DESC

Ключевые компоненты структуры

  1. Временной фильтр

Timestamp >= now64(3, 'UTC') - INTERVAL 5 MINUTE
  • Используется UTC для согласования временных зон

  • Интервал может быть адаптирован под требования монитора

  1. Фильтр HTTP-методов

SpanAttributes['http.request.method'] IN ('GET', 'POST', 'PUT', 'PATCH', 'DELETE')
  • Стандартный набор методов для веб-сервисов

  • Возможны кастомизации: отдельные мониторы для критичных методов

  1. Группировка полей

tuple(
    ResourceAttributes['service.name'],
    ResourceAttributes['host.name'],
    ResourceAttributes['os.type'],
    SpanKind
) AS group_values
  • Фиксированный набор из 4 атрибутов:

    1. Имя сервиса (service.name)

    2. Имя хоста (host.name)

    3. Тип ОС (os.type)

    4. Тип спана (SpanKind)

  • Порядок и состав полей могут быть изменены при необходимости

  1. Формат меток (labels)

map('service', group_values.1, ...) AS labels
  • Требуемый формат: Map(String, String)

  • Для меток других типов может потребоваться преобразование toString()

  • Ключи должны соответствовать именам лейблов в мониторе

  1. Основное вычисляемое значение

Тип метрики

Пример использования

Счетчик запросов

count() AS value

Средняя длительность

avg(Duration) AS value

Процент ошибок

100.0 * countIf(Status == 'ERROR') / count()

Количество ошибок

countIf(Status == 'ERROR') AS value

  1. Обязательные поля вывода

labels, value, timestamp
  • Строгий порядок вывода:

    1. labels - метки группы

    2. value - числовое значение метрики

    3. timestamp - максимальное время в группе

  1. Дополнительные поля

now64(3, 'UTC') AS current_time_utc,
tupleElement(group_values, 1) AS service
  1. Сортировка (опционально)

ORDER BY value DESC
  • Стандартная сортировка по убыванию значения

  • Обеспечивает приоритетный показ проблемных групп

Типовые вариации расчета метрик

  1. Процентные метрики (успех/ошибки)

SELECT
    ...,
    countIf(Status == 'SUCCESS') AS success_count,
    count() AS total_count,
    if(total_count > 0, 100.0 * success_count / total_count, 0) AS value
...
  1. Счетчики ошибок

SELECT
    ...,
    countIf(Status == 'ERROR') AS value
...
  1. Средняя длительность

SELECT
    ...,
    sum(Duration) AS total_duration_ns,
    count() AS total_requests,
    total_duration_ns / total_requests AS value
...
  1. Персентили длительности

SELECT
    ...,
    quantile(0.95)(Duration) AS p95_duration
...

Внимание

Все запросы должны включать ограничение по времени (Timestamp >= …) для предотвращения full scan таблиц

Пример запроса

SELECT   -- % успешных запросов от общего количества 
    map(
        'service', group_values.1,
        'host', group_values.2,
        'os_type', group_values.3,
        'span_kind', group_values.4
    ) AS labels,  -- Формат Map(String, String)
    if(total_count > 0, 100.0 * success_count / total_count, 0) AS value,
    timestamp_max AS timestamp,
    success_count,
    total_count,
    group_values.1 AS service,
    group_values.2 AS host,
    group_values.3 AS os_type,
    group_values.4 AS span_kind,
    now64(3, 'UTC') AS current_time_utc
FROM (
    SELECT
        tuple(
            ResourceAttributes['service.name'],
            ResourceAttributes['host.name'],
            ResourceAttributes['os.type'],
            SpanKind  
        ) AS group_values,
        count() AS total_count,
        countIf(
            toUInt16OrZero(SpanAttributes['http.response.status_code']) BETWEEN 200 AND 299
            OR startsWith(SpanAttributes['http.response.status_code'], '2')
        ) AS success_count,
        max(Timestamp) AS timestamp_max
    FROM <имя таблицы>
    PREWHERE 
        Timestamp >= now64(3, 'UTC') - INTERVAL 5 MINUTE
        AND SpanAttributes['http.request.method'] IN ('GET', 'POST', 'PUT', 'PATCH', 'DELETE')
        AND ResourceAttributes['service.name'] != ''  
        AND ResourceAttributes['host.name'] != ''
        AND ResourceAttributes['os.type'] != ''
    GROUP BY group_values
--    HAVING success_count > 0
)
-- ORDER BY value DESC

Рекомендация по оптимизации

Используйте PREWHERE для фильтрации до чтения данных:

PREWHERE 
SpanAttributes['http.request.method'] IN (...)