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?
Начни с логирования, добавь метрики для ключевых процессов, затем внедри трейсинг для критических путей.