Неструктурированные логи в свободном формате — бич микросервисной архитектуры. Когда запрос проходит через 7 сервисов, склеить его историю по текстовому grep невозможно.
Мы внедрили два изменения одновременно:
1. Structured logging в JSON. Все сервисы перешли на единый формат:
// Пример структурированного лога (Go, zerolog)
log.Info().
Str("trace_id", span.SpanContext().TraceID().String()).
Str("span_id", span.SpanContext().SpanID().String()).
Str("service", "order-service").
Str("user_id", req.UserID).
Str("order_id", orderID).
Float64("amount", req.Amount).
Str("currency", "RUB").
Dur("duration_ms", time.Since(start)).
Msg("order created successfully")
// Выход:
// {"level":"info","trace_id":"abc123def456","span_id":"789ghi",
// "service":"order-service","user_id":"u-4521","order_id":"ord-98712",
// "amount":15490.0,"currency":"RUB","duration_ms":42,
// "message":"order created successfully","timestamp":"2026-03-15T14:23:01Z"}
2. Distributed tracing через OpenTelemetry. Каждый запрос получает уникальный trace_id на входе (на Ingress Controller) и передаёт его через все сервисы. В Grafana Tempo мы видим полный waterfall вызовов:
# docker-compose для Tempo (бэкенд трейсинга)
services:
tempo:
image: grafana/tempo:2.4.1
command: ["-config.file=/etc/tempo.yaml"]
volumes:
- ./tempo.yaml:/etc/tempo.yaml
- tempo-data:/var/tempo
ports:
- "4317:4317" # OTLP gRPC
- "4318:4318" # OTLP HTTP
- "3200:3200" # Tempo API
# tempo.yaml
stream_over_http_enabled: true
server:
http_listen_port: 3200
distributor:
receivers:
otlp:
protocols:
grpc:
endpoint: "0.0.0.0:4317"
http:
endpoint: "0.0.0.0:4318"
storage:
trace:
backend: s3
s3:
bucket: tovary-vsem-traces
endpoint: s3.ru-central1.storage.yandexcloud.net
region: ru-central1
wal:
path: /var/tempo/wal
block:
bloom_filter_false_positive: 0.05
metrics_generator:
registry:
external_labels:
source: tempo
cluster: production
storage:
path: /var/tempo/generator/wal
remote_write:
- url: http://prometheus:9090/api/v1/write
Ключевое: в Grafana мы связали логи, метрики и трейсы через trace_id. Клик по трейсу показывает логи всех сервисов в хронологическом порядке, а клик по алерту открывает трейсы с ошибками за нужный период.
Оставить комментарий