Метрики, логи и трассировка: Tempo, Promtail и трассировочные паттерны
Технологии наблюдаемости сегодня строят единый контур, в котором метрики, логи и трассировки взаимно дополняют друг друга. Tempo выступает как центральный хранитель трассировок, Promtail - как надёжный агент сбора логов для Loki, а Grafana - как единая точка визуализации и корреляции данных. В этой главе рассматриваются архитектурные принципы, протоколы передачи, паттерны трассировок и подходы к реализации связки Tempo + Promtail в связке с OpenTelemetry и Loki. Особое внимание уделяется практическим сценариям внедрения, а также рекомендациям по моделированию и оптимизации рабочих процессов observability в современных распределённых системах.
Обеспечение эффективной корреляции между трассировками и логами достигается за счёт единого контекста трассировки (trace context), который распространяется через микросервисы и дополняет логи необходимыми метками. Это позволяет быстро реконструировать путь запроса, анализировать задержки на разных шагах обработки и сопоставлять конкретные события в логе с конкретной трассировкой. В рамках подхода “from zero to professional” акцент делается на архитектуре решений, выборe протоколов и схем интеграции, а также на практических конфигурациях, которые можно адаптировать под реальные проекты.
- Архитектура и принципы: как работает связка Tempo + Promtail/Loki в контекстах Grafana и OpenTelemetry.
- Протоколы и паттерны передачи трассировок: W3C Trace Context, B3, OTLP, Jaeger/Zipkin совместимости.
- Интеграция и конфигурации: как настроить Tempo как хранилище трассировок, как собрать логи через Promtail и связать их с трассировками.
- Практические сценарии внедрения: микросервисы в продакшене, CI/CD пайплайны и принципы корреляции.
- Практические примеры конфигураций и дорожная карта внедрения.
Архитектура наблюдаемости: составные части и принципы взаимодействия
Наблюдаемость в связке Tempo, Promtail и Loki строится на принципе декомпозиции по типам данных и по каналам их поступления:
- Метрики: Prometheus-примеры агрегаций и алертов, которые остаются вне фокусa данной главы, но тесно взаимодействуют с трассировками и логами через контекст. Метрики дают общее состояние системы и помогают определить «узкие места» на уровне производительности, в то время как трассировки показывают путь запроса, а логи - детали исполнения конкретных узлов.
- Трассировки: Tempo принимает трассировки из траекторий, собранных приложениями и агентами типа OTLP/Jaeger. Трассировки хранятся в распределённом хранилище (object storage) и доступны для анализа через Grafana. Tempo уникален тем, что может хранить огромные объёмы трейс-данных без индекса, полагаясь на хранение в облачном/локальном Object Store.
- Логи: Loki собираются Promtail-ом и отправляются в Loki. Логи индексируются не так полно, как в классических системах поиска, но для большинства сценариев достаточно структурирования по полям и меткам, что обеспечивает быстрый доступ к логам, связанным с конкретными трассировками.
- Корреляция контекста: общий контекст трассировки, содержащий trace_id, span_id и дополнительные поля, распространяется между сервисами и записывается в логи (как часть структурированного вывода или в виде дополнительной метки). Это позволяет в Grafana по одному клику перейти от трассировки к связанным логам и обратно.
Ключевые принципы взаимодействия:
- Протоколы передачи: поддержка OTLP (HTTP/gRPC), Jaeger thrift/Zipkin, а также совместимость с OpenTelemetry клиентов. Важнейшая задача - единый идентификатор trace_id, который остаётся константным на протяжении всего жизненного цикла запроса.
- Контекстная пропагация: трассировка должна проникать в каждую часть стека, от фронтенда до бэкенда, включая очереди и фоновые задачи. В логи нужно встраивать trace_id и, по возможности, span_id и уровень ошибок.
- Архитектурная устойчивость: Tempo ориентирован на хранение в объектном хранилище, что обеспечивает масштабируемость и долговременное хранение. Loki и Promtail - на месте сбора и подписки на логи; Grafana обеспечивает просмотр и корреляцию в едином интерфейсе.
Поскольку Tempo не требует сложной индексации, архитектура становится более простой в поддержке на больших нагрузках, но требует продуманной стратегии хранения и уровней кэширования запросов в Grafana. Promtail/ Loki и Tempo дают классический набор инструментов для связки «trace-log-metric» в одном конвейере, соответствующем современным требованиям observability.
Tempo: архитектура, хранение и протоколы
Tempo - это центральный компонент для хранения распределённых трасс. Его архитектура опирается на довольно простую, но эффективную схему:
- Приёмники трасс: Tempo принимает трассировки через различные протоколы (OTLP/GRPC, OTLP/HTTP, Jaeger, Zipkin) и конвертирует их в единый внутренний формат.
- Расслоение по потокам: полученные трассировки направляются в ingester и далее пишутся в распределённое хранилище объектов (S3-compatible, GCS, локальный FS или аналог).
- Хранение: основная часть данных** - это чанки трасс, сохранённые в объектном хранилище. Индексирование может применяться в некоторых сценариях, но Tempo чаще работает без традиционного полноиндексного слоя, полагаясь на эффективное сканирование чанков во время запросов.
- Запросы: querier/frontend элементы отвечают за обработку запросов в Grafana, перебирая сохранённые чанки и возвращая соответствующие фрагменты трасс. В случае больших объёмов данных Tempo поддерживает параллелизм запросов и параллельную загрузку чанков.
- Протоколы и совместимость: Tempo поддерживает OpenTelemetry Protocol и совместим с клиентами Jaeger/Zipkin, что упрощает миграцию и развёртывание в существующих стекaх.
Критически важные решения в архитектуре Tempo:
- Выбор хранилища: S3-compatible, GCS и т. д. Важно обеспечить согласование политики хранения, жизненного цикла и доступа. В продакшене часто применяют несколько копий (хранение в объектном хранилище + резервная копия).
- Стратегия агрегации и выборки: tracing выборки** - на стороне клиента или сервиса. В Tempo можно комбинировать конфигурации, позволяющие не перегружать хранилище непредсказуемыми объёмами трасс.
- Минимальная задержка vs долговременное хранение: необходимо определить баланс между скоростью доступа к трассировкам и стоимостью хранения. Для критических бизнес-процессов полезно сохранять «популярные» трассировки дольше, а прочие - по регламенту.
Пример высокого уровня конфигурации Tempo (идея, без привязки к конкретной инфраструктуре):
storage:
trace:
backend: s3
config:
bucket: tempo-traces
endpoint: s3.your-cloud.local
region: us-east-1
access_key: YOURACCESSKEY
secret_key: YOURSECRETKEY
server:
http_listen_port: 3200
distributor:
ring:
kvstore:
store: inmemory
ingester:
chunk_idle_timeout: 5m
max_chunk_age: 1h
frontend:
compress_responses: true
receivers:
otlp:
protocols:
grpc: {}
http: {}
Этот пример иллюстрирует базовые элементы: прием OTLP, хранение трасс в объектном хранилище и доступ к данным через Grafana. В реальных проектах конфигурация будет дополняться настройками безопасности, а также параметрами масштабирования и мониторинга.
Promtail и Loki: сбор логов и их связь с трассировками
Promtail - агент, ответственный за сбор логов на узлах и передачу их в Loki. В контексте Grafana и Tempo Promtail выполняет роль конвейера, который обеспечивает структурированные логи и релевантные метки для быстрой корреляции с трассировками.
Ключевые аспекты Promtail:
- Сканирование файлов логов и потоков журналирования в реальном времени.
- Парсинг и структурирование данных: Promtail поддерживает плагины pipeline stages, включая извлечение полей из JSON-логов, регулярные выражения, извлечение trace_id и других контекстных полей.
- Лейблы и редейблы: настройка меток на уровне конфигурации для эффективной фильтрации и сопоставления с трассировками. В связке с Tempo можно определить, что trace_id подтягивается и через логи.
- Протокол доставки: Loki принимает логи по HTTP API. Promtail формирует payload и отправляет в Loki через push API.
Типичный сценарий внедрения Promtail/Loki:
- Promtail разворачивается на каждом узле или в контейнере вместе с сервисами.
- Логи сервисов парсятся и отправляются в Loki. В Grafana строится связь между трассировками Tempo и логами Loki через trace_id, если он присутствует как поле лога.
- В Grafana Dashboards формируются связки: по трассировке можно увидеть связанные логи, по логу - трассировку пути исполнения. Это существенно ускоряет детэкшн инцидентов и анализ проблем.
Пример конфигурации Promtail для сбора файловых логов и извлечения trace_id:
server:
http_listen_port: 9080
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki-monitoring.local:3100/loki/api/v1/push
scrape_configs:
- **job_name**: varlogs
static_configs:
- **targets**: ['localhost']
labels:
job: varlogs
__path__: /var/log/*log
- **job_name**: app-logs
static_configs:
- **targets**: ['localhost']
labels:
job: myapp
__path__: /var/log/myapp/*.log
pipeline_stages:
- json:
expressions:
trace_id: trace_id
span_id: span_id
level: level
msg: message
- labels:
trace_id:
span_id:
Далее Promtail отправляет структурированные логи в Loki, а Grafana - через плагин Tempo - связывает события с трассировками. Важное замечание: чтобы обеспечить эффективную корреляцию, trace_id должен быть легко извлекаемым из лога (JSON-поле или поле в сообщении), и прокидываться через сервисы в заголовках и логах.
Трассировочные паттерны: propagate, correlate и оптимизировать сбор
Эффективное использование Tempo требует продуманной концепции трассировок и их корреляции с логами. Ниже представлены ключевые паттерны, применяемые на практике:
- Единый контекст и пропагация: на путях вызовов должен сохраняться trace_id и, при возможности, span_id. Пропагировать контекст можно через заголовки HTTP (W3C Trace Context: traceparent и tracestate) и через форматируемые логи, включающие trace_id.
- Внедрение на уровне сервиса: внедрять OpenTelemetry SDKs в основные языки проекта. OTLP-экспортер направляет трассировки в Tempo, а при необходимости можно добавлять экспорт трассировок в Jaeger/Zipkin для совместимости.
- Стратегии выборки: head-based и tail-based sampling. Head-based - на клиенте/collector уровне, tail-based - на агрегаторе. Tempo, работающий с объектным хранилищем, допускает гибкие политики и минимальные издержки при выборке, но следует учитывать стоимость хранения.
- Корреляция логов и трассировок: лог-строки обогащаются trace_id, а в Grafana строится кросс-таймлайн анализ. В LogQL можно фильтровать логи по trace_id и отфильтровывать по диапазону трассировок.
- Сценарии мониторинга основных сценариев: критически важные потоки - от фронтенда до баз данных - трассируются непрерывно. В логах - выделяются события с ошибками и предупреждениями, соответствующие конкретной трассировке для быстрого воспроизведения проблемы.
Эти паттерны позволяют не только визуализировать путь запроса, но и быстро сопоставлять отклонения в производительности с конкретными логами, что существенно ускоряет RCA (Root Cause Analysis).
Интеграция в Grafana и сценарии внедрения
Чтобы максимизировать ценность observability, необходима выстроенная цепочка внедрения и соответствующая архитектура:
- Инфраструктура: Tempo как основное хранилище трасс, Loki - хранение логов, Prometheus - метрики, Grafana - единая витрина. В большинстве случаев такая связка работает в облаке или в гибридной архитектуре, что обеспечивает масштабируемость и устойчивость.
- Instrumentation: внедрять OpenTelemetry во все критичные сервисы; на старте определить набор критичных путей и сценариев. Примерные языковые SDK: Java, Go, Node.js, Python - с OTLP экспортером.
- Корреляция данных: в логи добавлять trace_id и, при необходимости, дополнительные поля (service.name, hostname, environment). В трассировках - структурировать spans по типам операций, чтобы быстро находить «узкие места».
- Практическая визуализация: в Grafana использовать Dashboards со связкой между Tempo и Loki. Включать фильтры по сервису, окружению, времени и trace_id для детального анализа.
- Безопасность и соответствие: управлять доступом к Tempo/Loki через RBAC, шифрование данных в транзите и на диске, настройку retention policy и регулярное удаление устаревших данных согласно политикам.
С учётом потребностей организации можно выбрать подход с централизованным сбором логов и трассировок или сочетание централизованного и локального сбора. В любом случае критично определить политики хранения и мониторинга использования ресурсов, чтобы инфраструктура observability не стала узким местом по эксплуатации и затратам.
Практическая реализация: дорожная карта внедрения и минимальные конфигурации
-
Подготовка окружения и выбор стека: определить целевые сервисы, языки программирования, требования к задержкам и объёмам данных. Убедиться, что в окружении доступны Tempo, Loki, Prometheus и Grafana. Обеспечить доступ к облачному хранилищу или локальному объектному хранилищу для Tempo.
-
Инструментирование сервисов: внедрить OpenTelemetry SDK и настроить экспорт трассировок через OTLP в Tempo. Обеспечить единый контекст и propagate traceparent trace_id через HTTP/GRPC заголовки.
-
Настройка Tempo: развёрнуть Tempo как централизованный сборщик и хранилище трасс. Проконсультироваться с документацией по конфигурации, выбрать хранилище и политики хранения. Пример конфигурации OTLP receiver приведён выше.
-
Настройка Loki via Promtail: развёрнуть Promtail на узлах, настроить скрипты сбора логов, pipeline stages для извлечения trace_id и отправить логи в Loki. Связать логи и трассировки в Grafana через trace_id.
-
Настройка Grafana Data Sources: добавить Tempo как источник трассировок и Loki как источник логов. Включить Dashboards для мониторинга путей запросов, ошибок и корреляции трассировок с логами.
-
Построение паттернов наблюдаемости: определить набор паттернов для типовых сценариев (пользовательский путь, транзакции, фоновые задания). Настроить стандартные dashboards с фильтрами по trace_id и по логам, относящимся к трассировкам.
-
Поддержка и эволюция: внедрить процессы управления изменениями, регулярную проверку политики выборки, обновления версий инструментов и резервное копирование данных трасс.
Пример минимальной цепи конфигураций (для иллюстрации):
-
Tempo receiver и storage:
## tempo-config.yaml (упрощённый пример) receivers: otlp: protocols: http: {} grpc: {} storage: trace: backend: s3 config: bucket: tempo-traces endpoint: s3.local region: us-east-1 access_key: YOURACCESSKEY secret_key: YOURSECRETKEY server: http_listen_port: 3200 -
Promtail для Loki:
server: http_listen_port: 9080 positions: filename: /tmp/positions.yaml clients: - url: http://loki.local:3100/loki/api/v1/push scrape_configs: - **job_name**: varlogs static_configs: - **targets**: ['localhost'] labels: __path__: /var/log/*log - **job_name**: app-logs static_configs: - **targets**: [] labels: __path__: /var/log/myapp/*.log pipeline_stages: - json: expressions: trace_id: trace_id - labels: trace_id: trace_idЭти фрагменты демонстрируют, как начинается настройка основных компонентов. В реальном проекте конфигурации будут детализированы под конкретную инфраструктуру, с учётом требований к безопасности, мониторингу и устойчивости.
Key takeaways
- Tempo хранит трассировки в объектном хранилище и обеспечивает scalable хранение без необходимости сложного индексирования.
- Promtail в связке с Loki обеспечивает эффективный сбор и поиск логов, с поддержкой структурирования и извлечения контекстных полей для корреляции с трассировками.
- Единый контекст трассировки, распространяемый через сервисы и логи, позволяет быстро идентифицировать путь запроса и его влияние на систему.
- Поддержка OTLP и совместимость с Jaeger/Zipkin упрощают миграцию и интеграцию в существующие стекa observability.
- Практические паттерны выборки, пропагации контекста и корреляции логов и трассировок позволяют оптимизировать сбор данных и снизить стоимость хранения.
- Внедрение должно сопровождаться архитектурной дисциплиной: планирование хранения, политики retention, мониторинг и безопасность данных.
FAQ
- Что такое Tempo и чем он отличается от традиционных трассирующих систем?
Tempo - это легковесный, масштабируемый бекенд для трассировок, ориентированный на хранение без сильного индекса. Это упрощает инфраструктуру и улучшает масштабируемость, позволяя хранить огромные объёмы данных в объектном хранилище. Отличие от полноиндексированных систем состоит в подходе к индексированию и скорости выборки, а также в зависимости от внешних инструментов для анализа трассировок.
- Как Tempo взаимодействует с Prometheus и Grafana?
Tempo используется как источник трассировок в Grafana, который дополняется метриками Prometheus и логами Loki. Grafana обеспечивает унифицированный интерфейс для просмотра трассировок, связанных логов и метрик, что позволяет проводить кросс-доменные анализы.
- Какие протоколы поддержки трассировок наиболее критичны для интеграции?
Наиболее критичны OTLP (HTTP/GRPC), Jaeger и Zipkin, а также совместимость с W3C Trace Context и B3. Эти протоколы обеспечивают гибкость при внедрении и миграции между инструментами.
- Как обеспечить корреляцию трассировок и логов в Promtail/Loki?
Необходимо извлекать trace_id (и при необходимости span_id) из логов на стадии pipeline, добавлять их в лейблы и поля логов, чтобы Grafana могла связать конкретный лог с соответствующей трассировкой.
- Как выбрать стратегию выборки трассировок?
Начать с head-based sampling на клиенте/collector, чтобы ограничить объём трассируемых данных в продакшене. Далее можно применять tail-based или адаптивные политики, учитывая характер нагрузок и критичность сценариев.
- Какие существуют архитектурные паттерны для обеспечения устойчивости?
Варианты включают геораспределённое развёртывание Tempo + Loki, использование multi-region object storage, репликацию, а также ретенцию и политики очистки в соответствии с требованиями компании.
- Какие требования к безопасности и соблюдению норм?
Необходимо обеспечить TLS в транзите, RBAC на Grafana/Loki/Tempo, контроль доступа к данным и политике retention. Шифрование на диске и аудит действий администратора являются важными элементами.
- Какие языковые SDK стоит поддерживать на старте?
OpenTelemetry поддерживает большинство крупных языков: Java, Go, Node.js, Python, C#. Начинать можно с тех языков, которые являются приоритетными в вашем сервисном стеке.
- Какой минимальный набор компонентов нужен для старта?
Tempo для трассировок, Loki через Promtail для логов, Prometheus (для метрик) и Grafana для визуализации. Это обеспечивает базовую связку для корреляции трассировок и логов.
- Какие ключевые показатели эффективности следует мониторить в рамках observability?
Время задержки на ключевых трассах, процент ошибок, объём собираемых трассировок, латентность запросов к Tempo/Loki, стоимость хранения и задержки доступа к данным в Grafana. Регулярная оценка этих метрик поможет своевременно корректировать политику выборки и конфигурации.
Эта глава нацелена на то, чтобы дать практическое понимание того, как архитектурно выстроить связку Tempo + Promtail в Grafana и как выстроить паттерны трассировки, чтобы достигать эффективной корреляции между трассировками и логами. В следующих главах курса будут рассмотрены углублённые примеры и кейсы внедрения в различных рабочих средах, включая микросервисные архитектуры и монолитные приложения с высокой нагрузкой.



