Содержание урока · 10 разделов
Задача в тикете звучит безобидно: «добавьте сервису мониторинг». Через неделю в проекте двести метрик, четыре дашборда по сорок панелей и ни одного человека, который знает, где смотреть, когда сервис грустит. Ошибка не в лени, а в порядке: метрики добавлялись по списку из статьи, а не по вопросам дежурного. Эксплуатация переворачивает постановку: сначала вопрос — «сервис жив и справляется?», потом минимальный набор приборов, который отвечает за полминуты, и только потом роскошь детальных графиков. Весь курс шёл именно к этому порядку: типы метрик, лейблы, гистограммы и PromQL — инструменты, а этот урок — последовательность, в которой их выкатывают в живой сервис без паузы в работе.
Красный метод мониторинга: четыре сигнала#
Название идёт от RED — Rate, Errors, Duration, метода Тома Вилки, описывающего каждый запрос тремя числами: сколько идёт, сколько падает, как долго длится. Четвёртый сигнал добавляет книга Google SRE с её четырьмя золотыми сигналами: traffic, errors, latency, saturation — и это то, что в русскоязычных командах называют красным методом мониторинга целиком. Трафик — сколько работы приходит: RPS, сообщений в секунду, заказов в минуту. Ошибки — какая доля работы падает: пятьсотые статусы, невалидные результаты, отказы зависимостей. Латентность — как быстро отвечает сервис, причём интересен хвост: p99, а не средняя, как объяснял урок про гистограммы. Насыщение — насколько сервис забит: глубина очереди, число обработчиков в работе, длина пула соединений. У родственного USE-метода Брендана Грегга та же логика, только для ресурсов: утилизация, насыщение, ошибки.
Четыре сигнала и их серии#
| Сигнал | Вопрос дежурного | Серия из курса |
|---|---|---|
| Трафик | работа вообще приходит? | rate(http_requests_total) |
| Ошибки | какая доля падает? | rate(http_requests_total{status=~"5.."}) |
| Латентность | насколько медленно? | histogram_quantile по гистограмме |
| Насыщение | не забит ли сервис? | inflight, очередь, go_goroutines |
Порядок внедрения: живой сервис за неделю#
Порядок для существующего сервиса дисциплинирует и время, и объём. День первый — трафик: счётчик http_requests_total с лейблами route, method и status из урока про HTTP-метрики и одна панель суммарного RPS. День второй — ошибки: та же серия, срез по статусам, панель доли пятисотых. День третий — латентность: гистограмма по route с осмысленными бакетами и панель p50 и p99. День четвёртый — насыщение: датчики обработчиков в работе и очередей, плюс бесплатные go_- и process_-метрики из одиннадцатого урока. Дальше — неделя молчания: команда смотрит на дашборд в будни и релизы, запоминает нормальные уровни, и только после этого пишутся алерты. Каждый шаг мелкий и обратимый, а через неделю у сервиса есть то, чего не давали двести метрик из тикета: ответ на вопрос «жив ли он» за один взгляд.
Кейс: метрика молчала, сервис лежал#
Сервис приёма платежей два часа отказывал половине заказов, и дежурство узнало об этом от поддержки. Приборная панель тем временем сияла: процессор на тридцати процентах, память в норме, диск спокойный — ресурсы машины выглядели образцово. Что происходило на деле: внутренняя очередь заказов переполнилась после замедления шлюза, новые заказы стали отваливаться по таймауту, а сервис честно съедал процессор на бесполезных ретраях. Метрика трафика молчала — заказы продолжали приходить, — и именно она не должна была молчать: следить требовалось за глубиной очереди и долей ошибок, то есть за насыщением домена, а не утилизацией железа. Вывод кейса длинной в один абзац: дашборд дежурного начинается с сигналов работы — трафик, ошибки, латентность, насыщение, — а графики CPU и памяти существуют, чтобы объяснить уже найденный симптом, а не найти его.
Какие дашборды первыми#
Первый дашборд — здоровье сервиса, шесть-восемь панелей: RPS суммарно, доля ошибок, p50 и p99, обработчики в работе, глубина очереди, горутины и память, статус readiness из девятнадцатого урока. Критерий качества простой: дежурный отвечает на вопрос «что сломалось» за тридцать секунд без чтения документации. Второй дашборд — разрезы: трафик и ошибки по route из шестого урока с переменной route вверху, как в уроке про Grafana; он отвечает на вопрос «где именно». Третий — релизный: сравнение недель до и после выката, латентность и ошибки по версиям. Дальше панелей больше не нужно, пока не появился новый вопрос: дашборд — это справочник дежурного, а не архив графиков, и на вопрос «зачем эта панель» ответ обязан существовать.
Насыщение: приборы, которые видят очередь#
Насыщение — самый капризный из четырёх сигналов: у него нет универсальной серии, и прибор подбирается под архитектуру. Для веб-сервиса начинается с датчика обработчиков в работе — то, что рантайм знает сам: число одновременных обработок. Дальше по слоям: глубина очереди заказов в памяти или брокере, время, которое сообщение провело в очереди до обработки, занятость пула соединений к базе, число горутин как косвенный след зависших операций. Важно держать в голове различие: латентность запроса отвечает «как быстро обрабатываем», а время в очереди — «как долго ждём», и растёт обычно первым. CPU и память в этот список не входят: утилизация процессора ничего не говорит о забитости до тех пор, пока не упрётся в потолок, — как раз потому, что кейс платежей лежал при тридцати процентах загрузки. Выбор приборов насыщения — это разговор с архитектором на полчаса, потраченный впрок, потому что именно эти панели останавливают инцидент до таймаутов.
Красный метод — первый экран; вторая волна приборов приходит не из статей, а из разборов. Каждый настоящий инцидент заканчивается вопросом: какая серия предупредила бы об этом за десять минут до поддержки, — и ответ превращается в одну новую метрику или панель. Промахи кэша после затычки базы, латентность вызова внешнего шлюза, глубина отставания потребителя очереди, счётчик таймаутов downstream — так по одному за квартал собирается дашборд, который знает ваш сервис лучше любых рекомендаций. Обратное тоже верно: список «полезно собирать всё» из интернета обычно пополняется без инцидентов, а потому без сценариев действия. Спорная граница: метрика без алерта и без читателя всё же может остаться на стенде, где она используется для исследования, — в прод её пропускают только после первого вопроса, который она закрыла. Через полгода такого режима у сервиса остаётся приборная панель, в которой каждая строка помнит свой инцидент, — лучший отбор, известный эксплуатации.
Минимальный набор красного метода
GOvar (
httpRequests = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Запросы по маршруту, методу и статусу",
},
[]string{"route", "method", "status"},
)
httpDuration = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "Латентность запросов",
Buckets: []float64{.01, .025, .05, .1, .25, .5, 1, 2.5},
},
[]string{"route", "method"},
)
inflight = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "http_inflight_requests",
Help: "Обработчики в работе",
})
)
prometheus.MustRegister(httpRequests, httpDuration, inflight)Три объявления закрывают три сигнала из четырёх: счётчик отвечает за трафик и ошибки разом — лейбл status позволяет посчитать долю падений, гистограмма за латентность хвоста. Четвёртый сигнал, насыщение, начинается с датчика обработчиков в работе и растёт в очередь домена. Бакеты выбраны под веб-запросы: от десяти миллисекунд до двух с половиной секунд, с границами вокруг обычных бюджетов.
Алерты после, а не вместе с дашбордом#
Соблазн поставить алерты в первый же день велик, и он ошибочен: без недели наблюдения пороги пишутся из головы, и дежурство учится игнорировать канал. Порядок такой: дашборд, неделя нормальных уровней, затем алерты на то, что уже видели глазами. Первые три алерта типовые. Доля ошибок выше одного процента в течение пяти минут — симптом, который всегда требует действия. p99 выше согласованного бюджета, скажем секунды, в течение десяти минут — пользователи заметили раньше дежурного. И переключатель мёртвой зоны, dead man's switch: постоянное правило, которое горит всегда, а тишину ловит внешний канал — так обнаруживается пропажа самого мониторинга, о чём писал урок про алерты. Всё остальное — алерты на память, горутины, скрейп — добавляется, когда найден их сценарий действия, а не из солидности.
Команда включает экспорт всех метрик подряд — сто серий на хост, каждая с лейблом окружения и имени узла, — и через месяц Prometheus ест гигабайты, а дашборд из сорока панелей никто не открывал. Метрика без вопроса, на который она отвечает, — это расход диска и время скрейпа; кардинальность из семнадцатого урока усугубляет счёт. Граница честная: исследовательский сбор всего оправдан на стенде и на ограниченный срок, когда ищешь, чем болеет сервис, — но в прод попадает только то, у чего есть читатель и вопрос.
Проверка: четыре сигнала
Какой набор сигналов задаёт красный метод в широком смысле?
Проверка: первый шаг в живом сервисе
С чего начинают мониторинг существующего сервиса без метрик?
Доля ошибок на панели
Прочитайте код и выберите, что он выведет:
# RPS ошибок
sum(rate(http_requests_total{status=~"5.."}[5m])) // 20
# RPS всего
sum(rate(http_requests_total[5m])) // 500Панель p99 по гистограмме
Соберите запрос девяносто девятого перцентиля.
Внедрение мониторинга в живом сервисе
Расставьте шаги порядка внедрения.
Строки
Ваша программа
Нажимайте на строки слева, чтобы собрать программу
Карточки: эксплуатация и красный метод
Песочница сайта исполняет только fmt, strings, strconv, math, sort, errors и time, поэтому порядок внедрения проверяется локально: соберите три метрики из этого урока, поднимите сервис из третьего урока и сгенерируйте ошибки таймаутом в зависимости — доля пятисотых на панели обязана вырасти за минуту.
Эксплуатационный порядок собирает курс в последовательность, а итоговый проект — в один файл: там три метрики из этого урока обрастут бизнес-счётчиком и перечнем панелей с тремя алертами. Запросы для панелей — в уроке про PromQL, переменные дашборда — в уроке про Grafana, порог кардинальности — в семнадцатом уроке. Полный маршрут — на странице Prometheus; про порядок middleware, который держит метрики и пробы вне бизнес-логики, — в уроке chi про слои.
Песочница урока
Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +2 XP.
Запустите код, чтобы увидеть вывод.
Коротко: что запомнить
- Красный метод в широком смысле — четыре сигнала: трафик, ошибки, латентность, насыщение.
- Порядок внедрения: счётчик запросов, гистограмма, насыщение, дашборд, неделя наблюдения, алерты.
- Дашборд дежурного — шесть-восемь панелей и ответ за тридцать секунд; разрезы и релизы — вторые дашборды.
- Насыщение домена (очередь, обработчики в работе) важнее утилизации железа: CPU может быть зелёным, пока заказы стоят.
- Алерты пишутся после недели наблюдения: доля ошибок, p99 выше бюджета и dead man's switch.
- Метрика без вопроса — расход диска; исследовательский сбор всего живёт на стенде и временно.
- Ресурсы машины объясняют найденный симптом, а не находят его.
Домашнее задание
Возьмите живой или учебный сервис и проведите его по порядку внедрения: за четыре шага добавьте счётчик с route и status, гистограмму, датчик насыщения и go_-метрики, затем соберите дашборд здоровья из шести панелей. Неделю ведите записи нормальных уровней, после чего напишите три алерта из урока и прогоните каждый по сценарию: какие действия он требует. В конце удалите из проекта одну метрику, у которой нет ни читателя, ни вопроса.
Личные заметкиПусто
Вопросы и ответы по уроку
Чем красный метод отличается от USE?
Направлением взгляда: RED и четыре золотых сигнала смотрят на работу сервиса — сколько пришло, сколько упало, как быстро и насколько забито; USE у Брендана Грегга смотрит на ресурсы — утилизация, насыщение, ошибки процессора, памяти, диска. Дежурство начинает с работы сервиса, ресурсы подключает при объяснении симптома — поэтому красный метод задаёт первый слой панелей.
Почему нельзя ставить алерты сразу?
Порог без наблюдения — это догадка, и она обычно либо будит дежурного по мелочи, либо спит на реальных проблемах. Неделя дашборда даёт нормальные уровни по будням и релизам, после чего порог пишется из факта. Исключение — dead man's switch: ему порог не нужен, он горит всегда и ловит тишину.
Сколько панелей должно быть на дашборде здоровья?
Шесть-восемь, и каждая отвечает на вопрос дежурного: сколько работы, какая доля падений, каков хвост латентности, насколько забит сервис, что с горутинами и памятью, готов ли принимать трафик. Если панель не открывали месяц и у неё нет сценария действия — кандидат на удаление, а не на соседа.
Термины урока
Ключевые понятия из этого урока — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылки на практику.
Изучайте дальше
Следующая ступень учебного пути
WebSocket в Go: real-time чаты и уведомления
Курс WebSocket на Go: gorilla/websocket, эхо-сервер, hub-паттерн, комнаты, авторизация соединений, ping/pong, reconnect и масштабирование. 25 уроков.
- Поднимать WS-сервер и апгрейдить HTTP-соединения
- Писать readPump/writePump без гонок на каждое соединение
- Строить hub: регистрацию, рассылку и комнаты
- Авторизовывать соединения и ограничивать сообщения