Метрики показують аномалію латентності, логи фіксують помилку, але зв'язати їх у єдину картину не вдається. Ми часто стикаємося з такою ситуацією: 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?
- Аудит інструментування: перевіряємо, чи є OTel SDK, Jaeger, Zipkin. Вибираємо стратегію семплювання.
- Деплой Tempo + Collector: розгортаємо у вашому середовищі, налаштовуємо object storage (S3, GCS).
- Налаштування Grafana datasource: конфігуруємо кореляції з Prometheus та Loki.
- Увімкнення metrics_generator: отримуємо автоматичні метрики та service graphs.
- Документація та навчання: передаємо інструкції з додавання трейсингу в нові сервіси.
Що входить в роботу
- Розгортання Tempo та Collector з оптимальною конфігурацією семплювання.
- Інтеграція з існуючим стеком моніторингу (Prometheus, Loki).
- Налаштування алертів на основі трейсів (наприклад, падіння SLO).
- Документація та практичне навчання команди.
- Гарантія коректної кореляції метрик, трейсів та логів.
Терміни: від 2 до 5 днів залежно від складності інфраструктури. Ми – команда з 5+ річним досвідом в observability, впровадили distributed tracing на понад 30 проектах. Оцінимо ваш проект за один робочий день. Отримайте консультацію, щоб обговорити деталі. Зв'яжіться з нами, і ми підберемо оптимальне рішення.







