Index
Централизованная система распределенной трасировки с использованием OpenTelemetry Collector и Grafana Tempo.
Оглавление
- Описание
- Архитектура
- Быстрый старт
- Команды
- Конфигурация
- Использование
- Troubleshooting
- Best Practices
Описание
OpenTelemetry Collector - централизованный шлюз для сбора, обработки и экспорта телеметрии (трейсы, метрики, логи).
Tempo - высокопроизводительная система хранения распределенных трейсов от Grafana, использующая S3-совместимое хранилище.
Tempo Operator - Kubernetes оператор для управления Tempo через декларативные CR (Custom Resources).
Возможности
- ✅ Централизованный сбор трейсов через OTLP (gRPC/HTTP)
- ✅ Хранение трейсов в MinIO S3 (30 дней retention)
- ✅ Генерация метрик из трейсов (RED: Rate, Errors, Duration) → Victoria Metrics
- ✅ Корреляция трейсов с логами (Loki) и метриками (Victoria Metrics) в Grafana
- ✅ Tail-based sampling и батчинг для эффективности
- ✅ Автоматическое масштабирование компонентов Tempo
- ✅ Prometheus метрики и алерты для всех компонентов
Текущая конфигурация
- Namespace:
tech-tracing - OpenTelemetry Collector: 1 реплика (Deployment), централизованный Gateway
- Tempo Stack: микросервисная архитектура (distributor, ingester, querier, compactor)
- Storage: MinIO S3 (
tempo-tracesbucket) - Retention: 30 дней (720h)
- Span Metrics: экспорт в Victoria Metrics (RED метрики)
- Placement: Может размещаться на любых нодах (masters + workers)
Архитектура
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | |
Поток данных
- Сбор трейсов: Приложения отправляют трейсы через OTLP в OTel Collector
- Обработка: OTel Collector батчит трейсы, генерирует метрики из спанов
- Экспорт трейсов: Трейсы отправляются в Tempo Distributor
- Экспорт метрик: Span метрики отправляются в Victoria Metrics
- Ingestion: Tempo Ingester записывает трейсы в WAL и периодически флашит в S3
- Compaction: Compactor сжимает блоки и применяет retention политики
- Запросы: Querier читает трейсы из S3 для ответа на запросы
- Визуализация: Grafana запрашивает трейсы через Query Frontend
Быстрый старт
Предварительные требования
- Longhorn (для persistent storage)
- MinIO S3 (для хранения трейсов)
- cert-manager (для webhook сертификатов операторов)
- Victoria Metrics (для span метрик)
- Grafana (для визуализации)
- Подготовленные ноды (labels и taints)
1. Подготовка инфраструктуры
1 2 3 4 5 6 7 8 | |
2. Создание S3 bucket
Создайте bucket tempo-traces в MinIO:
1 2 | |
Команда выведет инструкцию по созданию bucket через MinIO Console.
Рекомендуемая квота: 100GB (для 30 дней retention)
3. Установка операторов
1 | |
Это установит:
- Namespace tech-tracing
- Resource policies (LimitRange, ResourceQuota, NetworkPolicy)
- StorageClass longhorn-tracing
- OpenTelemetry Operator
- Tempo Operator
4. Создание S3 credentials secret
1 | |
Команда работает интерактивно: введите MinIO Access Key ID и Secret Access Key когда будет запрошено. Секрет будет создан сразу в кластере.
5. Развертывание Tempo Stack
1 | |
Это создаст TempoStack CR, который автоматически развернет все компоненты Tempo.
6. Развертывание OpenTelemetry Collector
1 | |
Это создаст OpenTelemetryCollector CR с настроенным span metrics processor.
7. Включение мониторинга
1 | |
Это применит: - ServiceMonitors для сбора метрик - PrometheusRules с алертами
8. Обновление Grafana
1 | |
Это обновит Grafana с добавленным Tempo datasource и корреляцией.
9. Проверка статуса
1 | |
Ожидаемый результат:
- OpenTelemetry Operator pod в Running
- Tempo Operator pod в Running
- Tempo Stack components pods в Running
- OTel Collector pods (2 реплики) в Running
- Secret tempo-s3-secret существует
10. Интеграция с приложениями
Обновите конфигурацию ваших сервисов для отправки трейсов в OTel Collector:
1 2 3 4 5 | |
Или через переменную окружения:
1 | |
Команды
Установка и обновление
1 2 3 4 5 6 7 8 9 10 | |
Управление секретами и S3
1 2 | |
Мониторинг и отладка
1 2 3 4 5 6 | |
Удаление
1 | |
Справка
1 | |
Конфигурация
OpenTelemetry Collector
Конфигурация в manifests/otel-collector.yaml:
Mode: Deployment (централизованный Gateway)
Replicas: 1
Resources: - Requests: 100m CPU, 256Mi RAM - Limits: 500m CPU, 1Gi RAM
Receivers: - OTLP gRPC (port 4317) - OTLP HTTP (port 4318)
Processors: - batch: timeout 10s, send_batch_size 1024 - memory_limiter: limit 80%, spike 25% - resource: добавляет cluster.name - spanmetrics: генерирует RED метрики - Dimensions: http.method, http.status_code, service.name - Latency buckets: 2ms → 15s - Metrics exporter: prometheusremotewrite
Exporters: - otlp: → Tempo Distributor (port 4317) - prometheusremotewrite: → Victoria Metrics
Pipelines: - traces: [otlp] → [memory_limiter, resource, batch, spanmetrics] → [otlp] - metrics: [otlp] → [memory_limiter, batch] → [prometheusremotewrite]
Tempo Stack
Конфигурация в manifests/tempo-stack.yaml:
Storage: - Type: S3 (MinIO) - Secret: tempo-s3-secret - StorageSize: 10Gi (ingester WAL + compactor) - StorageClass: longhorn-tracing
Retention: 720h (30 дней)
Components:
| Component | Replicas | CPU Request | Memory Request |
|---|---|---|---|
| Distributor | 1 | 200m | 512Mi |
| Ingester | 1 | 200m | 512Mi |
| Compactor | 1 | 100m | 256Mi |
| Querier | 1 | 200m | 512Mi |
| Query Frontend | 1 | 100m | 256Mi |
| Gateway | 1 | 100m | 128Mi |
Limits: - Max bytes per trace: 5MB - Ingestion rate limit: 15MB/s - Ingestion burst size: 20MB
Observability: - ServiceMonitors: enabled (автоматически) - Search: enabled - Tracing: sampling_fraction 0.1
Span Metrics
OTel Collector автоматически генерирует следующие метрики в Victoria Metrics:
calls_total: - Labels: service_name, span_name, http_method, http_status_code - Description: Количество запросов
duration_milliseconds_bucket: - Labels: service_name, span_name, le (latency bucket) - Description: Histogram latency для p50, p95, p99
duration_milliseconds_sum / duration_milliseconds_count: - Labels: service_name, span_name - Description: Для вычисления average latency
NetworkPolicy
Конфигурация в manifests/networkpolicy.yaml:
Ingress: - Разрешен от всех namespaces на порты 4317/4318 (OTLP) - Разрешен от всех namespaces на порт 3200 (Tempo query) - Разрешен внутренний трафик между компонентами - Разрешен от monitoring namespace для метрик
Egress: - Разрешен к MinIO (tech-minio-tenants:9000) - Разрешен к Victoria Metrics (tech-monitoring:8428) - Разрешен к Kubernetes API (443, 6443) - Разрешен DNS (53)
Использование
Отправка трейсов из приложений
Python (OpenTelemetry SDK):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
Go (OpenTelemetry SDK):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Просмотр трейсов в Grafana
- Откройте Grafana: https://grafana.internal.ai-ops.tech
- Перейдите в Explore (левое меню)
- Выберите datasource: Tempo
- Введите search criteria или trace ID
- Просмотрите трейс в UI
Корреляция с логами: - Кликните на span → "Logs for this span" - Автоматически откроется Loki с отфильтрованными логами
Корреляция с метриками: - Кликните на span → "Metrics for this span" - Автоматически откроются метрики из Victoria Metrics
Запросы через Tempo API
Поиск трейсов:
1 2 3 4 5 | |
Получение трейса по ID:
1 | |
Метрики из трейсов в Victoria Metrics
Request rate (RPS):
1 | |
Error rate:
1 2 3 | |
Latency p99:
1 2 3 4 | |
Troubleshooting
OTel Collector не запускается
Проблема: Pod в CrashLoopBackOff
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 | |
Tempo Stack не запускается
Проблема: Pods не становятся Ready
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 | |
Трейсы не попадают в Tempo
Проблема: Трейсы отправляются, но не видны в Grafana
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Span метрики не попадают в Victoria Metrics
Проблема: Метрики calls_total, duration_* отсутствуют в VM
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
S3 storage недоступен
Проблема: Ошибки записи в S3
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 | |
Высокая latency запросов
Проблема: Запросы трейсов медленные
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 | |
Best Practices
Sampling
✅ DO: Используйте tail-based sampling для production
OTel Collector поддерживает tail-based sampling для сохранения только интересных трейсов (ошибки, медленные запросы).
❌ DON'T: Не используйте head-based sampling для критичных операций
Head-based sampling может потерять важные ошибки.
Labels и Tags
✅ DO: Используйте low-cardinality tags
1 2 3 4 | |
❌ DON'T: Не используйте high-cardinality tags
1 2 3 4 | |
Правило: Если значение тега может иметь > 1000 уникальных значений, не используйте его как тег. Добавьте как span event или log.
Resource Management
✅ DO: Мониторьте resource usage
1 2 3 4 5 | |
✅ DO: Настройте autoscaling (в будущем)
TempoStack поддерживает HPA для компонентов.
Retention
✅ DO: Настройте retention в соответствии с требованиями
Текущий retention: 30 дней (720h). Для изменения:
1 2 3 4 5 | |
✅ DO: Установите квоту на S3 bucket
Рекомендуемая квота: 100GB для 30 дней retention.
Security
✅ DO: Используйте NetworkPolicy
NetworkPolicy уже настроена и ограничивает трафик.
✅ DO: Регулярно ротируйте S3 credentials
1 2 3 4 5 6 7 | |
❌ DON'T: Не храните credentials в Git
Secret файлы (.yaml.example) должны оставаться примерами.
Интеграция с Grafana
Datasource конфигурация
Tempo datasource уже настроен в monitoring/charts/grafana/values.yaml с:
- tracesToLogsV2: корреляция трейсов → логи (Loki)
- tracesToMetrics: корреляция трейсов → метрики (Victoria Metrics)
- serviceMap: карта сервисов из Victoria Metrics
- search: поиск трейсов в UI
- nodeGraph: визуализация зависимостей
Дашборды
Рекомендуемые Grafana дашборды:
- Tempo: импортируйте из grafana.com (ID: 12634)
- OTel Collector: импортируйте из grafana.com (ID: 15983)
- RED Metrics: создайте кастомный с использованием span metrics