Observability

Observability (Наблюдаемость) — это способность понимать внутреннее состояние системы, анализируя данные, которые она производит, включая логи, метрики и трейсы. Это ключевая концепция в SRE для поддержания надежности систем.

Три столпа наблюдаемости

  • Метрики (Metrics) — числовые данные во времени
  • Логи (Logs) — записи о событиях в системе
  • Трейсы (Traces) — путь запроса через микросервисы

Отличия от мониторинга

  • Мониторинг — отслеживание известных проблем
  • Observability — возможность исследовать неизвестные проблемы
  • Proactive vs Reactive — предвидение vs реагирование
  • Known unknowns vs Unknown unknowns

Компоненты системы наблюдаемости

  • Сбор данных — агенты, SDK, инструментация
  • Хранение — time-series БД, логи, trace stores
  • Анализ — корреляция, алерты, дашборды
  • Визуализация — графики, карты зависимостей

Инструменты observability

  • Prometheus + Grafana — метрики и визуализация
  • ELK Stack — Elasticsearch, Logstash, Kibana для логов
  • Jaeger — распределенная трассировка
  • OpenTelemetry — стандарт телеметрии
  • DataDog, New Relic — коммерческие платформы

Distributed Tracing

  • Span — единица работы в трейсе
  • Trace — полный путь запроса
  • Context propagation — передача контекста между сервисами
  • Baggage — дополнительная информация в трейсе

Применение observability

  • Диагностика проблем производительности
  • Root cause analysis
  • Понимание поведения пользователей
  • Оптимизация системы
  • Планирование мощностей

Реализация в Python

 1# Пример инструментации с OpenTelemetry
 2from opentelemetry import trace
 3from opentelemetry.exporter.jaeger.thrift import JaegerExporter
 4from opentelemetry.sdk.trace import TracerProvider
 5from opentelemetry.sdk.trace.export import BatchSpanProcessor
 6
 7# Настройка трейсинга
 8trace.set_tracer_provider(TracerProvider())
 9tracer = trace.get_tracer(__name__)
10
11jaeger_exporter = JaegerExporter(
12    agent_host_name="localhost",
13    agent_port=6831,
14)
15
16span_processor = BatchSpanProcessor(jaeger_exporter)
17trace.get_tracer_provider().add_span_processor(span_processor)
18
19# Использование в коде
20def process_request(user_id):
21    with tracer.start_as_current_span("process_request") as span:
22        span.set_attribute("user.id", user_id)
23        # Бизнес логика
24        return {"status": "success"}

FAQ

Нужна ли observability для монолитных приложений?

Да, observability полезна для любых систем, но особенно критична для микросервисов из-за их сложности.

Как начать внедрение observability?

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