Мониторинг веб-сервисов: метрики, журналы и трассировка на заказ

Мониторинг веб-сервиса отвечает на два вопроса: работает ли он для пользователя сейчас и где искать причину, если нет. Делаем это в коде и конфигурации вашего сервиса: метрики по запросам и очередям, журналы с общим идентификатором запроса, трассировка и оповещения по симптомам. Данные остаются в вашем контуре. Это не охранная система и не дежурная смена: мы строим то, по чему ваша команда сама увидит сбой и найдёт причину.

Обследование — 200 000 ₽, вычитается из первого этапаМетрики, журналы и трассы хранятся на ваших серверахИсходный код и настройки в вашем репозитории с первого коммита

С чем приходят

Когда одного «пинга сервера» уже мало

О сбое узнаёте от клиентов

Сервер отвечает, но оформление заказа падает, и первым это замечает менеджер, которому позвонили. Проверка «жив ли процесс» не видит поломку в одном сценарии.

Графики есть, причину не найти

Загрузка процессора видна, а в каком запросе, в какой системе и после какой выкладки всё замедлилось, неизвестно.

Журналы лежат файлами на серверах

Чтобы понять, что случилось с одним заказом, нужно зайти на три машины и склеить строки по времени. Общего идентификатора запроса нет.

Оповещения есть, реакции нет

Сообщений много, половина ложные, у части нет владельца. Через месяц чат с тревогами отключают, и настоящий сбой проходит незамеченным.

Три сигнала

Метрики, журналы и трассы: на какой вопрос отвечает каждый

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

Сигнал
На какой вопрос отвечает
Что хранится
Где ломается
СигналМетрикичисла во времени
На какой вопрос отвечаетЕсть ли проблема, насколько велика и когда началась
Что хранитсяЧисло запросов, доля ошибок, время ответа, длина очереди
Где ломаетсяМетка с неограниченным числом значений (идентификатор заказа) раздувает хранилище
СигналЖурналысобытия с полями
На какой вопрос отвечаетЧто произошло с конкретным запросом или пользователем
Что хранитсяВремя, уровень, идентификатор запроса, организация, код ошибки
Где ломаетсяСвободный текст без полей и персональные данные в строках
СигналТрассыпуть одного запроса
На какой вопрос отвечаетГде в цепочке потеряно время или случилась ошибка
Что хранитсяДерево шагов через сервисы, очереди и базу с длительностью каждого
Где ломаетсяИдентификатор теряется на очереди или внешнем вызове, цепочка обрывается
СигналСобытия выкладкиотметки изменений
На какой вопрос отвечаетЧто изменилось перед началом проблемы
Что хранитсяВерсия, время выкладки, смена конфигурации
Где ломаетсяОтметок нет, и причину ищут в коде, хотя виновата вчерашняя конфигурация
Порядок разбора

От симптома к причине: как это выглядит, когда сигналы настроены

Условный пример.

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

  1. Оповещение называет симптом. Сработало правило «доля ошибок на оформлении заказа выше порога». Оно сразу говорит, что сломано для пользователя, а не какой диск заполнен.
  2. Панель сужает область. Ошибки идут от одного маршрута и начались сразу после выкладки: отметка видна на графике. Время ответа базы в норме.
  3. Трасса показывает шаг. Неудачный запрос дошёл до вызова внешней системы доставки и завершился по таймауту. Остальные шаги быстрые.
  4. Журнал называет причину. По идентификатору запроса находим строки: в новой конфигурации указан старый порт внешней системы.
  5. Решение и проверка. Откатываем конфигурацию, смотрим на график ошибок, записываем причину в журнал инцидентов.

Каждый шаг требует подготовки в коде: правило привязано к сценарию, метрики разбиты по маршрутам, идентификатор проходит через вызовы, выкладка оставляет отметку. Нет одного звена, и поиск возвращается к перебору. Поэтому начинаем со сценариев, а не с инструментов.

Что измеряем

Пять уровней измерений в веб-сервисе

Заготовка для разбора. Порогов не называем: их задают по замерам вашей нагрузки.

Уровень
Что измеряем
Откуда берём данные
Откуда берём порог
УровеньПользовательский сценарийвход, оформление, оплата
Что измеряемДоля успешных запросов и время ответа по каждому ключевому маршруту
Откуда берём данныеМетрики приложения и проверки снаружи
Откуда берём порогИз цели по доступности и жалоб пользователей
УровеньБаза данныхзапросы, соединения, место
Что измеряемМедленные запросы, число соединений, задержка реплики, свободное место
Откуда берём данныеЖурнал медленных запросов, экспортёр метрик
Откуда берём порогИз замеров на пике; месту и реплике нужен запас по времени
УровеньОчереди и фоновые задачивозраст сообщения
Что измеряемСколько ждёт самое старое сообщение, сколько задач упало
Откуда берём данныеМетрики брокера и обработчиков
Откуда берём порогИз допустимой задержки: заказ можно принять с задержкой в несколько минут, платёж нельзя
УровеньВнешние системы1С, платёжный провайдер, почта
Что измеряемДоля ошибок и время ответа по каждой системе отдельно
Откуда берём данныеМетрики вызывающей стороны: у чужой системы нет вашего мониторинга
Откуда берём порогИз договора с поставщиком и недели наблюдений
УровеньБизнес-показателизаказы, регистрации, платежи в час
Что измеряемЧисло событий и сравнение со вчерашним днём в тот же час
Откуда берём данныеСчётчики в приложении или запрос к базе
Откуда берём порогИз истории: падение числа заказов без ошибок часто значит поломку, не видную технически
Журналы

Как устроены журналы, по которым можно что-то найти

Журнал — это данные для поиска, а не дневник приложения.

Одна строка — одно событие с полями

Событие пишется структурой (например, JSON), а не предложением. В строке есть время, уровень, идентификатор запроса, название сервиса и версия, организация или пользователь в безопасной форме, код результата. Поиск «все ошибки одной организации за вчера» тогда выполняется запросом, а не чтением глазами.

Идентификатор запроса проходит через всё

Входящий запрос получает идентификатор на первом сервисе. Он попадает в каждую строку журнала, в заголовок вызова следующего сервиса, в сообщение очереди и в ответ клиенту, чтобы пользователь мог назвать его в обращении. Без этого журналы разных частей не связать.

Что не должно попадать в журнал

  • Пароли, токены, ключи, данные карт. Фильтр в библиотеке журналирования вырезает такие поля везде, а не только там, где о них вспомнили.
  • Персональные данные в открытом виде. Вместо телефона пишется внутренний идентификатор. Запись о действии пользователя для безопасности — это журнал аудита со своими правами и сроком, он описан на странице о журнале действий пользователей.
  • Тела запросов целиком. Пишем размер, тип и результат.
Оповещения

Как сделать, чтобы на оповещения реагировали

Тревога о симптоме, а не о причине

Будим человека, когда пользователь не может оформить заказ, а не когда процессор нагружен. Причины остаются на панелях для разбора.

У правила есть владелец и инструкция

В сообщении указано, что сломано для пользователя, кто отвечает и что проверить первым. Правило без владельца удаляется.

Два уровня срочности

Срочные идут сразу тому, кто может действовать, остальные собираются в ежедневный список.

Тревоги проверяются учениями

Раз в квартал мы нарочно ломаем стенд и смотрим, сработало ли правило и понял ли получатель, что делать. Нерабочее правило хуже его отсутствия.

Размер имеет значение

Какой набор нужен: от одного сервера до десятка сервисов

Полный набор нужен не всем: лишний инструмент надо обновлять и защищать.

Ситуация
Минимум
Добавляем при росте
Чего не стоит ставить
СитуацияОдин сервис на одном-двух серверахнебольшой веб-сервис
МинимумПроверка сценариев снаружи, метрики приложения и базы, структурные журналы в одном месте
Добавляем при ростеПанель по ключевым маршрутам и оповещение по доле ошибок
Чего не стоит ставитьРаспределённую трассировку: хватит журнала с идентификатором запроса
СитуацияМонолит и фоновые обработчикиприложение плюс очереди
МинимумМетрики очередей и возраста сообщений, отметки выкладок
Добавляем при ростеВыборочную трассировку самых долгих запросов
Чего не стоит ставитьОтдельный кластер поиска ради небольшого объёма журналов
СитуацияНесколько сервисов и внешние обменыцепочка вызовов
МинимумСквозной идентификатор, трассировка с выборкой, панели по зависимостям
Добавляем при ростеЦели по надёжности для каждого сервиса
Чего не стоит ставитьЗапись всех трасс подряд: хватит выборки плюс всех ошибок и медленных запросов
СитуацияЗакрытый контурвсё внутри периметра
МинимумХранилища метрик, журналов и трасс на ваших серверах, обновления по вашей процедуре
Добавляем при ростеПанели и правила как код для переноса между стендами
Чего не стоит ставитьОблачные панели: данные уходят за периметр, а для данных ограниченного доступа это обычно не подходит
Что делаем

Из чего состоит работа и сколько она стоит

Цены совпадают со страницей «Тарифы». Точная цена называется только у обследования, остановиться можно после любой ступени.

Обследование: один сервис

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

200 000 ₽ · 2–3 недели

Обследование: несколько систем

Сервис вместе с базой, очередями, 1С и внешними обменами: где обрывается идентификатор запроса и кто за что отвечает.

350 000 ₽ · 3–4 недели

Пилот, лёгкий: один сервис

Метрики, структурные журналы с идентификатором, панели по сценариям и оповещения по симптомам. Хранилище на вашем сервере, инструкция.

150 000–400 000 ₽ · 2–8 недель

Пилот, тяжёлый: несколько частей

Сквозная трассировка через сервисы, очереди и внешние вызовы, панели по зависимостям, учения по оповещениям, регламент реакции.

400 000–1 200 000 ₽ · 2–3 месяца

Вывод в эксплуатацию

Наблюдаемость как часть вывода продукта: все сервисы, цели по надёжности, регламент учений, передача команде.

от 1 500 000 ₽ этапами по 300 000–700 000 ₽ · от 3 месяцев

Сопровождение

Развитие панелей и правил, пересмотр порогов, разбор инцидентов. Сверх пакета — 5 000 ₽ в час.

20 000 / 60 000 / 120 000 ₽ в месяц
Процесс

Как идёт работа

2–4 недели — Обследование: сценарии и слепые зоны

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

Перед внедрением — Цели и правила

Записываем, что считается сбоем и какие значения нормальны, согласуем получателей оповещений и порядок реакции. Это решения вашей команды.

От 2 недель — Внедрение сигналов

Подключаем сбор метрик, структурные журналы и трассировку в вашем репозитории. Панели и правила хранятся как код.

1–2 недели — Учения

Нарочно останавливаем базу, замедляем внешнюю систему, роняем обработчик. Проверяем, сработали ли правила и хватает ли сигналов для поиска причины.

3–7 дней — Включение на боевом сервисе

Сначала правила работают без рассылки, мы смотрим на ложные срабатывания, потом включаем отправку.

Дальше — передача или сопровождение

Инструкция по панелям, правилам и хранилищам; пересмотр порогов раз в квартал в сопровождении.

Цена

Что двигает цену внутри вилки

Состояние кода

Если журнал пишется свободным текстом из разных мест, первые недели уходят на приведение его к структуре, а не на панели.

Число частей в цепочке

Каждая очередь, внешний вызов и сервис, где может оборваться идентификатор, добавляет работы.

Требования контура

В закрытом периметре хранилища и доступ к панелям согласуются со службой безопасности, и сроки растут.

Порядок реакции

Если после оповещения никто не отвечает за действия, пользы не будет. Порядок мы оформляем, выполнять его будет ваша команда.

Контроль

Что остаётся у вас и чего мы не делаем

Остаётся у вас

  • Исходный код, панели, правила и конфигурация сбора в вашем репозитории с первого коммита.
  • Хранилища метрик, журналов и трасс на ваших серверах; развёртывание описано инструкцией.
  • Перечень сценариев, цели, пороги и порядок реакции в виде документа.
  • Журнал учений: что ломали, что сработало, что исправлено.
  • Право остановиться после любой ступени: сделанное остаётся у вас по акту.

Мы этого не делаем

  • Не оказываем услуги SIEM, WAF и IDS и не расследуем компрометации.
  • Не дежурим круглосуточно: оповещения получает ваша команда или сопровождение в рабочее время.
  • Не отслеживаем аппаратуру и сети предприятия целиком. Для оборудования цеха есть отдельная услуга, мониторинг оборудования.
  • Не ставим готовые панели без разбора сценариев и не берём работы дешевле 150 000 ₽.
  • Не проводим аттестацию, лицензии ФСТЭК у нас нет.
Граница

Мониторинг сервиса, сопровождение и безопасность: где проходит граница

Мониторинг веб-сервиса встраивается в сам сервис и его окружение: сигналы, панели, правила. Принять чужую систему на постоянное обслуживание и разбирать инциденты — другая услуга, сопровождение ПО; на практике они идут вместе, но договор и пакет часов разные. Если сервис ещё не написан, наблюдаемость закладывается в разработку веб-сервиса с начала, и это дешевле.

Если сервис не выдерживает пик, начинать надо с высоконагруженного сервиса. Если он должен пережить отказ узла или базы, смотрите отказоустойчивый веб-сервис: там оповещения запускают переключение, а здесь лишь сообщают о нём.

Безопасность — отдельная тема. Журналы приложения помогают разбирать события, но не заменяют систему обнаружения вторжений; о защите кода — безопасная разработка веб-приложений. Порядок сигналов описан в статье «Что измерять в веб-сервисе».

Инструменты

На чём собираем

Сбор и хранение
  • OpenTelemetry для сквозных идентификаторов и трасс
  • Prometheus и совместимые хранилища метрик, правила оповещений как код
  • Loki или OpenSearch для журналов, выбираем по объёму и привычкам вашей команды
  • Tempo или Jaeger для трасс, если они нужны
Панели и доставка
  • Grafana: панели в виде кода, отметки выкладок
  • Alertmanager или ваш канал доставки: почта, мессенджер, система заявок
  • Структурные журналы в Python, Go, Java или Node.js
  • Docker, Nginx, GitLab CI; всё в вашем контуре
Материалы

Материалы по теме

Статья

Что измерять в веб-сервисе: метрики, логи, трассы

Какой сигнал отвечает на какой вопрос и какие поля нужны в журнале. Пригодится до выбора инструментов.

  • Три сигнала
  • Поля журнала
  • Минимум на первую неделю
Читать →
Статья

Что означает доступность «три девятки» и как её проверять

Что считать сбоем и как измерить доступность.

  • Что считать недоступностью
  • Как измерять
  • Что проверить в SLA
Читать →
Статья

Как следить за моделью в продакшене

Если в сервисе работает модель, добавляются дрейф и качество ответов.

  • Слои мониторинга
  • Дрейф
  • Откат
Читать →
Заявка

Разберём, что вы видите в своём сервисе и чего не видите

Сорок минут созвона: как сервис устроен и как о сбое узнаёте сейчас. По итогам скажем, какой набор сигналов нужен и с какой ступени начинать.

Спасибо, заявка отправлена. Ответим в течение рабочего дня.

Не удалось отправить. Напишите в телеграм или позвоните.

Вопросы

Частые вопросы: мониторинг и наблюдаемость веб-сервисов

Сколько стоит настройка мониторинга веб-сервиса?

Обследование стоит 200 000 ₽ за один сервис и 350 000 ₽ за несколько систем. Лёгкий пилот (метрики, журналы и оповещения для одного сервиса) — 150 000–400 000 ₽ за 2–8 недель, тяжёлый (сквозная трассировка) — 400 000–1 200 000 ₽ за 2–3 месяца. Работы дешевле 150 000 ₽ не берём.

Чем наблюдаемость отличается от обычного мониторинга?

Обычный мониторинг проверяет известные условия: жив ли сервер, не заполнен ли диск. Наблюдаемость позволяет ответить на вопрос, которого не ждали: почему заказы одной организации падают после выкладки. Для этого нужны метрики, структурные журналы и трассы с общим идентификатором запроса.

Нужна ли трассировка, если у нас один монолит?

Чаще всего нет. В одном процессе хватает журнала с идентификатором запроса и метрик по маршрутам. Трассировка оправдана, когда запрос идёт через несколько сервисов, очередей или внешних систем и время теряется на стыках.

Можно ли сделать это в закрытом контуре?

Да. Хранилища, панели и доставка оповещений разворачиваются на ваших серверах, обновления идут по вашей процедуре. Облачные панели не рекомендуем, если в сигналах могут оказаться данные ограниченного доступа: внешние сервисы им обычно не подходят по требованиям заказчика.

Вы будете получать оповещения о сбоях?

Не в рамках этой услуги: мы настраиваем правила и порядок реакции, а сообщения получает ваша команда. Разбор инцидентов в рабочее время можно взять в сопровождение: 20 000, 60 000 или 120 000 ₽ в месяц, до 4, 12 или 25 часов, сверх пакета 5 000 ₽ в час. Круглосуточной смены у нас нет.

Заменяет ли это систему безопасности SIEM?

Нет. Мониторинг сервиса показывает, что он работает и где ломается. Обнаружение атак и расследование делаются другими средствами, услуг SIEM, WAF и IDS мы не оказываем. Журналы приложения могут быть источником для такой системы, если она у вас есть.

Не замедлят ли метрики и трассы сервис?

Небольшую нагрузку они добавляют, и её надо измерять. На пилоте сравниваем время ответа с сигналами и без них на вашей нагрузке, трассы пишем с выборкой, а метки метрик ограничиваем. Если накладные расходы заметны, сокращаем набор.

Кому принадлежат панели и настройки?

Вам. Панели, правила, конфигурация сбора и исходный код лежат в вашем репозитории с первого коммита. Результат передаётся по акту, порядок передачи прав записан в договоре; открытые компоненты остаются под своими лицензиями.

Вы работаете только в Ростове-на-Дону?

Мы в Ростове-на-Дону, работаем с заказчиками по всей России: удалённо и в вашем контуре. Доступ к системам и обследование согласуем на старте с вашей службой безопасности.