Яндекс не отвечает нашим серверам неделю. Отчёт по Google молчал вместе с ним — хотя Google работал

У нас на двух сайтах (один — витрина сервисов для продавцов на Авито, второй — агрегатор новостей для курьеров) стоит ежедневный сторож. Он смотрит, какие страницы показываются в поиске, но по ним никто не кликает, и просит у Google и Яндекса ускоренный переобход — чтобы свежие правки быстрее попадали в выдачу обоих поисковиков.
У нас на двух сайтах (один — витрина сервисов для продавцов на Авито, второй — агрегатор новостей для курьеров) стоит ежедневный сторож. Он смотрит, какие страницы показываются в поиске, но по ним никто не кликает, и просит у Google и Яндекса ускоренный переобход — чтобы свежие правки быстрее попадали в выдачу обоих поисковиков.

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

Код оказался ни при чём.

Как увидели настоящую причину

Прежде чем лезть в правки, решили проверить руками — а отвечает ли сам API Яндекс.Вебмастера хоть кому-нибудь из нас. Опросили три независимые точки: основной сервер, второй сервер в другом дата-центре и домашний компьютер. Все три получили одинаковый результат — соединение с адресом Вебмастера не устанавливается вообще, без исключения.

Это совпало по датам с перебоями у Яндекса в начале октября (8–11 числа), о которых в эти дни писали и другие источники. 16 октября Яндекс вернул пользователям веб-интерфейс Вебмастера — зайти и посмотреть отчёты снова можно. А вот программный API, через который с площадкой общаются автоматические скрипты, на 17 октября так и не ожил. Тревога нашего сторожа оказалась правдой с первого дня — просто правдой не про нас.

Решение на витрине и решение под капотом

Отличить «у Яндекса авария» от «мы написали кривой код» — это первый слой. Но пока разбирались, нашли кое-что серьёзнее.

Один из еженедельных отчётов по понедельникам считает страницы, у которых много показов и ноль кликов — отдельно по Google и отдельно по Яндексу, а потом склеивает обе половины в один файл. В прошлый понедельник, 12 октября, этот отчёт не просто пропустил яндексовую часть — он упал целиком. Исключение из недоступного Яндекса обрывало весь скрипт до того, как он успевал досчитать и сохранить часть по Google. А Google в этот момент отвечал нормально, без единого сбоя.

То есть неделю мы были слепы не только по Яндексу — мы были слепы и по Google, хотя Google был полностью исправен. Один внешний источник, который лёг не по нашей вине, стирал результат второго источника, который работал. Это и есть настоящая находка: совместный отчёт из двух независимых источников наследует отказ самого слабого из них, если не предусмотреть иначе.

Чиним так:

— вокруг обращения к Яндексу ставим перехват именно сетевой ошибки (а не общий catch на всё подряд, чтобы не прятать реальные баги);

— при перехвате пишем в журнал одну строку с датой: «API Яндекса недоступен — пропуск» и завершаем этот участок кодом «успех», а не падением;

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

Добавили тест, который имитирует именно этот сценарий — Яндекс недоступен, Google жив — и проверяет, что отчёт по Google всё равно досчитывается и сохраняется. Проверили тест на мутации: если убрать перехват ошибки обратно, тест падает красным, то есть он действительно проверяет нужное поведение, а не просто существует для вида. Вся пачка — 78 из 78 тестов зелёные.

То же самое правило применили и к остальным трём задачам, которые опирались на тот же API: ежедневный запрос переобхода, еженедельная задача на одном из сайтов и ещё один понедельничный отчёт на втором сайте. Везде сейчас одна и та же логика: нет ответа от Яндекса — пишем дату и спокойно пропускаем шаг, не трогая всё остальное.

Что это дало

С этого понедельника отчёт по Google будет приходить независимо от того, в каком состоянии API Яндекса — хоть лежит неделю, хоть вообще никогда не поднимется. Как только Яндекс отзовётся, его часть задач продолжится сама, без ручного перезапуска: мы просто увидим в журнале, что строка «недоступен — пропуск» перестала появляться.

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

Вывод, который можно забрать себе

Если у вас есть автоматический отчёт, который склеивает данные из двух независимых источников — спросите себя: а что будет, если один из источников временно откажет? Если ответ «тогда отвалится и второй, хотя он был в порядке» — это не гипотетический риск, а вопрос времени. У нас на это ушла ровно одна авария у внешнего поисковика, которая случается не каждый день, но и не раз в десять лет.

И второе: прежде чем чинить «свой баг», стоит потратить пять минут и проверить с трёх разных точек, действительно ли сервис недоступен у всех, или это только у вас. Разница между «починить код» и «написать одну строку в журнал и подождать» — это разница между часом работы и пятью минутами.