Налаштування Grafana Tempo для розподіленого трейсингу

Коли метрики показують аномалію, а логи фіксують помилку, але пов'язати їх в єдину картину не вдається, на допомогу приходить розподілений трейсинг. Ми налаштовуємо Grafana Tempo для вашого проєкту — від аудиту інструментування до впровадження та навчання команди. Реалізуємо рішення під ключ, забезпечуючи стабільну роботу та подальшу підтримку.
Часті запитання

Метрики показують аномалію латентності, логи фіксують помилку, але зв'язати їх у єдину картину не вдається. Ми часто стикаємося з такою ситуацією: RPS виріс, 99-й перцентиль впав до 800 мс, а причина – в одному запиті, який чіпляє 10 мікросервісів. Без трейсингу знайти цю точку – голка в стозі сіна. Grafana Tempo – бекенд розподіленого трейсингу, який органічно інтегрується з Prometheus та Loki в єдиному інтерфейсі Grafana. Рішення під ключ: від аудиту інструментування до налаштування кореляцій та навчання команди. Замовте аудит вашої системи — отримайте план впровадження за один день. Зв'яжіться, щоб обговорити деталі впровадження.

Як налаштувати Grafana Tempo для розподіленого трейсингу?

Tempo не будує індекси за вмістом трейсів. Він зберігає дані прямо в об'єктному сховищі (S3, GCS), індексуючи лише Trace ID. Це дає радикальне зниження вартості зберігання – до 70% економії порівняно з Jaeger, який потребує Elasticsearch або Cassandra. На практиці Tempo значно дешевший: наприклад, зберігання 1 ТБ трейсів в S3 обходиться в рази менше. Для проекту з 20 мікросервісами та навантаженням 5000 спанів на секунду економія на зберіганні перевищує 2000 доларів на місяць. Мінус – пошук за атрибутами без спеціальної мови запитів неможливий. Однак модель роботи «знайшов аномалію в метриках – перейшов до конкретного трейсу» покриває 90% сценаріїв діагностики. Для ad-hoc пошуку використовуйте TraceQL, доступний з Tempo 2.0.

Tempo vs Jaeger: вартість зберігання

Критерій Jaeger (з Elasticsearch) Tempo (S3)
Вартість зберігання (1 ТБ/міс) Висока Низька (до 90% економії)
Індексація Повна за всіма атрибутами Тільки Trace ID
Пошук за атрибутами Так Через TraceQL або кореляцію
Ретенція Обмежена об'ємом кластера Практично безлімітна

Економія досягається за рахунок відмови від дорогого індексу. Ми використовуємо tail sampling в OpenTelemetry Collector, щоб відфільтрувати шум: всі помилки та повільні запити зберігаються, решта – з ймовірністю 10%. Це ще вдвічі знижує обсяг збережених даних без втрати діагностичної цінності.

Порівняння методів семплювання

Параметр Head-based sampling Tail sampling
Рішення про семплювання На стороні застосунку (до відправки) В Collector (після збору всіх спамів)
Контроль помилок Неможливо гарантувати збереження всіх помилок Можна налаштувати політики (всі помилки зберігаються)
Ресурси Низьке навантаження на Collector Потрібен OTLP-ресивер та буферизація
Гнучкість Фіксована ймовірність Множина політик (latency, status_code)

Для production-середовищ ми рекомендуємо tail sampling – він дає максимальну повноту критичних трейсів.

Інструментування застосунків з OpenTelemetry

Tempo приймає трейси через OTLP (рекомендуємо), Jaeger або Zipkin. Приклад підключення Python:

from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor

provider = TracerProvider()
exporter = OTLPSpanExporter(endpoint="http://otel-collector:4317", insecure=True)
provider.add_span_processor(BatchSpanProcessor(exporter))
trace.set_tracer_provider(provider)

tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("process_order") as span:
    span.set_attribute("order.id", order_id)
    result = process(order_id)

Трейси відправляються в OpenTelemetry Collector, який виконує семплювання та форвардить у Tempo. Ми рекомендуємо використовувати OpenTelemetry як стандарт для інструментування.

OpenTelemetry Collector: центральна точка

---
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
  jaeger:
    protocols:
      grpc:
        endpoint: 0.0.0.0:14250
processors:
  batch:
    timeout: 5s
    send_batch_size: 1024
  tail_sampling:
    decision_wait: 10s
    policies:
      - name: errors-policy
        type: status_code
        status_code: {status_codes: [ERROR]}
      - name: slow-policy
        type: latency
        latency: {threshold_ms: 1000}
      - name: probabilistic
        type: probabilistic
        probabilistic: {sampling_percentage: 10}
exporters:
  otlp/tempo:
    endpoint: http://tempo:4317
    tls:
      insecure: true
service:
  pipelines:
    traces:
      receivers: [otlp, jaeger]
      processors: [batch, tail_sampling]
      exporters: [otlp/tempo]

Деплой Tempo

Розгортання Tempo в Docker Compose
---
services:
  tempo:
    image: grafana/tempo:2.4.0
    command: ["-config.file=/etc/tempo.yaml"]
    volumes:
      - ./tempo.yaml:/etc/tempo.yaml
      - tempo-data:/tmp/tempo
    ports:
      - "3200:3200"
      - "4317:4317"
---
server:
  http_listen_port: 3200
distributor:
  receivers:
    otlp:
      protocols:
        grpc:
        http:
storage:
  trace:
    backend: local # для розробки; в production: s3
    local:
      path: /tmp/tempo/blocks
compactor:
  compaction:
    block_retention: 336h
metrics_generator:
  registry:
    external_labels:
      source: tempo
      cluster: docker-compose
  storage:
    path: /tmp/tempo/generator/wal
  remote_write:
    - url: http://prometheus:9090/api/v1/write
      send_exemplars: true

metrics_generator автоматично створює Prometheus-метрики з трейсів – service graphs та span metrics. Це позбавляє ручного інструментування HTTP-запитів.

Інтеграція Grafana Tempo з Prometheus та Loki

Налаштування datasource в Grafana: вкажіть тип Tempo, URL http://tempo:3200 та в jsonData увімкніть параметри tracesToLogsV2 (UID datasource Loki) та serviceMap (UID Prometheus). Після цього в Explore при кліку на метрику з'являється кнопка «View related traces», а з трейсу – перехід у логи.

TraceQL: пошук трейсів за атрибутами

TraceQL – мова запитів для Tempo, аналогічна PromQL. Приклади: { span.http.status_code = 500 && duration > 2s } { resource.service.name = "order-service" && status = error }

{ .user.id = "12345" }

TraceQL закриває головний недолік Tempo – тепер можна шукати трейси не тільки за ID, але й за довільними атрибутами. Офіційна TraceQL містить повний опис синтаксису.

Як впровадити розподілений трейсинг з Grafana Tempo?

  1. Аудит інструментування: перевіряємо, чи є OTel SDK, Jaeger, Zipkin. Вибираємо стратегію семплювання.
  2. Деплой Tempo + Collector: розгортаємо у вашому середовищі, налаштовуємо object storage (S3, GCS).
  3. Налаштування Grafana datasource: конфігуруємо кореляції з Prometheus та Loki.
  4. Увімкнення metrics_generator: отримуємо автоматичні метрики та service graphs.
  5. Документація та навчання: передаємо інструкції з додавання трейсингу в нові сервіси.

Що входить в роботу

  • Розгортання Tempo та Collector з оптимальною конфігурацією семплювання.
  • Інтеграція з існуючим стеком моніторингу (Prometheus, Loki).
  • Налаштування алертів на основі трейсів (наприклад, падіння SLO).
  • Документація та практичне навчання команди.
  • Гарантія коректної кореляції метрик, трейсів та логів.

Терміни: від 2 до 5 днів залежно від складності інфраструктури. Ми – команда з 5+ річним досвідом в observability, впровадили distributed tracing на понад 30 проектах. Оцінимо ваш проект за один робочий день. Отримайте консультацію, щоб обговорити деталі. Зв'яжіться з нами, і ми підберемо оптимальне рішення.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1141