Grafana Tempo
Тема дорожной карты · Observability
Grafana Tempo — высокомасштабируемый, экономичный бэкенд распределённой трассировки, хранящий трассировки в объектном хранилище (S3, GCS или Azure Blob), а не в дорогостоящем поисковом индексе. Tempo принимает данные трассировки по протоколам OTLP, Jaeger, Zipkin и Zipkin Thrift, что делает его совместимым с любым инструментированным OpenTelemetry приложением без дополнительных преобразований. В отличие от Jaeger или Zipkin, Grafana Tempo требует trace_id для получения конкретной трассировки — полнотекстовый поиск не поддерживается, — однако этот архитектурный выбор обеспечивает крайне низкие затраты на хранение для крупных сценариев наблюдаемости. Tempo нативно интегрируется с Grafana Loki и Prometheus через эксемпляры и derived_fields, обеспечивая переход в один клик от строки лога или точки данных метрики к соответствующей распределённой трассировке. Как часть стека Grafana LGTM, Tempo конфигурируется через tempo.yaml и может быть развёрнут в виде монолитного бинарника или в режиме микросервисов для горизонтальной масштабируемости.
Как это работает
Grafana Tempo захватывает пути запросов через сервисы. Trace = дерево spans; у каждого span — имя, длительность, атрибуты, parent span. Trace context (traceparent-заголовок по W3C) пробрасывается между сервисами — spans из разных сервисов соединяются в один trace. Storage: Jaeger, Tempo (Grafana-стек, масштабируется через object storage), Zipkin, SigNoz. Sampling at the head (решение per-request) или tail (решение после полного trace).
Когда применять
Tracing — когда сервисов > 2 или нужно дебажить latency. OpenTelemetry SDK + auto-instrumentation для популярных фреймворков (Spring, FastAPI, Express, Gin). Sampling 1-10% в production (head sampling); поднимайте до 100% на короткие debug-сессии. Tempo — если уже на Grafana-стеке; иначе Jaeger / SigNoz оба нормальны.
Типичные ошибки
Ловушки Grafana Tempo: 100% sampling на высоком трафике (storage взрывается + perf-хит); сломанная context propagation (HTTP middleware, стрипающий W3C traceparent — каждый вызов = новый trace); spans без релевантного контекста (service, version, user-segment) — traces сложно фильтровать.