Представьте: вы садитесь в машину, поворачиваете ключ (нажимаете кнопку), а двигатель не заводись. Приборная показывает галочку «Check Engine», а может — просто молчит. Что вы делаете? Слушаете звуки, смотрите на датчик уровня топлива, открываете капот, ищете запах бензина. Вы пытаетесь понять внутреннее состояние сложной системы по её внешним проявлениям. Это и есть суть наблюдаемости.

В инженерии и IT этот термин пришёл из теории управления (работа Рудольфа Калмана, 1960 год). Система называется наблюдаемой, если, зная её выходы за конечное время, можно однозначно определить её начальное состояние. В современном DevOps и SRE это переросло в целую дисциплину: умение задавать произвольные вопросы системе без необходимости пересобирать её или добавлять новый код.

Исторический контекст: от ракет до микросервисов

Калман решал задачу управления полётом ракеты «Апполло». Ему нужно было знать точное положение и скорость аппарата, имея только шумные измерения радаров и датчиков. Он доказал: если система линейна и независима от времени, наблюдаемость проверяется рангом матрицы. Звучит сухо, но это фундамент всего: от автопилотов до Kubernetes.

С приходом микросервисной архитектуры количество «движущихся частей» взорвалось. Традиционный мониторинг (дашборды с заранее заданными графиками) перестал справляться. Нельзя заранее предугадать все режимы сбоя распределённой системы. Нужна была возможность «смотреть внутрь» в реальном времени. Так наблюдаемость стала индустриальным стандартом.

⚠️ Внимание: Не путайте наблюдаемость с мониторингом. Мониторинг отвечает на вопрос «всё ли хорошо?» по заранее известным метрикам. Наблюдаемость позволяет ответить «почему это сломалось?» даже для сценария, который вы никогда не видели.

Пример из жизни: умная кофемашина

Давайте перенесём абстракцию на кухню. У вас есть автомат, который делает эспрессо. Вы нажимаете кнопку — это вход. В чашке получается кофе (или нет) — это выход. Внутри: насос, термоблок, мелющийся кофе, трубки, датчики давления и температуры. Вы их не видите.

Утро понедельника. Нажали кнопку — вода течёт, но кофе не выходит. Что вы делаете? Смотрите на дисплей (есть код ошибки?), слушаете звук насоса (гудит или тишина?), проверяете бак с водой, смотрите в контейнер для отварок (мокрый или сухой?). Вы собираете телеметрию вручную.

📊 Какой способ диагностики кофемашины вам ближе?
Смотрю код ошибки на дисплее
Слушаю, как работает насос
Проверяю физические признаки (вода, отвары)
Вызываю мастера / читаю инструкцию

Три столпа: Логи, Метрики, Трассировки

В IT эти действия формализованы в «три столпа наблюдаемости». Давайте сопоставим их с кофемашиной.

  • 📝 Логи (Logs) — дискретные записи событий со временем. Аналог: записная книжка мастера: «10:05 — ошибка E03, низкое давление», «10:07 — пользователь нажал кнопку промывки».
  • 📊 Метрики (Metrics) — числовые значения за интервал. Аналог: дашборд на экране: текущая температура 92°C, давление 9 бар, счётчик чашек 1245, время нагрева 45 сек.
  • 🔗 Трассировки (Traces) — путь одного запроса через все сервисы. Аналог: история одной порции: зёрно попало в жерновку → молотый кофе упал в холдер → насос создал давление → вода прошла через таблетку → эспрессо в чашке. Если где-то застряло — трассировка покажет узкое место.

Важно: ни один столп в одиночку не даёт полной картины. Метрики скажут «давление низкое», но не скажут «почему». Логи скажут «ошибка насоса», но не покажут тренд износа. Трассировка покажет задержку в конкретном запросе, но не системную картину. Только вместе они дают наблюдаемость.

💡

Наблюдаемость — это не набор инструментов, а свойство системы: насколько хорошо вы можете понять её внутреннее состояние, глядя только на выходы.

Медицинская аналогия: врач и пациент

Врач — классический SRE живого организма. Пациент жалуется: «Болит живот». Это alert: high_pain_level. Врач не видит внутренности напрямую (нет дашборда с графиком «состояние аппендикса»). Он использует инструменты наблюдаемости:

  • 🩺 Анамнез (Логи): «Когда началось? Что ели? Болело ли раньше?». Дискретные события во времени.
  • 📈 Витальные функции (Метрики): Температура 38.5, давление 100/60, пульс 110, СО2 98%. Числовые ряды, тренды.
  • 🔬 Анализы и УЗИ (Трассировки/Профилирование): Анализ крови показывает путь воспаления (лейкоциты, С-реактивный белок). УЗИ прослеживает состояние конкретного органа «здесь и сейчас».

Диагноз — это гипотеза о внутреннем состоянии, подтверждённая корреляцией данных трёх типов. Без анализов (трассировок) врач гадает. Без температуры (метрик) — не видит динамику. Без анамнеза (логов) — теряет контекст.

💡

В сложных системах, как и в медицине, «симптомлечение» (подавление алертов) без поиска корневой причины ведёт к хроническим сбоям. Инвестируйте в трассировку запросов — это ваш УЗИ для кода.

Автомобиль: приборная панель vs OBD-II сканер

Приборная панель — это мониторинг. Она показывает: скорость, обороты, уровень топлива, температуру ОЖ. Набор фиксированных дашбордов, заложенных производителем за 3 года до выпуска авто. Она отвечает: «Всё нормально?» (пока лампочки не горят).

Подключаете OBD-II сканер (ELM327 + телефон) — получаете наблюдаемость. Теперь вы видите: коррекция топлива краткосрочная/долгосрочная (STFT/LTFT), заполнение катализатора, температура ЕГР, режим работы лямбда-зонда, коды неисправимых ошибок (pending codes). Вы можете задать системе вопрос: «Почему расход вырос на 2 литра?» и получить ответ, анализируя коррекции топлива в разных режимах.

Характеристика Мониторинг (Панель) Наблюдаемость (OBD-II / IT Stack)
Тип вопросов Заданные заранее (Known Knowns) Произвольные, ад-хок (Unknown Unknowns)
Глубина Агрегированные показатели Детализация до отдельного запроса/цикла
Реакция на новый сбой Требует обновления ПО панели Не требует изменений в коде системы
Пример Лампочка Check Engine График LTFT + лог ошибок + трассировка впрыска
⚠️ Внимание: Наличие логов, метрик и трассировок ещё не гарантирует наблюдаемость. Данные должны быть связаны (correlated): по trace_id вы находите логи, по resource_id — метрики хоста. Без корреляции — просто три кучи данных.

Чек-лист: есть ли у вашей системы наблюдаемость?

☑️ Минимальный набор наблюдаемости для сервиса

Выполнено: 0 / 5

Скрытая сложность: кардинальность и семплирование

Когда сервисов сотни, а запросов — миллионы в секунду, хранение всех трассировок стоит дорого. Включают семплирование (выборку). Но если семплировать случайно — потеряете редкие, а значит, самые интересные ошибки. Нужен tail-based sampling: решение о сохранении трассировки принимается в конце, зная её исход (ошибка/успех, длительность).

Аналогия: камеры наблюдения в магазине. Нельзя хранить видео со всех камер 24/7 годами (стоимость). Но если сработала сигнализация — запись последних 30 минут с всех камер сохраняется гарантированно. Обычные часы — перезаписываются по кругу.

Почему OpenTelemetry стал стандартом?

До 2019 года были OpenTracing (трассировки) и OpenCensus (метрики/логи) — конкуренты. OpenTelemetry объединил их под эгидой CNCF. Теперь это единый SDK/Collector для всех трёх столпов, вендоро-независимый. Если вы начинаете внедрять наблюдаемость сегодня — стартуйте только с OTel. Это избавит от vendor lock-in и переездов.

Культурный аспект: наблюдаемость как мышление

Инструменты (Grafana, Jaeger, Loki, Tempo, Datadog, Honeycomb) — второстепенны. Главное — привычка инструментировать код при написании, а не после инцидента. Разработчик добавляет span.AddEvent("cache_miss", attributes{"key": userID}) так же естественно, как пишет console.log.

В команде с культурой наблюдаемости постмортем инцидента выглядит не как «виноват Вася, не проверил null», а как: «У нас не было видимости в сервисе X при ошибке Y. Добавили атрибут correlation_id в логер, метрику queue_depth в экспортер, включили трассировку для gRPC-вызовов. Теперь такой сбой детектируется за 30 секунд».

⚠️ Внимание: Наблюдаемость имеет цену: накладные расходы на CPU/сеть/диск (обычно 3-10%), стоимость хранения, когнитивная нагрузка на команду. Начинайте с критического пути (Critical User Journey), а не со всего сразу. ROI растёт с покрытием.

Часто задаваемые вопросы (FAQ)

В чём принципиальная разница между мониторингом и наблюдаемостью?

Мониторинг — это пассивное наблюдение за заранее заданными показателями (дашборды, алерты на пороги). Наблюдаемость — это активное исследование: возможность задать системе любой вопрос в момент инцидента, не внося изменений в код. Мониторинг находит «что» сломалось, наблюдаемость помогает понять «почему».

Нужны ли мне все три столпа (логи, метрики, трассировки) сразу?

Для начала достаточно метрик (RED) и структурированных логов. Трассировка даёт наибольший прирост при отладке распределённых систем (микросервисы). Если у вас монолит — начните с логов и метрик, трассировку подключите при росте сложности.

Что такое OpenTelemetry и зачем он мне?

OpenTelemetry (OTel) — это единый стандарт сбора телеметрии (логи, метрики, трассировки) под эгидой CNCF. Он позволяет написать инструментацию один раз и отправлять данные в любой бэкенд (Jaeger, Tempo, Prometheus, Loki, Datadog, Honeycomb и др.) без изменения кода приложения. Это защита от vendor lock-in.

Как обосновать бизнесу затраты на внедрение наблюдаемости?

Считаете MTTR (Mean Time To Resolve) до и после. Обычно внедрение трассировки и коррелированных логов сокращает время расследования инцидентов в 3-5 раз. Переводите это в деньги: минуты простоя продакшена, часы инженеров на дежурстве, репутационные риски. Наблюдаемость — это страховка от долгих простояов.

Можно ли достичь наблюдаемости без распределённой трассировки?

Теоретически — да, если система небольшая и вы отлично знаете код. На практике — в любой системе с >3 сервисами и асинхронной коммуникацией (Kafka, RabbitMQ) отсутствие трассировки превращает отладку в гадание. Трассировка — единственный способ увидеть причинно-следственную цепочку запроса через границы сервисов.

💡

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