Диагностика обмена: найти один заказ среди миллиона событий

Письмо «заказ не пришёл» не содержит технического диагноза. Но поддержка должна за несколько минут ответить: сайт не отправил событие, 1С его отклонила или документ создался и потерялся на следующем шаге.

Наблюдаемость начинается до первой ошибки. Если разные компоненты пишут свободный текст без общего идентификатора, после аварии остаётся поиск по номеру заказа и времени «примерно после обеда». Вместо этого каждое бизнес-событие получает correlation ID, который проходит через сайт, прокси, HTTP-сервис, очередь и созданный документ.

Одна строка журнала — одно событие

Запись должна быть структурной: время, интеграция, correlation ID, event ID, этап, результат, длительность и безопасный код ошибки. Текстовое пояснение остаётся, но не заменяет поля. Тогда журнал можно агрегировать, а не только читать глазами.

{
  "integration": "web-orders",
  "correlation_id": "corr-8ca31",
  "event_id": "b861b9f0-6d84-4d5f-91cc-3c09863a91c3",
  "stage": "create_order",
  "result": "rejected",
  "error_code": "SKU_NOT_MAPPED",
  "duration_ms": 184,
  "payload_hash": "sha256:51d9…"
}

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

Три панели для разных ролей

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

Для web-orders определим сервисный уровень: 99% корректных событий создают заказ не дольше пяти минут. Он измеряется от occurred_at отправителя до времени записи документа, а не от старта фонового задания. Иначе очередь может сутки ждать, но локальная обработка покажет прекрасные 200 миллисекунд.

Разбираем инцидент по временной линии

  1. 09:41:12 — сайт сформировал событие.
  2. 09:41:13 — 1С ответила 202 и сохранила входящее сообщение.
  3. 09:41:16 — обработчик не нашёл соответствие SKU и отправил запись в карантин.
  4. 10:07:02 — оператор добавил соответствие и сформировал новую попытку.
  5. 10:07:04 — документ создан; ссылка записана рядом с event ID.

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

Безопасное воспроизведение

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

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

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

Проверьте себя
1. Почему свободного текста ошибки недостаточно для мониторинга?
AЕго нельзя вывести в 1С
BОн нестабилен, и его трудно надёжно агрегировать
CОн всегда содержит пароль
DОн замедляет HTTP в сто раз
2. Как правильно измерить задержку обработки бизнес-события?
AТолько временем выполнения последней функции
BОт времени события у отправителя до готового результата
CПо длине JSON
DПо времени открытия формы оператором
3. Что делать с боевым сообщением перед воспроизведением на тестовом контуре?
AПереслать без изменений
BУдалить только фигурные скобки
CОбезличить данные и заменить секреты тестовыми
DОпубликовать в общем журнале