(удобная штука, как оказалось, но полноценно работает только в 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



