⏱️ Grafana Tempo

Распределённая трассировка: spans, TraceQL, OpenTelemetry и связь с логами.

Шпаргалки · Инфраструктура · #tempo #grafana #tracing #observability

Идея

Трасса (trace) показывает путь одного запроса через сервисы. Состоит из спанов (span): операция, время начала, длительность, атрибуты, родитель. Tempo хранит трассы дёшево (объектное хранилище) и ищет по trace_id и по TraceQL.

Как данные попадают в Tempo

приложение (OpenTelemetry SDK) → OTel Collector / Grafana Alloy → Tempo

Протоколы приёма: OTLP (gRPC 4317, HTTP 4318), Jaeger, Zipkin. Просмотр: Grafana → Explore → источник Tempo.

Настройка приложения (переменные OpenTelemetry)

OTEL_SERVICE_NAME=checkout
OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318
OTEL_TRACES_SAMPLER=parentbased_traceidratio
OTEL_TRACES_SAMPLER_ARG=0.1          # 10% запросов

Запросы TraceQL

{ resource.service.name = "checkout" }
{ resource.service.name = "checkout" && status = error }
{ span.http.status_code >= 500 }
{ duration > 2s }
{ span.db.system = "postgresql" } | count() > 3
{ name = "POST /pay" } >> { span.db.system = "redis" }     # потомок

Основные поля

Поле Смысл
resource.service.name сервис
name имя спана
duration длительность
status ok, error, unset
span.<атрибут> атрибут спана
kind server, client, producer…

Связь с остальным

  • Логи → трасса: пишите trace_id в каждую строку лога, в Loki настройте derived field.
  • Трасса → логи: в источнике данных Tempo включите «Trace to logs».
  • Метрики → трасса: exemplars в Prometheus ведут из графика к конкретной трассе.
  • Service graph и span metrics строят карту сервисов и RED-метрики из трасс.

Приёмы

  • Семплируйте: сохранять все трассы дорого. Tail sampling оставляет медленные и с ошибками.
  • Передавайте контекст (traceparent) между сервисами и через очереди.