Мы строим DetailClub — платформу для детейлинг-студий. У каждой студии там свой сайт, запись, склад и деньги, а у нас — «штаб», откуда видно все студии разом.
На той же основе работает другой наш проект – OnyxFit. А так же ровно как и этот сайт.
Платформа ещё до запуска: студии на ней пока наши собственные — стенды и демонстрационные. Самое время ломать и смотреть, кто это заметит.
Эта статья не о том, какой у нас хороший мониторинг. Она про четыре случая за две недели. В одном он не увидел ничего, в другом поднял ложную тревогу — и оба раза это оказалось полезнее, чем если бы всё сработало как надо.
1. Девять часов, которых никто не видел
24 сентября вечером мы проверяли инструкцию «как подключить свой домен» и по дороге удалили одну DNS-запись — ту, что ведёт на платформу поддомены всех студий разом. С этой минуты не открывалась ни одна.
Штаб при этом показывал зелёное «работает» — и был прав. Серверы работали, базы отвечали, все процессы были живы. Он проверял студии изнутри, по внутренней сети. А сломалась дорога снаружи.
Запись вернули через девять часов.
Вывод неловко формулировать, потому что он из учебника: проверять надо то, что видит посетитель, а не то, что удобно проверить.
На следующий день в ядре появился сторож «снаружи».
Раз в пять минут он спрашивает публичный DNS, куда ведут наши адреса, сверяет сертификат и открывает каждую студию так, как это сделал бы человек из браузера.
Два плохих обхода подряд — пуш, письмо и запись в журнале инцидентов. Один плохой обход — ещё не тревога, а мигание сети.
Нижняя полоса — 6 октября.
В 19:17 запасной адрес платформы перестал находиться в публичном DNS.
19:22 пришла тревога.
В 19:27 — отбой.
Чинить ничего не пришлось: сбой был не у нас и прошёл сам. Но между «узнали через девять часов» и «узнали через пять минут» и лежит вся ценность.
2. Одна удалённая учётная запись
3 октября мы удалили из штаба вход одного сотрудника. Через несколько минут экран «База» загорелся: памяти мало.
Перед удалением ядро проверяет, не ссылается ли на запись что-нибудь ещё, и сама база при удалении проверяет то же.
Одна из ссылок жила в таблице результатов автотестов — 589 МБ — и индекса по этой колонке не было. Чтобы убедиться, что на удаляемого человека никто не ссылается, база прочитала таблицу целиком. Четыре раза. В кэш на 512 МБ таблица не помещалась, поэтому каждый раз — с диска.
Здесь легко остановиться на «добавили индекс». Мы сделали три вещи:
- 1. Правило вместо заплатки
У каждой колонки, которая ссылается на удаляемую сущность, должен быть индекс — и это проверяет автотест: по описанию таблиц, без базы, за секунду. Он нашёл 12 таких колонок. - 2. Сторож
Экран беду показал, а пуша не было: за базой никто не следил, пока экран закрыт. Теперь пять красных минут подряд — пуш и инцидент, пять спокойных — отбой. С оговоркой: после перезапуска базы кэш два часа холодный, и это не тревога. - 3. Причина причины
Почему таблица результатов тестов весит 589 МБ? Потому что мы хранили каждый пройденный шаг каждого прогона. Теперь у старых прогонов остаётся счёт, а подробности — только у упавших. Минус 615 тысяч строк.
3. Тревога, которая оказалась ложной
6 октября в 17:04 пришёл пуш:
Сервер в это время был свободен: процессор занят на полпроцента, ни одной ошибки.
Тревогу подняли мы сами — загружали в хранилище файлы по 60 МБ. Файл едет кусками, и время приёма куска зависит от сети отправителя: от трёх до семи секунд, а один кусок шёл сорок девять. Сторож честно записал это как «API отвечает медленно».
Закрыть такую тревогу можно за десять минут: исключить загрузки из подсчёта. Мы это сделали — ручки, которые принимают файл, сервер теперь находит сам и в оценку скорости не берёт. Но сначала посмотрели, что ещё было в том часе. И нашли настоящее.
Экран «Хранилище», пока открыт, каждые 20 секунд спрашивал у сервера список файлов и сводку. Каждый из двух ответов сверял все 2112 файлов со всеми 1837 текстами платформы — чтобы показать, где файл используется. Полсекунды на ответ, по 180 раз в час, ради экрана, на котором ничего не менялось.
Сверку переписали: сначала один поиск имени по всем текстам разом, и только если нашлось — по каждому. На всех 2149 файлах ответ совпал с прежним. Это важно: по нему уборка решает, какой файл никому не нужен.
А вопросы каждые 20 секунд заменили сигналом: файл поменялся — сервер сам говорит об этом открытым экранам. Сигнал идёт не из двух десятков ручек, которые трогают файлы, а из одного места — от базы, после записи. Двадцать мест — это одно забытое через месяц.
4. Ноутбук, который грелся
5 октября коллега пожаловалась: от открытой админки греется MacBook Air. Пусть и старичок 2020 года, но разобраться все равно надо.
Жалоба не про сервер, графиков на неё нет, и самый частый ответ на такое — «у меня не греется».
Мы собрали стенд: отдельный браузер без окна, все 96 экранов админки по очереди, по 15–20 секунд на каждом, счётчики процессора отдельно для страницы и для отрисовки. 89 экранов из 96 в покое процессор не трогали вовсе. Грели три мелочи:
- серые заглушки загрузки, которые переливались, пока висят;
- схема запросов, которая перерисовывалась 60 раз в секунду, даже когда на ней ничего не двигалось;
- анимации на лендинге, которые считались и за краем экрана.
По дороге нашлось четвёртое: на десяти экранах при сорванной загрузке заглушки висели вечно — без ошибки и без кнопки «повторить». После правки прошли все 164 адреса админки: не зависает ни один.
И снова правило вместо заплатки: автотест не пропускает в админку бесконечную анимацию, которая меняет что-нибудь кроме сдвига и прозрачности.
Что из этого следует
- Смотреть глазами посетителя.
Сторож, который живёт внутри системы, видит то же, что система думает о себе. - Тревога — тоже код, и в ней бывают ошибки.
Ложную тревогу мы разбираем как настоящую: что она измерила и почему решила, что это беда. - Не останавливаться на первом «почему».
За ложной тревогой нашёлся медленный экран, за медленным удалением — таблица, которой незачем быть такой большой. - После починки остаётся правило, а не память.
Индексы, анимации, зависшие заглушки — каждое теперь проверяет автотест. Люди забывают, тесты — нет. - Мерить, а не спорить.
«Греется ноутбук» становится задачей, когда у неё появляются цифры до и после.
Всё это живёт в ядре, а не в одном продукте.
Сторожа, журнал инцидентов, экраны «Сервер», «API» и «База» достаются каждому проекту, который мы на нём строим.
Заказывать это отдельно не нужно — как и узнавать о поломке от собственных посетителей.
