Перейти к содержимому
ГоМастер

Поиск по урокам

Найдите урок, курс, термин или раздел

Урок 1 из 25 ~16 мин +20 XP

Знакомство с Prometheus: почему сервис молчит, а падает

Мониторинг go-сервиса начинается там, где кончаются логи: в три ночи важнее не то, какая строка упала, а насколько быстро деградирует система — и это территория Prometheus. Разберём, что такое SLI и SLO, почему Prometheus сам приходит за вашими метриками и как устроен курс.

Содержание урока · 10 разделов

Пятница, вечер релиза. Через двадцать минут после деплоя поддержка пишет: «оплата висит». Вы открываете логи — они есть, строки пишутся, ошибки тоже где-то там, между двумястами тысячами строк успеха. На вопрос «насколько всё плохо?» логи не отвечают: чтобы узнать, что доля неудач выросла за минуту с одного процента до сорока, надо прогнать агрегацию по логам, а это минуты. Пока вы считаете, пользователи уходят. Именно эту дыру закрывают метрики: заранее заведённые числа, которые сервис отдаёт наружу по запросу, а система мониторинга складывает их в базу временных рядов и рисует график за секунду. Prometheus — фактический стандарт таких систем в мире Go: под ним собран Kubernetes, а официальный клиент для Go называется client_golang, и к концу курса вы будете писать сервисы, которые сами рассказывают о себе числами. Начнём со словаря: SLI, SLO, pull-модель — язык, на котором говорят и разработчики, и дежурные.

Мониторинг go-сервиса: логи, метрики, трейсы#

Три столпа наблюдаемости отвечают на три разных вопроса. Логи рассказывают, что именно произошло внутри: конкретная запись с идентификатором заказа и стеком ошибки — про это отдельный курс про структурные логи, если вы ещё не читали. Метрики отвечают на вопросы «сколько» и «как быстро»: запросов в секунду, доля ошибок, время ответа на девяносто девятом перцентиле. Трейсы показывают путь запроса через сервисы: где он застрял, какой из пяти внешних вызовов съел четыреста миллисекунд. Ключевая разница — в цене и скорости. Лог — событие, их миллионы, и запрос к ним стоит секунд и денег на хранение. Метрика — число, которое живёт в памяти как временной ряд, и график по ней строится за миллисекунды. Поэтому при разборе инцидента порядок всегда один: алерт по метрике говорит «доля ошибок выросла», метрика же сужает область — «только у платежей», и уже потом логи объясняют почему. Мониторинг go-сервиса начинается не с логов, а с трёх-четырёх метрик, которые показывают, жив ли сервис и насколько ему плохо.

SLI и SLO: цели, в которых живут метрики#

Без целей мониторинг превращается в коллекцию графиков, на которые никто не смотрит. SLI, service level indicator, — само измерение: доля успешных запросов, девяносто девятый перцентиль латентности, доля ответов быстрее трёхсот миллисекунд. SLO, service level objective, — цель на это измерение: за месяц девяносто девять и девять десятых процента запросов должны получить ответ быстрее трёхсот миллисекунд. Разница между реальностью и целью — бюджет ошибок: пока он не исчерпан, релизиться можно, когда сгорел — команда чинит надёжность вместо фич. Записывается это «девятками»: два девятки — до семи часов недоступности в месяц, три — до сорока трёх минут, четыре — до четырёх с половиной. Каждая девятка стоит дорого, поэтому SLO ставят по данным, а не по амбициям. Для этого курса важна не бухгалтерия, а следствие: чтобы цель вообще можно было проверить, её показатели должны быть метриками — и вы заведёте их уже в первых уроках.

С чего начать: три цели вместо двадцати графиков#

Если SLO в вашей практике пока не прижились, начните с минимального набора, закрывающего большую часть разговоров о здоровье: доступность — доля успешных ответов, латентность — доля ответов быстрее порога, свежесть — возраст последних обработанных событий у фоновых задач. Три измерения, три цели на месяц, одна страница. Остальное — гистограммы, бизнес-числа, перцентили — добавится, когда научитесь на эти три отвечать быстрее, чем падает сервис. Спорное мнение, за которым годы опыта: маленькому сервису SLO нужнее, чем большому. У большого есть дежурные, регламенты и привычка к числам; у маленького вместо них ощущение «вроде нормально», которое разваливается при первом ночном инциденте. Одна строчка цели дисциплинирует разговор о надёжности сильнее любого процесса — а в спорах «четыре девятки или пять» я голосую за четыре: вторая девятка стоит дороже всей остальной разработки.

Pull-модель: Prometheus сам приходит за данными#

Prometheus — система с pull-моделью: он не ждёт, пока сервис пришлёт метрики, а сам раз в интервал делает HTTP GET на адрес цели и читает ответ. Адрес, обычно /metrics, и интервал, по умолчанию одна минута, задаются в конфиге prometheus.yml. Привыкшие к push-моделям сначала путаются: «а если сервис умер, кто-то отправил последнее значение?» В pull-мире ответ элегантнее: если Prometheus не смог забрать метрики — цель помечается как недоступная, и это само по себе метрика, самая важная в вашей системе. Мёртвый сервис виден не по протухшим данным, а по честному значению ноль у метрики up. Второй плюс: сервис ничего не знает о месте хранения — он просто держит HTTP-эндпоинт; Prometheus можно останавливать, переносить, ставить второй — код сервиса не меняется. Цена: за сервисом, который спрятан за NAT, надо строить мосты — pushgateway или сервис-дискавери, это темы второй половины курса. В Go-мире вся подготовка к pull-модели умещается в один хендлер, и увидим мы его через урок.

prometheus.yml: так Prometheus узнаёт про ваш сервис

GO
# prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "shop"
    static_configs:
      - targets: ["localhost:8080"]

Конфиг уровня туториала: раз в пятнадцать секунд Prometheus обращается к localhost:8080 — тому самому /metrics из примеров курса — и складывает ответ в свою TSDB. static_configs — простейший способ перечислить цели руками; в реальном кластере их находят сервис-дискавери. Настройке скрейпинга посвящён отдельный урок второй половины курса.

Так выглядит страница метрик

GO
# HELP shop_orders_total Всего созданных заказов с запуска сервиса.
# TYPE shop_orders_total counter
shop_orders_total 1042
# HELP shop_queue_size Текущая длина очереди заказов.
# TYPE shop_queue_size gauge
shop_queue_size 17

Формат экспозиции — простой текст, который читает и человек, и curl. Строка HELP — человекочитаемое описание, TYPE — тип метрики, дальше имя и значение. Ответ отдаётся с Content-Type text/plain, а более компактную форму сервер и клиент согласуют заголовком Accept. Такой файл покажет любой go-сервис с client_golang — соберём его в третьем уроке.

Кто построил Prometheus и почему ему доверяют#

Prometheus вырос в SoundCloud в 2012 году: инженеры смотрели на внутреннюю систему Google Borgmon и собрали её открытый аналог для своих нужд. С 2016 года проект — второй по счёту выпуск CNCF после Kubernetes, и сегодня это де-факто стандарт мониторинга облачных систем: под ним живут и сам Kubernetes, и большая часть экосистемных компонентов. Для нас важнее другое: у проекта есть официальный клиент для Go — client_golang, библиотека, вокруг которой построен весь курс. Запросы вроде prometheus golang в поисковиках — это обычно поиск именно её: типы метрик, реестр и готовый HTTP-хендлер в одном пакете. Формат экспозиции определён как стандарт, поэтому его понимает любой инструмент — от Grafana до систем алертинга, — и знания переносятся между стеками. Про масштаб тоже честно: собственная TSDB Prometheus заточена под временные ряды и держит сотни тысяч метрик на скромном железе, но не под бесконечную бухгалтерию — долгое хранение отдают внешним системам.

Три источника правды: чем они отличаются#

ИнструментОтвечает на вопросСкорость ответаЦена хранения
Логичто именно произошлосекунды и минутывысокая: каждый запрос — запись
Метрикинасколько плохо и растёт лимиллисекундынизкая: числа в TSDB
Трейсыгде по пути застрял запроссекундысредняя: часть запросов сэмплируется

Инцидент: метрика была, алерта не было#

История, которая объясняет, зачем вся эта дисциплина. У сервиса маркетплейса был образцовый мониторинг: трафик, латентность, очереди, большой экран в переговорке. В ночь распродажи платёжный провайдер начал отбивать часть запросов таймаутами, и метрика доли ошибок честно поползла вверх — с полпроцента до восемнадцати за сорок минут. Звонка не было: алерт стоял на двадцати пяти процентах, до порога значение не дотянуло, а экран в переговорке никто не смотрел — дежурил человек, у которого этот дашборд не был открыт. Сервис лежал два часа, при этом каждая метрика «работала»: данные собирались, графики рисовались, ничего не кричало. Мораль не в том, что метрики не работают, а в том, что работают условия: у метрики должно быть условие срабатывания, канал доставки и человек, который получит уведомление. Как это устроено — отдельный урок про алерты, пока же запомните: зелёный дашборд не отвечает на вопрос, жив ли бизнес.

Проверка: кто инициирует сбор метрик

Как в pull-модели метрики попадают из вашего сервиса в базу Prometheus?

Проверка: SLI против SLO

Утверждение «девяносто девять и девять десятых процента запросов за месяц должны ответить быстрее трёхсот миллисекунд» — это что именно?

Что означает значение счётчика

Прочитайте код и выберите, что он выведет:

# HELP shop_orders_total Всего созданных заказов.
# TYPE shop_orders_total counter
shop_orders_total 812

Соберите фрагмент экспозиции

Восстановите служебные строки формата экспозиции: описание, тип и строку значения.

# shop_orders_total Всего созданных заказов. # TYPE shop_orders_total 812

Соберите путь метрики по цепочке

Расставьте шесть шагов в порядке, как метрика доходит от кода до графика.

Строки

Ваша программа

Нажимайте на строки слева, чтобы собрать программу

Карточки: словарь Prometheus

Термин

Prometheus

нажмите, чтобы перевернуть
Определение

Система мониторинга и алертинга с pull-моделью: сама опрашивает /metrics целей и хранит значения как временные ряды. Родом из SoundCloud 2012, в CNCF с 2016.

1 / 6

Курс — двадцать пять уроков: сначала четыре типа метрик и практика с client_golang, потом лейблы, гистограммы, HTTP-метрики и бизнес-числа, во второй половине — PromQL, Grafana, алерты и итоговый проект с полным мониторингом веб-сервиса. Карта всех тем — на странице курса. Практика пойдёт сразу: в следующем уроке поставим client_golang и за пять минут поднимем первый /metrics endpoint, а перед этим разберём четыре типа метрик — решение, которое принимается до строчки кода. Одна честная оговорка: песочница сайта не умеет TCP-серверы, поэтому код курса запускается локальным Go — установка с go.dev стандартна для всех систем, и примеры дальше проверялись именно так. Логи в этой истории тоже участвуют: их лучше вести структурно, как учит курс про zap, — на стыке метрик и логов позже будет отдельный урок про корреляцию инцидентов.

Песочница урока

Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +2 XP.

Вывод

Запустите код, чтобы увидеть вывод.

Коротко: что запомнить

  • Метрики отвечают на «насколько плохо», логи — на «что именно случилось»; мониторинг начинается с чисел, а не с grep.
  • SLI — измерение, SLO — цель по нему; разница между ними — бюджет ошибок.
  • Pull-модель: Prometheus сам делает GET /metrics каждый scrape-интервал; недоступность цели — метрика up со значением ноль.
  • Формат экспозиции — текст: строки HELP, TYPE и имя-значение.
  • Prometheus — SoundCloud 2012, второй проект CNCF после Kubernetes; официальный клиент для Go — client_golang.
  • Метрика без ответа «кто и когда должен отреагировать» — картинка, а не мониторинг.

Домашнее задание

Проверьте себя без кода: сформулируйте SLI и SLO для сервиса, который знаете, — два-три показателя и целевые значения. Потом перечитайте раздел про pull-модель и ответьте письменно: что увидит Prometheus, если цель недоступна, и почему это лучше протухших данных. В следующем уроке пойдёт установка client_golang — подготовьте локальный Go, понадобятся go mod init и go get.

Личные заметкиПусто
Хранятся только в вашем браузере (Prometheus · Знакомство с Prometheus: почему сервис молчит, а падает)

Вопросы и ответы по уроку

Нужен ли сервер Prometheus, чтобы начать курс?

Нет. Первые уроки — про код метрик в Go: он пишется и проверяется локально, без сервера. Полный цикл со скрейпом и Grafana появится в середине курса, с пошаговой инструкцией Docker Compose.

Чем метрики отличаются от логов?

Метрика — число с меткой времени: хранится дёшево и рисуется мгновенно. Лог — событие с текстом: дорогое в хранении и медленное в поиске. При разборе инцидента метрики сужают область, логи объясняют причину.

Почему Prometheus тянет метрики сам, а не получает их push-ом?

Pull даёт честное состояние: недоступный сервис виден по метрике up, а не по протухшим данным, а код сервиса не зависит от системы хранения. Для короткоживущих задач есть pushgateway — исключение, о котором расскажет урок про скрейпинг.

Термины урока

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

Следующая ступень учебного пути

WebSocket25 уроков~13 чпрактика25 уроков уже доступны

WebSocket в Go: real-time чаты и уведомления

Курс WebSocket на Go: gorilla/websocket, эхо-сервер, hub-паттерн, комнаты, авторизация соединений, ping/pong, reconnect и масштабирование. 25 уроков.

  • Поднимать WS-сервер и апгрейдить HTTP-соединения
  • Писать readPump/writePump без гонок на каждое соединение
  • Строить hub: регистрацию, рассылку и комнаты
  • Авторизовывать соединения и ограничивать сообщения