Exemplars: как перейти от всплеска на графике сразу к проблемному запросу
Exemplars: как перейти от всплеска на графике сразу к проблемному запросу (удобная штука, как оказалось, но полноценно работает только в Mimir и Prometheus) По метрикам легко определить, что вырос p95 задержки запросов, увеличилась доля ошибок или просела пропускная способность. График, к сожалению, сообщит только факт произошедшей проблемы, но не детали по ней. Дальше идешь и ковыряешь трейсы, ищешь нужный временной интервал и нужные трейсы. Exemplars сокращают эту цепочку до одного клика. Что это такое Exemplar — ссылка на конкретный трейс, сохранённая рядом с метрикой. Кроме значения и времени оно обычно содержит trace_id или span_id и быть может еще какие-то дополнительные атрибуты. Например, в гистограмме мы увидели в бакете запросы с плохим статусом. Exemplar говорит: смотри, вот пример конкретного трейса, он занял 1,82 секунды, а его trace_id — 7f3a…91c2. При этом trace_id не становится обычным лейблом метрики и не создаёт новую серию для каждого запроса. Как внедрить 1. Настройка на уровне инструментирования приложения. Метрика и трейсы должны создаваться в одном контексте. OpenTelemetry может связать метрику с активным трейсом. В Prometheus клиенте можно извлекать идентификаторы трейса из контекста OpenTelemetry. 2. Настройка на уровне бэкенда. Подойдёт Tempo или Jaeger. 3. Включить exemplar storage на уровне Prometheus. В Prometheus для этого используется флаг --enable-feature=exemplar-storage. В Mimir свои настройки. 4. Связать источники данных в Grafana. В настройках Prometheus data source → Exemplars выбрать internal link на Tempo/Jaeger и указать имя метки: например, trace_id. 5. Найти наличие проблемных запросов на гистограмме (предварительно можно проверить, что exemplar появляется в Explore) и, перейти в существующий trace. Exemplar, конечно, не способ найти все связанные трейсы. Это лишь пример, а не архив всех запросов. Если trace отброшен tail-сэмплером, ссылка окажется пустой. По итогу exemplars сравнительно недорогой способ построить прямой путь от графика к конкретному медленному спану. Для лучшего понимания подхода, посмотрите на приложенные к посту скриншоты. ➡️ расскажите в комментариях, если у вас был опыт использования exemplars. Полезные ссылки 🚀 Документация Grafana 🚀 Настройка Prometheus data source 🚀 Exemplar storage в Prometheus 🚀 Спецификация OpenTelemetry 🚀 Пример для client_golang ✅ Telegram | ✅ MAX