Особенности монитора трапов/трейсов
Монитор использует предварительно обработанные данные трапов/трейсов, сохранённые в БД Платформы и прошедшие этапы:
Прием
Парсинг
Обогащение
Приведение к требуемому формату
Хранение
Функциональные особенности
Аналогия с метрическим монитором:
Поддержка агрегированных метрик на основе трапов/трейсов
Цикличная работа монитора
Важные отличия от метрического монитора:
Источник данных: ClickHouse (для каждого типа монитора своя БД) вместо VictoriaMetrics
Разные наборы параметров настройки
Отличия в настройках через UI от метрического монитора
Формирование запроса
Скрипт запроса к ClickHouse задаётся в форме полного SQL
Внимание
Для предотвращения негативных последствий монитор должен иметь доступ только на чтение соответствующих БД
Отсутствие поддержки полей:
«Группировка»
«Агрегация»
Пользовательские запросы разрешены
Период обновления
Минимальный интервал: 5 минут
Обработка 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, то не будет никакой реакции (монитор воспримет это как флаппинг).
Задержка обработки 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
Ключевые компоненты структуры
Временной фильтр
Timestamp >= now64(3, 'UTC') - INTERVAL 5 MINUTE
Используется UTC для согласования временных зон
Интервал может быть адаптирован под требования монитора
Фильтр HTTP-методов
SpanAttributes['http.request.method'] IN ('GET', 'POST', 'PUT', 'PATCH', 'DELETE')
Стандартный набор методов для веб-сервисов
Возможны кастомизации: отдельные мониторы для критичных методов
Группировка полей
tuple(
ResourceAttributes['service.name'],
ResourceAttributes['host.name'],
ResourceAttributes['os.type'],
SpanKind
) AS group_values
Фиксированный набор из 4 атрибутов:
Имя сервиса (
service.name
)Имя хоста (
host.name
)Тип ОС (
os.type
)Тип спана (
SpanKind
)
Порядок и состав полей могут быть изменены при необходимости
Формат меток (labels)
map('service', group_values.1, ...) AS labels
Требуемый формат: Map(String, String)
Для меток других типов может потребоваться преобразование toString()
Ключи должны соответствовать именам лейблов в мониторе
Основное вычисляемое значение
Тип метрики |
Пример использования |
---|---|
Счетчик запросов |
|
Средняя длительность |
|
Процент ошибок |
|
Количество ошибок |
|
Обязательные поля вывода
labels, value, timestamp
Строгий порядок вывода:
labels - метки группы
value - числовое значение метрики
timestamp - максимальное время в группе
Дополнительные поля
now64(3, 'UTC') AS current_time_utc,
tupleElement(group_values, 1) AS service
Сортировка (опционально)
ORDER BY value DESC
Стандартная сортировка по убыванию значения
Обеспечивает приоритетный показ проблемных групп
Типовые вариации расчета метрик
Процентные метрики (успех/ошибки)
SELECT
...,
countIf(Status == 'SUCCESS') AS success_count,
count() AS total_count,
if(total_count > 0, 100.0 * success_count / total_count, 0) AS value
...
Счетчики ошибок
SELECT
...,
countIf(Status == 'ERROR') AS value
...
Средняя длительность
SELECT
...,
sum(Duration) AS total_duration_ns,
count() AS total_requests,
total_duration_ns / total_requests AS value
...
Персентили длительности
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 (...)