Разница между мониторингом и наблюдаемостью¶
Про наблюдаемость (observability)¶
"Три столпа наблюдаемости" (метрики, логи и трейсы) - это не "наблюдаемость", это просто телеметрия, это сырой материал, просто набор байтов.
Наблюдаемость - это когда в едином хранилище (а не в трех разных, например, в Prometheus/ELK/Jaeger) хранятся высококонтекстные события (события, которые объединяют логи, метрики и трейсы в одном "обогащенном" событии, wide events) с высокой кардинальностью (user_id, trace_id, cart_id …), эти события собираются один раз и используются в дальнейшем много раз (можно на лету строить запросы), и инженер может задать системе любой вопрос, не предусматривая его заранее в дашборде или алерте, вообще на любой вопрос относительно этой системы.
Наблюдаемость - не замена мониторингу, это его дополнение.
Само понятие "наблюдаемость" берет начало из теории систем управления:
мера того, насколько хорошо внутренние состояния системы могут быть выведены из знаний о ее внешних выходах.
В 2016 году команда Honeycomb развернула это определение и переформулировала его в
способность задавать новые вопросы о вашей системе, без необходимости поставлять новый код или собирать новые данные, чтобы задать эти новые вопросы.
Ben Sigelman в 2021 г. написал статью "Развенчание мифа о трех столпах наблюдаемости", в которой объяснил, что "метрики, журналы и трассировки — это не наблюдаемость, это просто телеметрия".
В 2025 году вышла статья, в которой было предложено называть относящимися к "Observability 1.0" решения, которые тесно связаны с "тремя столпами наблюдаемости" (логи, метрики и трейсы).
К сожалению, тенденция путать наблюдаемость с телеметрией или мониторингом сохранилась, сколько бы лидеры технологической отрасли ни пытались объяснить, что мониторинг может подсказать вам, когда что-то не так, а наблюдаемость позволяет понять, почему.
Observability 2.0 = (wide events + object storage + ad-hoc SQL) × (eBPF-автоинструментация + sampling-as-code) × (error-budget-burn-rate + AI-операторы)
Все остальное - маркетинг.
Наблюдаемость - это когда в одном сообщении у нас есть всё:
{
"timestamp": 1769529618,
"service": "payment-api",
"endpoint": "POST /v2/charge",
"user_id": "user1",
"order_id": "order-42be",
"trace_id": "0x4a6f-b44c",
"parent_span_id": "0x7e2",
"status": "error",
"error_code": "card_declined",
"duration_ms": 142,
"cpu_mcores": 27,
"gc_pause_ms": 3,
"build_id": "1.2.3-4-g42d9",
"region": "mos-1a",
"az": "use1-az1",
"canary": false,
"currency": "RUB",
"amount_rub": 4999,
"risk_score": 0.87,
"experiments": ["exp_checkout_v2", "exp_3ds_off"]
}
Всё, что нужно, уже внутри: - Метрики: duration_ms, cpu_mcores, gc_pause_ms - Лог: status=error, error_code=card_declined - Трейс: trace_id, parent_span_id - Бизнес-контекст: user_id, order_id, amount_rub, risk_score - Инфра: region, az, canary, build_id
И всё это лежит в одном хранилище, "одно хранилище" - object storage + колоночный формат, например, CLickHouse. И с этим можно делать, что хочешь, например, корреляцию с бизнес-метриками (revenue impact) - и директор по финансам получает отчёт в рублях, а не "100500 ошибок в минуту".
sql -- сколько денег потеряли из-за card_declined за последний час SELECT sum(amount_rub)/100 AS lost_rub FROM payment_wide WHERE status='error' AND error_code='card_declined' AND timestamp >= now() - INTERVAL 1 HOUR;
Понедельник, 14:00. Звонок от инцидент-менеджера: "Пользователи не могут создать виртуальные машины в новом регионе, иногда процесс зависает на 20 минут вместо обычной минуты". Иногда. Не всегда. В определенной зоне доступности. Не во всех.
Смотрим на дашборды - там "все зеленое". Доступность API 99,9%, загрузка ресурсов кластера в норме, ошибок в логах наших сервисов нет. По нашим метрикам система абсолютно здорова. Но тикеты от клиентов продолжают поступать.
И вот здесь начинается observability. Нужно найти сбой в сложной цепочке зависимостей, не зная, какое именно звено сломано, или, другими словами, нужно найти иголку в стоге сена, не зная, как выглядит иголка.
Открываю трейсинг. Ищу все операции CreateVirtualMachine за последние два часа, которые длились больше 5 минут. Нахожу 8 из 5000. Доля в 0,16% - понятно, что SLO этого не уловили и p^95 это не показывает.
Анализирую эти зависшие трейсы. Во всех есть общий паттерн: они застревают на этапе выделения сетевого интерфейса. Но не всегда! Только когда машина запускается в зоне доступности pd-39, и только при использовании шаблона с определенным типом GPU.
Иду в логи внутреннего API. Фильтрую по correlation_id проблемных операций. Обнаруживаю, что запрос на создание сети возвращает успешный статус 202 Accepted, но коллбэк о завершении операции не приходит. Проблема только в пуле адресов этой конкретной зоны, и проявляется она лишь при запросе определенного типа ресурсов из-за тонкой race condition в системе оркестрации.
Четыре часа расследования. Без телеметрии: распределенной трассировки, связанных логов и метрик и понимания полного контекста запроса я бы эту проблему не нашел. Все наши внутренние метрики были "зелёными", сбой проявлялся в 0,16% случаев, и только при уникальной комбинации: регион + зона + тип ресурса + шаг выделения сети.
"Всё работает" - это НЕ достаточная метрика.
Все эти слова (observability, monitoring и telemetry) для многих, к сожалению, почти одно и то же, но разница между ними, как между таксистом, который знает дорогу до Кремля, и системой навигации.
Мониторинг: это когда мы знаем, что должно сломаться, и ставим датчик на это место. Это пассивный процесс, проверка заранее известных параметров здоровья системы, мы заранее определяем список вопросов, на которые система должна уметь отвечать "да" или "нет". Мониторинг - это всего дишь процесс, который по заранее заданным правилам сообщает нам когда и что сломалось. Уже сломалось.
Представь, что наш продукт - это хомяк в клетке¶
Мониторинг - это когда мы повесили на клетку датчики¶
Мы смотрим на экран и видим красивые циферки (это наши SLIs, кстати):
- Датчик бега в колесе: 100 оборотов в минуту.
- Датчик температуры тела: 36,6°C.
- Датчик уровня воды в поилке: 80%.
Мы такие: "Ура! Все датчики в норме! Хомяк жив-здоров! Можно идти пить тыквенный латте и писать докладик на очередную конференцию.".
А НА САМОМ ДЕЛЕ: Хомяк уже второй час долбится головой о колесо, у него паническая атака, он дожирает свою подстилку и в глазах у него безумие. Но мы этого не видим, потому что наши датчики не измеряют "уровень паники хомяка". Они показывают, что он "активен", "температура тушки в норме" и "вода в поилке есть".
Мониторинг отвечает на вопрос "что происходит?" по заранее известным сценариям. Всё, что не предусмотрели - остаётся за кадром.
Наблюдаемость (observability) - это когда мы посадили хомяка в прозрачный аквариум с кучей камер и микрофонов¶
Мы не просто смотрим на цветные числа на дашборде. Мы можем задать ЛЮБОЙ, даже самый идиотский вопрос и получить на него ответ из данных, потому что у нас есть не просто датчики, а полная телеметрия всего, что происходит.
- Наши датчики (мониторинг) показывают: "Колесо крутится, уровень воды падает".
- А наблюдаемость позволяет спросить: "А сколько раз за последний час хомяк подбегал к поилке, но не пил, а просто тыкался в неё носом и убегал?"
И система нам ответит: "17 раз. И, кстати, это поведение сильно коррелирует с моментом, когда сосед включил Кадышеву".
Вот это наблюдаемость. Это возможность задавать ad-hoc вопросы о состоянии системы без дополнительных телодвижений.
Теперь приземлим на реальность¶
Допустим, у нас пользователь создает ВМ разных конфигураций.
Мониторинг (что у нас есть):¶
- График "Количество созданных ВМ в час". Падает - всё плохо, алертим. Хотя и неизвестно, может сейчас ночь или новогодние выходные. Все равно алертим, дежурному делать нечего, он разберется.
- График "Время ответа сервера". Растёт - всё плохо, алертим.
- Красная лампочка "База данных не отвечает". Ваще все плохо, алертим.
Это наши датчики на клетке. Они тупо и честно следят за известными метриками.
Наблюдаемость (о чём вы даже не думали, пока не случилась хрень):¶
- Внезапно перестали создаваться ВМ, но все датчики в мониторинге зелёные! Заказы идут, сервер быстрый, база жива. Чё за хтонь?
- Без наблюдаемости мы ходим кругами, зовем все больше и больше народу в ТКС и все вместе думаем и гадаем, в ТКС подключаются большие начальники, задают вопросы, накал растет, инженеры вешаются.
- С наблюдаемостью мы можем спросить систему: "Покажи мне поведение пользователей за последние 6 часов, которые зашли на страницу "Создать ВМ", но не почему-то ничего не создали. Сравни со вчерашним днём".
И система нам выдаёт: "93% таких пользователей спотыкаются на новом шаге "Укажите номер промокода в честь очередной конференции", который кто-то вчера вечером незаметно и мимо стейджа задеплоил из дева сразу в прод. На этом шаге падает promokod.js c ошибкой Promokod is not defined, которую не видно в общих метриках ошибок, потому что никто этого не предусмотрел".
Наблюдаемость это способность системы через свои логи, трейсы и метрики рассказать ПОЧЕМУ она болеет, а не просто констатировать факт, что у неё температура.
Короче говоря:¶
- Мониторинг: мы заранее знаем, на какие вопросы хотим получить ответы, и ставим датчики, которые нам эти ответы дают. ("Жив хомяк?").
- Наблюдаемость: мы не знаем, какие вопросы возникнут завтра, но мы построили систему так, чтобы она могла ответить на ЛЮБОЙ наш вопрос о своём состоянии. ("Почему хомяк, будучи живым, сжёг свою клетку и теперь строит гильотину из опилок?").
Еще короче:
- Мониторинг кричит: "ВСЁ ПРОПАЛО!" когда уже все пропало.
- Наблюдаемость подаёт отчёт: "Вот какой сервис виноват, вот где косяк, вот как это починить. Не благодари".
Теперь, надеюсь, понятно, почему "вроде всё зеленое и работает, но пользователи очень ругаюцца, но мы не понимаем, что сломалось" это не магия, а следствие того, что у нас есть мониторинг, но нет наблюдаемости.
Еще пример: холодильник и шеф-повар¶
Мониторинг холодильника:¶
У нас есть датчики:
- Температура в камере: +4°C (норма).
- Дверь закрыта: Да.
- Компрессор работает: Циклируется штатно.
По мониторингу — всё идеально. Холодильник работает.
А НА САМОМ ДЕЛЕ: Внутри протухшее мясо и адски воняет. Просто потому что кто-то две недели назад забыл его там. Мониторинг не видит качества содержимого.
Наблюдаемость на кухне ресторана:¶
Это когда шеф-повар заходит на кухню и за 5 секунд по косвенным признакам понимает ВСЁ:
- Видит бледное лицо повара-стажёра (метрика).
- Слышит, как сотейник шипит слишком громко (лог).
- Чувствует запах подгоревшего чеснока (трейс).
- Видит, что соус "бешамель" имеет не ту консистенцию (производительность).
Он не просто видит "плита включена". Он понимает контекст и причину проблемы: "Стажёр пересыпал соли в соус, от стресса забыл про чеснок на сковороде, и теперь вся кухня в аду". Это наблюдаемость.
И еще пример: скорая в Москве¶
Мониторинг машины скорой помощи:¶
- Датчик уровня топлива: 70%.
- Датчик давления в шинах: 2,3 атм.
- Датчик скорости: 55 км/ч.
Всё в норме. Машина едет.
А НА САМОМ ДЕЛЕ: Водитель заблудился возле Кремля, навигатор глючит, врачи в панике, а пациент на заднем сиденье уже на полпути в мир иной. Мониторинг не видит миссию.
Наблюдаемость машины скорой помощи:¶
Это когда диспетчер видит у себя на экране:
- Трейс (траектория): машина третий раз объезжает один и тот же квартал.
- Логи (переговоры): водитель по рации матерится и говорит про "сломанный GPS".
- Метрики (состояние): пульс пациента и насышенность крови кислородом с телеметрии с носилок начали падать.
- Контекст: диспетчер видит, что в 500 метрах стоит другая свободная бригада.
Он не просто видит "машина едет". Он понимает полную картину провала миссии и может дать команду: "скорая 145, прекратите петлять и остановитесь! Пациента передавайте экипажу 146, который стоит за углом и через три минуты будет у вас!". Это наблюдаемость.
И еще пример:¶
Представь, что у тебя есть автомобиль.
Мониторинг — это все лампочки на твоей приборной панели.
- Лампочка "Кончается бензин".
- Лампочка "Проверь двигатель".
- Лампочка "Низкое давление масла".
Как это работает:
- Ты знаешь, что бензин может кончиться. Ты ставишь лампочку.
- Ты знаешь, что двигатель может перегреться. Ты ставишь лампочку.
Мониторинг отвечает на вопрос: "Система в норме или нет?"
Главный минус: Он может сказать тебе, что что-то где-то не так (лампочка горит красным), но он не может сказать почему это произошло или как это починить, если это что-то новенькое. Если у тебя взорвалось колесо, а лампочки "взорвалось колесо" на панели нет, мониторинг будет молчать, пока ты не врежешься в столб.
Мониторинг говорит, что система работает.
Наблюдаемость говорит, что система адекватна и выполняет свою бизнес-задачу, а не просто отчётно потребляет ресурсы.
Как начать завтра строить у себя Observability 2.0¶
- Выбрать одно хранилище:
- маленький объём: например, ClickHouse-кластер
- большой объём: Hydrolix/GreptimeDB/и т.п.
- Поставить OpenTelemetry Collector Helm-чарт с
exporter=clickhouse. - Включить eBPF-автоинструментацию на dev.
- Создать одну таблицу
events_wide(timestamp,service,trace_id,…). - Дать инженерам доступ к SQL-консоли и Grafana ClickHouse-datasource.
- Запретить создавать новые дашборды без описания вопроса, который они отвечают.
- Через 2 недели удалить 50 % старых Prometheus-алертов: вы увидите, что они дублируют burn-rate-запросы.
Анти-паттерны, которые убивают 2.0 на корню¶
- "Мы просто добавим ещё одну метрику".
- "А давайте хранить логи в ELK, а трейсы в Tempo".
- "У нас 1000 микросервисов, не потянем кардинальность": используйте sampling и TTL.
- "Безопасники запрещают хранить user_id": хешируйте на лету в Collector, но оставляйте уникальный хеш, иначе теряется смысл.
Что дальше: AI-операторы и "закрытые циклы"¶
Wide events это идеальный материал для LLM-агентов: агент получает естественно-языковый запрос: - "Почему платежи через ХБанк стали падать с 14:30?" - Автоматически генерирует SQL и видит аномальный рост error_code=3ds_failed. - Проверяет последний деплой: build_id=1.2.3 был rolled out в 14:28. - Создаёт откат-PR и поднимает on-call.
Через 5 минут ошибка исчезает, бюджет SLO не тронут. Так это работает в Netflix, Stripe, Shopify и других - у них нет дашбордов, есть query engine + автоматические "исполнители".