Когда данные решают: как observability управляет progressive delivery
Вы только что выкатили новую версию приложения. Canary-развёртывание начинает направлять 10 процентов трафика на новые инстансы. Вся команда смотрит на дашборд. Работает? Падает? Продолжать или откатывать?
Без реальных данных вы гадаете. А гадание во время релиза — это то, как мелкие проблемы превращаются в инциденты на проде.
Progressive delivery — называйте это canary, blue-green или поэтапным развёртыванием — работает только если у вас есть надёжный способ измерить, действительно ли новая версия здорова. Решение продолжать, приостановить или откатить должно основываться на чём-то более весомом, чем интуиция или быстрый взгляд на один график.
Четыре сигнала, которые имеют значение во время релиза
Когда новая версия начинает получать трафик, четыре метрики дают полную картину происходящего. Это не экзотические измерения. Это те же сигналы, которые вы уже должны мониторить в проде, но во время progressive-релиза их нужно сравнивать между старой и новой версиями в реальном времени.
Error Rate
Это процент запросов, завершившихся ошибкой, от общего числа запросов к новой версии. Если ваше приложение обычно работает с error rate ниже 0,1 процента, а после выхода новой версии он внезапно подскакивает до 5 процентов — что-то пошло не так.
Скачки error rate могут быть вызваны разными причинами: баг в новом коде, изменение поведения зависимости или несоответствие конфигурации между окружениями. Ключевой момент — видеть разницу между error rate старой и новой версии рядом. Error rate 0,5 процента на новой версии может выглядеть нормально изолированно, но если старая версия работает на 0,05 процента — это десятикратный рост, который стоит расследовать.
Latency
Изменения времени отклика часто становятся первым признаком проблемы, ещё до появления ошибок. Новая версия может добавить медленный запрос к БД, лишний шаг обработки или изменить работу кэша. Пользователи могут не заметить лишние миллисекунды, но когда latency прыгает с 200 миллисекунд до 2 секунд — деградация становится очевидной.
Мониторьте latency на стороне сервера, но и на стороне клиента, если есть возможность. Серверные метрики показывают, как быстро отвечает ваше приложение, а клиентские — что на самом деле испытывают пользователи, включая задержки в сети и время рендеринга в браузере.
Traffic
Эта метрика подтверждает, что ваша конфигурация маршрутизации работает как задумано. Если вы настроили canary на получение 10 процентов трафика, нужно проверить, что 10 процентов запросов действительно попадают на новую версию. Неправильно настроенные балансировщики, липкие сессии или слои кэширования могут привести к неравномерному распределению трафика.
Объём трафика также показывает, справляется ли новая версия с той же нагрузкой, что и старая. Если новая версия начинает сбрасывать соединения или отклонять запросы при том же уровне трафика — это явный признак проблемы с ёмкостью.
Saturation
Saturation измеряет, насколько загружены ресурсы сервера. CPU, память, дисковый ввод-вывод и соединения с БД — всё это нужно мониторить. Если новая версия внезапно использует вдвое больше памяти, чем старая, ваши серверы могут исчерпать ресурсы и упасть.
Saturation часто является опережающим индикатором. Она проявляется до того, как взлетит error rate или вырастет latency. Если вы заметили saturation на ранней стадии, можно приостановить релиз и расследовать проблему до того, как пострадают пользователи.
Установка порогов до релиза
Эти четыре метрики мало что значат без порогов для сравнения. Нужно определить, что значит «здорово», до начала релиза, а не в его разгар, когда все напряжены и мнения разлетаются.
Установите конкретные числа для каждой метрики. Например:
- Error rate не должен превышать 0,5 процента
- Средняя latency не должна увеличиваться более чем на 20 процентов по сравнению со старой версией
- Загрузка CPU должна оставаться ниже 80 процентов
- Использование памяти не должно превышать 90 процентов от доступного объёма
Эти пороги должны исходить из ваших существующих Service Level Objectives (SLO) или исторических данных о нормальном поведении приложения. Если исторических данных нет, начните с консервативных значений и корректируйте по мере накопления опыта.
Пороги также должны учитывать процент трафика. Canary с 5 процентами трафика может не показать проблемы, которые проявляются только под полной нагрузкой. Рассмотрите разные пороги для разных этапов развёртывания или используйте статистические методы, обнаруживающие аномалии даже на малых выборках.
Принятие решений на основе данных
Как только метрики потекли и пороги установлены, процесс принятия решений становится прямолинейным. Не нужно спорить, выглядит ли релиз нормально. Данные говорят сами за себя.
Если все метрики остаются в безопасных границах в течение заданного периода наблюдения — скажем, пяти минут стабильных данных — вы переходите к следующему этапу. Увеличьте процент трафика с 10 до 25 процентов или переключите больше пользователей на новую версию. Затем снова наблюдайте.
Процесс принятия решений следует чёткому потоку на основе четырёх сигналов и их порогов:
Если какая-либо метрика пересекает предупредительный порог, но остаётся ниже критического — приостановите релиз. Не увеличивайте трафик. Не откатывайте пока. Дайте команде время расследовать, реальная ли это проблема или временный всплеск.
Если метрика пересекает критический порог — error rate резко взлетает, latency утраивается или на серверах заканчивается память — откатывайте немедленно. Не ждите совещания. Не спрашивайте разрешения. Данные уже приняли решение.
Автоматизация цикла принятия решений
Ручное принятие решений работает для небольших команд и низкорисковых релизов, но не масштабируется. Люди медленны, непоследовательны и склонны к предвзятости. Тот же человек, который откатывает немедленно в понедельник, может колебаться в пятницу, потому что релиз срочный.
Лучший подход — автоматизировать весь цикл принятия решений. Ваш пайплайн развёртывания должен читать данные observability, сравнивать их с порогами и решать — продолжать, приостановить или откатить — без вмешательства человека.
Это не значит полностью исключить людей из процесса. Это значит переместить человеческое участие туда, где оно приносит наибольшую пользу: определение порогов, анализ паттернов со временем и обработка крайних случаев, которые автоматизация не может предвидеть. Рутинные решения — «достаточно ли здоров этот canary, чтобы увеличить трафик?» — это именно те решения, с которыми компьютеры справляются лучше людей.
Практический чек-лист для вашего следующего релиза
Перед тем как запустить следующий progressive delivery, убедитесь, что эти элементы на месте:
- Error rate, latency, traffic и saturation собираются как для старой, так и для новой версии
- Пороги определены и задокументированы до начала релиза
- Установлено окно наблюдения (сколько ждать перед принятием решения)
- Автоматический откат настроен и протестирован, а не просто спланирован
- Кто-то в команде знает, что делать, если автоматизация выйдет из строя или выдаст ложное срабатывание
Вывод
Observability превращает progressive delivery из игры в угадайку в процесс, основанный на данных. Когда у вас есть метрики в реальном времени, чёткие пороги и автоматизированное принятие решений, вы перестаёте спрашивать «безопасен ли этот релиз?» и начинаете спрашивать «что говорят данные?» Ответ всегда ждёт вас в дашбордах и логах. Сложность в том, чтобы настроить систему слушать.