Сделал, и заодно прямой ответ на вопрос: не было ни заглушки, ни health check. Сервис всё это время жил без Redis молча.
Самое неприятное выяснилось, когда полез проверять. В том же классе RedisCache уже лежали готовые is_available() и get_status(). Написаны тогда же, вместе с кэшем. Не вызывались ниоткуда, grep по сервису давал ноль. То есть проверки зависимости не то чтобы не хватало: она была написана и не подключена к /health.
Теперь статус считается по зависимости, а рядом лежат счётчики:
Про hit rate уточнение, которое мне кажется важным. Счётчики пришлось завести в приложении, а не брать из INFO Redis. В том отказе get падал с AttributeError на None и возвращал None, до Redis не доходило ни одной команды. Его keyspace_hits и keyspace_misses остались бы нулями оба, hit rate вышел бы 0/0, то есть неопределённым. На дашборде это читается как «метрика сломалась», а не как «кэш мёртв». Поэтому у меня hit_rate равен null при нулевых обращениях, и отдельно считаются errors: мёртвый кэш это null плюс растущие errors, а не ноль процентов.
Проверил оба состояния. Живой кэш на проде: первый запрос /occupancy/current 17,4 с, второй 0,013 с, hit_rate 0.5. Состояние без Redis на подменённом клиенте: available false, errors растут, hit_rate null, статус degraded.
Код ответа при degraded оставил 200, чтобы балансировщик не выбросил живой инстанс: сервис без кэша медленный, но рабочий. Значит проверять надо тело, а не код. И вот этого у меня пока нет: монитора на /health этого сервиса в Uptime Kuma просто не существует, там три проверки и все на фронт и основной API. Ровно та же ошибка, что в статье, этажом выше.
Поправка принята, спасибо. Проверил: сломал конфиг на тестовом контейнере, дёрнул reload - ругнулся и не применил, сайт работает. Статью исправил. Про слоп - виноват мой ревьюер Клодий Гптивич :). Однако в реальности ситуации можете не сомневаться
Проверил Angie - да, умеет сам с версии 1.5.0. И главное, он сам же подхватывает новый сертификат. У меня сломалось именно это: certbot положил новый файл на диск, а nginx продолжал отдавать старый, потому что его никто не перезапустил.
Посмотрел свой конфиг после вашего комментария - там один домен и три прокси. Так что да, certbot с хуками для такого жирновато, на Caddy вышло бы строк десять.
Про «39 не изменилось, а популяция сменилась» — за сутки после публикации стало ещё нагляднее. Пересчитал сегодня: молчащих уже 40. У парковки id=83 истекли 30 дней с последнего свободного места. Правило не менялось, код не менялся, состав сдвинулся сам.
Сделал, как вы предлагаете. Бэктест теперь пишет рядом с метриками отпечаток выборки: правило, размер и sha256 отсортированных id, реально попавших в оценку. Хеширую именно разрешённый состав, а не текст правила — текст у меня как раз совпадал год подряд, а состав разошёлся до пересечения в девять парковок из тридцати девяти. Заодно вынес скрипт замера из /tmp в репозиторий, потому что замер оттуда невоспроизводим по определению.
Все парковки, которые есть в датасете, закрытого типа (ГПЗТ). Въезд туда только через шлагбаум, на таких парковках количество занятых мест обновляется с каждой въехавшей машиной. Придорожные парковочные зоны пока не транслируются Мос. паркингом
Источник каждые 3-10 минут публикует обновленное состояние каждой парковки, а именно количество занятых мест. То есть информации по отдельно взятому парковочному месту нет.
Информация
В рейтинге
227-й
Зарегистрирован
Активность
Специализация
Бэкенд разработчик, Архитектор программного обеспечения
Сделал, и заодно прямой ответ на вопрос: не было ни заглушки, ни health check. Сервис всё это время жил без Redis молча.
Самое неприятное выяснилось, когда полез проверять. В том же классе
RedisCacheуже лежали готовыеis_available()иget_status(). Написаны тогда же, вместе с кэшем. Не вызывались ниоткуда, grep по сервису давал ноль. То есть проверки зависимости не то чтобы не хватало: она была написана и не подключена к/health.Теперь статус считается по зависимости, а рядом лежат счётчики:
Про hit rate уточнение, которое мне кажется важным. Счётчики пришлось завести в приложении, а не брать из
INFORedis. В том отказеgetпадал с AttributeError наNoneи возвращалNone, до Redis не доходило ни одной команды. Егоkeyspace_hitsиkeyspace_missesостались бы нулями оба, hit rate вышел бы 0/0, то есть неопределённым. На дашборде это читается как «метрика сломалась», а не как «кэш мёртв». Поэтому у меняhit_rateравен null при нулевых обращениях, и отдельно считаютсяerrors: мёртвый кэш это null плюс растущие errors, а не ноль процентов.Проверил оба состояния. Живой кэш на проде: первый запрос
/occupancy/current17,4 с, второй 0,013 с, hit_rate 0.5. Состояние без Redis на подменённом клиенте: available false, errors растут, hit_rate null, статус degraded.Код ответа при degraded оставил 200, чтобы балансировщик не выбросил живой инстанс: сервис без кэша медленный, но рабочий. Значит проверять надо тело, а не код. И вот этого у меня пока нет: монитора на
/healthэтого сервиса в Uptime Kuma просто не существует, там три проверки и все на фронт и основной API. Ровно та же ошибка, что в статье, этажом выше.Хорошая практика!
Проект одного человека: я его написал, я же администрирую, данные в нём мои. Разделения нет, потому что не от кого разделять)
Поправка принята, спасибо. Проверил: сломал конфиг на тестовом контейнере, дёрнул reload - ругнулся и не применил, сайт работает. Статью исправил. Про слоп - виноват мой ревьюер Клодий Гптивич :). Однако в реальности ситуации можете не сомневаться
Спасибо!
Проверил Angie - да, умеет сам с версии 1.5.0. И главное, он сам же подхватывает новый сертификат. У меня сломалось именно это: certbot положил новый файл на диск, а nginx продолжал отдавать старый, потому что его никто не перезапустил.
Посмотрел свой конфиг после вашего комментария - там один домен и три прокси. Так что да, certbot с хуками для такого жирновато, на Caddy вышло бы строк десять.
Про «39 не изменилось, а популяция сменилась» — за сутки после публикации стало ещё нагляднее. Пересчитал сегодня: молчащих уже 40. У парковки id=83 истекли 30 дней с последнего свободного места. Правило не менялось, код не менялся, состав сдвинулся сам.
Сделал, как вы предлагаете. Бэктест теперь пишет рядом с метриками отпечаток выборки: правило, размер и sha256 отсортированных id, реально попавших в оценку. Хеширую именно разрешённый состав, а не текст правила — текст у меня как раз совпадал год подряд, а состав разошёлся до пересечения в девять парковок из тридцати девяти. Заодно вынес скрипт замера из /tmp в репозиторий, потому что замер оттуда невоспроизводим по определению.
Все парковки, которые есть в датасете, закрытого типа (ГПЗТ). Въезд туда только через шлагбаум, на таких парковках количество занятых мест обновляется с каждой въехавшей машиной. Придорожные парковочные зоны пока не транслируются Мос. паркингом
Источник каждые 3-10 минут публикует обновленное состояние каждой парковки, а именно количество занятых мест. То есть информации по отдельно взятому парковочному месту нет.