Как обеспечить observability для микросервисной архитектуры?

Observability для микросервисной архитектуры — практическое руководство

Observability — это способность понять поведение распределённой системы по её внешним сигналам: метрикам, логам и трассам (the observability triad). Для микросервисов это особенно важно из-за множества сервисов, сетевых вызовов и динамики (autoscale, перезапуски, сетевые partition). Ниже — набор конкретных практик, инструментов и правил, которые реально работают в продакшне.

1. Что собирать (триада)

  • Метрики (metrics): агрегируемые временные ряды — CPU/memory, throughput, error rate, latency per endpoint (p50/p95/p99), queue depth, connection pool usage, business KPIs (payments/sec).

  • Логи (logs): структурированные JSON-логи с timestamp, service, env, level, message, request_id, trace_id, user_context (минимально).

  • Трассировки (traces): распределённые спаны с trace_id, span_id, duration, annotations — путь запроса через сервисы, ошибки и задержки в каждом спане.

2. Инструментирование и контекст

  • Внедрять correlation_id / request_id и передавать его между сервисами (HTTP header, message metadata). Логи и метрики должны содержать этот id.

  • Использовать OpenTelemetry (SDK + collector) для единой телеметрии; экспорты в Prometheus/Loki/Tempo/Jaeger.

  • Авто-инструментирование там, где возможно, но дополнять ручными метриками для бизнес-событий.

3. Tracing & sampling

  • Включить tracing для всех входящих запросов; применять adaptive sampling: 100% для errors, 1–5% для успешных, повышать sampling для новых релизов/canary.

  • Использовать exemplars (Prometheus → exemplars → ссылки на trace) для быстрой навигации от метрики к трассе.

4. Метрики: модель и cardinality

  • Стандартизовать набор label’ей: service, env, region, endpoint, status. Избегать user_id/session_id в лейблах (высокая кардинальность).

  • Использовать histogram для latency (Prometheus histograms + histogram_quantile). Превратить тяжёлые запросы в recording rules (precompute).

5. Логирование: структура и хранение

  • Структурированные логи (JSON), поля: trace_id, request_id, error_code, duration, payload_hash (если нужно).

  • Centralized pipeline: shipper (Fluent Bit) → broker (Kafka) → storage (Loki/Elasticsearch) → long-term S3. Tiering и retention.

6. Dashboards и alerting

  • «Golden signals» dashboard: rate / errors / latency + saturation (CPU, queues). Один экран здоровья сервиса.

  • Alerting на симптомы (p95↑, error rate↑, queue depth↑) и на burn-rate для SLO. Debounce (for) и grouping; алерты всегда с прямой ссылкой на runbook и дашборд.

7. SLO / Error budget

  • Определять SLI (availability, p95 latency) и SLO; визуализировать error budget и настраивать burn-rate алерты, чтобы управлять релизами.

8. Correlation и сервисная карта

  • Генерировать service map / dependency graph (Grafana Tempo/Jaeger, commercial APM). Это ускоряет RCA: куда пошёл запрос и какие зависимости наиболее критичны.

9. Стоимость и retention

  • Разделять retention: hot (metrics 30–90d), logs hot (7–30d) + cold (S3) для долгого хранения. Контролировать cardinality и sampling, использовать downsampling/rollups.

10. Операции и процессы

  • Runbooks привязанные к алертам; автоматизация типовых mitigations (restart pod, scale out).

  • Интегрировать observability в CI (проверка метрик после деплоя, canary analysis).

  • Регулярные drills (GameDays), chaos tests, проверка алертов и playbooks.

11. Безопасность и доступ

  • RBAC на доступ к логам (PII masking), шифрование at-rest/ in-transit, аудит доступа к чувствительной телеметрии.

12. Рекомендуемый стек (пример)

  • Metrics: Prometheus (+ Thanos/VictoriaMetrics для long-term)

  • Dashboards: Grafana (dashboards-as-code)

  • Logs: Fluent Bit → Loki / Elasticsearch (hot) + S3 (cold)

  • Traces: OpenTelemetry Collector → Tempo / Jaeger / commercial APM

  • Alerting: Prometheus Alertmanager → PagerDuty/Opsgenie

13. Быстрый чек-лист при внедрении

  1. Внедрить request_id и трассинг везде.

  2. Инструментировать ключевые SLI и подтвердить исторические уровни.

  3. Собрать «golden signals» дашборд на сервис.

  4. Настроить дебаунс-алерты и runbook linkage.

  5. Ввести SLO и error budget, визуализировать.

  6. Внедрить sampling/exemplars и retention policy.

  7. Регулярно тестировать (load, chaos) и улучшать наблюдаемость по результатам.

Observability — непрерывный процесс: добавляйте релевантные метрики, контролируйте кардинальность, автоматизируйте действия и регулярно проверяйте, что собранные сигналы действительно помогают быстро находить и исправлять проблемы.