Настройка Service Structure в Tempo для корректной работы
Полное руководство по настройке Service Structure в Tempo. Решение проблем с service graphs, конфигурация OpenTelemetry и Grafana для корректной визуализации.
Как настроить Service Structure в Tempo для корректной работы?
Я подключил к своему Nuxt проекту Pino + OpenTelemetry для записи трейсов и логов в Loki + Tempo. Все подключено через Grafana, и все данные правильно визуализируются, кроме Service Structure.
Вот мои конфигурационные файлы:
Docker Compose:
tempo:
image: grafana/tempo:latest
restart: unless-stopped
command: ["-config.file=/etc/tempo.yaml"]
volumes:
- ./configs/tempo.yaml:/etc/tempo.yaml:ro
- data-tempo:/var/tempo
networks:
- monitoring
ports:
- "4317:4317" # Для отправки данных GRPC
- "3200:3200" # Для чтения данных
prometheus:
image: prom/prometheus:latest
restart: unless-stopped
command:
- "--config.file=/etc/prometheus/prometheus.yaml" # Путь к конфигу
- "--storage.tsdb.retention.time=15d" # Хранить метрики 15 дней
- "--web.enable-remote-write-receiver"
- "--enable-feature=exemplar-storage"
- "--enable-feature=native-histograms"
volumes:
- ./configs/prometheus.yaml:/etc/prometheus/prometheus.yaml:ro # Основной конфиг
- data-prometheus:/prometheus # Данные TSDB
networks:
- monitoring
ports:
- "9090:9090"
prometheus.yaml:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'tempo'
static_configs:
- targets: ['tempo:3200']
- job_name: 'tempo-usage-metrics'
metrics_path: '/usage_metrics'
static_configs:
- targets: ['tempo:3200']
tempo.yaml:
server:
http_listen_port: 3200
distributor:
receivers:
otlp:
protocols:
grpc:
endpoint: "0.0.0.0:4317"
log_received_spans:
enabled: true
compactor:
compaction:
block_retention: 48h
metrics_generator:
registry:
external_labels:
source: tempo
cluster: docker-compose
storage:
path: /var/tempo/wal
remote_write:
- url: http://prometheus:9090/api/v1/write
send_exemplars: true
traces_storage:
path: /var/tempo/traces
processor:
local_blocks:
filter_server_spans: false
flush_to_storage: true
storage:
trace:
backend: local
local:
path: /var/tempo/traces
wal:
path: /var/tempo/wal
overrides:
defaults:
cost_attribution:
dimensions:
service.name: ""
span.http.target: "service_route"
metrics_generator:
processors: [service-graphs, span-metrics, local-blocks]
generate_native_histograms: both
Как правильно настроить Service Structure в Tempo, чтобы она начала работать?
Для корректной работы Service Structure в Tempo необходимо настроить несколько ключевых компонентов. Ваша конфигурация в целом верна, но есть несколько важных моментов, которые могут вызывать проблемы.
Содержание
- Основные проблемы с Service Structure
- Конфигурация Tempo для Service Graphs
- Настройка OpenTelemetry для корректных меток
- Проверка и отладка Service Graphs
- Настройка Grafana для отображения Service Structure
Основные проблемы с Service Structure
Service Structure в Tempo не работает обычно из-за одной из следующих причин:
- Отсутствие правильных меток
service.nameв трейсах - Неполная конфигурация процессоров в Tempo
- Недостаточное время для генерации service graph данных
- Неправильная настройка Grafana для отображения service graphs
Ваша текущая конфигурация выглядит почти правильно, но требует некоторых доработок.
Конфигурация Tempo для Service Graphs
Ваш tempo.yaml нуждается в следующих изменениях:
server:
http_listen_port: 3200
distributor:
receivers:
otlp:
protocols:
grpc:
endpoint: "0.0.0.0:4317"
http:
endpoint: "0.0.0.0:4318" # Добавлен HTTP receiver
log_received_spans:
enabled: true
compactor:
compaction:
block_retention: 48h
metrics_generator:
registry:
external_labels:
source: tempo
cluster: docker-compose
storage:
path: /var/tempo/wal
remote_write:
- url: http://prometheus:9090/api/v1/write
send_exemplars: true
traces_storage:
path: /var/tempo/traces
processor:
service-graphs:
# Добавлена специфичная конфигурация для service graphs
lookback: 30m
sampling_ratio: 1.0
local_blocks:
filter_server_spans: false
flush_to_storage: true
storage:
trace:
backend: local
local:
path: /var/tempo/traces
wal:
path: /var/tempo/wal
overrides:
defaults:
cost_attribution:
dimensions:
service.name: ""
span.http.target: "service_route"
metrics_generator:
processors: [service-graphs, span-metrics, local-blocks]
generate_native_histograms: both
Ключевые изменения:
- Добавлен HTTP receiver для большей совместимости
- Добавлена специфичная конфигурация для service-graphs processor
- Увеличен lookback период для лучшего охвата данных
Настройка OpenTelemetry для корректных меток
Самая частая причина неработающей Service Structure — отсутствие правильных меток service.name. Убедитесь, что ваш OpenTelemetry конфигурация правильно устанавливает эту метку.
Пример правильной настройки для Nuxt + Pino:
// В вашем OpenTelemetry конфиге
export default defineNuxtPlugin(() => {
const otelConfig = {
serviceName: 'ваше-приложение', // Обязательно уникальное имя
instrumentations: [
new ResourceAttributesInstrumentation({
attributes: {
'service.name': 'ваше-приложение',
'service.version': '1.0.0',
}
})
]
}
// ... остальная конфигурация
})
Важно: Каждая микросервисная часть вашего приложения должна иметь уникальное service.name. Если несколько сервисов используют одно и то же имя, Tempo не сможет правильно построить service graph.
Проверка и отладка Service Graphs
Чтобы убедиться, что Service Structure работает, выполните следующие шаги:
-
Проверьте presence меток:
bash# Запросите трейсы с сервисными метками curl "http://localhost:3200/api/search?query=service.name" -
Проверьте доступность service graph данных:
bash# Проверьте наличие service graph метрик в Prometheus curl "http://localhost:9090/api/v1/label/__name__/values" # Ищите метрики с префиксом 'tempo_service_graph' -
Проверьте логи Tempo:
bash# В логах Tempo должны быть сообщения о генерации service graphs docker logs tempo | grep "service-graphs" -
Дождитесь достаточного времени: Service graphs генерируются асинхронно и могут требовать 5-15 минут для появления после начала сбора трейсов.
Настройка Grafana для отображения Service Structure
В Grafana необходимо правильно настроить dashboard для отображения service graphs:
-
Добавьте Tempo datasource в Grafana
-
Используйте встроенный dashboard для service graphs:
- ID:
16090(Grafana Tempo Service Graph dashboard) - Или создайте свой с использованием следующих запросов:
promql# Запрос для service graph tempo_service_graph_edges_total{service_name!="", job="tempo-usage-metrics"} # Запрос для вершин графа tempo_service_graph_nodes_total{service_name!="", job="tempo-usage-metrics"} - ID:
-
Настройте панель визуализации:
- Используйте плагин Graph или Network Graph
- Настройте правильные параметры отображения
- Убедитесь, что время запроса охватывает период генерации service graphs (не менее 30 минут)
Если после всех этих настроек Service Structure все равно не работает, проверьте:
- Есть ли в трейсах метки
service.name - Все ли сервисы отправляют данные в Tempo
- Нет ли ошибок в логах Tempo и Prometheus
- Достаточно ли данных собрано для построения графа
Обычно проблема решается правильной настройкой service.name меток и ожиданием достаточного времени для генерации service graph данных.