Метрики: экспортёр Celery наконец поднимается, тревоги про воркеров и память перестают врать #3547
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3547
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3493-celery-exporter-memory-alert"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #3493
Что было
Две тревоги шумели в канале метрик и обе врали текстом, а не условием.
NoActiveCeleryWorkers горела с 12.09 11:31 UTC без перерыва, повтор каждые ~3 ч — около 40 одинаковых сообщений. Воркер при этом жив:
gendesign-worker-1 Up 29 hours (healthy), 15 задач за 10 минут. Метрикcelery_*в Prometheus не было вовсе, правило горело по веткеabsent().ContainerNearMemoryLimit · tradein-postgres приходила каждую ночь (91–99.8 %) с текстом «дальше OOM-kill».
Почему
Экспортёр Celery не поднимался ни разу
Лог джобы
Deploy Metrics / agent-appsс диска Forgejo, одинаковый 12.09 и 16.09:Тега
0.13.0не существует (последний —0.12.2, 15.07.2025). Подset -eупавшийpullобрывал всю джобу — с 12.09 на Poincare не доезжало ничего из агента метрик: ни этот экспортёр, ниredis-exporter, ни новый конфиг Alloy со скрейпом очереди.За первым дефектом стоял второй: флага
--queueв 0.12.2 нет, опция называется--queues(src/cli.py). С одним исправленным тегом экспортёр упал бы при старте.Проверено на боевом брокере до мержа — временный контейнер
0.12.2 --queues=celeryна сетиgendesign_shared(удалён):Адрес брокера не тронут: алиас
gendesign-redisнаgendesign_sharedсуществует (aliases=[gendesign-redis-1 redis gendesign-redis]) и резолвится.Прежнее правило пропустило бы настоящую смерть воркера
count(celery_worker_up == 1) == 0— если все серии в 0,== 1даёт пустой вектор,count()от пустого вектора тоже пуст, и== 0сравнивать не с чем. Ветка «воркер мёртв» не сработала бы никогда; горела толькоabsent()— под текстом про мёртвого воркера.Память: working set включает кэш страниц
Живой контейнер 17.09 06:10 UTC: лимит 3 ГБ,
anon 38 МБ,shmem 841 МБ(shared_buffers),inactive_file 2.1 ГБ. Анонимная память за 7 суток 11–170 МБ без тренда,oom_kill = 0за 21 сутки, своп хоста свободен. Метрикаworking_set= usage − inactive_file оставляет активный кэш, ночные сканы поднимают его к потолку.Что изменено
docker-compose.metrics-agent.yml— тег0.12.2, флаг--queues=celery, комментарий с тем, чем сверено.rules/infra.yml:up{job="celery"} == 1), а живых воркеров нет (серии в 0 или вычищены).$valueпрежние (доля рабочего набора).ops/metrics/prometheus/tests/infra_test.yml— юнит-тесты правил, 6 случаев, каждый уже случался на проде. Исполняются деплоем метрик перед reload одноразовым контейнером того же образа; упавший тест оставляет Prometheus на прежних правилах.Калибровка правила памяти — на истории, этим самым выражением
14 суток, шаг 5 мин, эпизоды ≥ 15 мин:
Метки
working_setиrssсовпадают у 913 из 915 серий —andбезon()работает, это подтверждено ненулевым результатом на браузере.Проверки
promtool check rulesSUCCESS: 24 rules found, rc=0promtool test rulesна новых правилахpromtool test rulesна старых правилах из main (фальсификация)pytest backend/tests/opstest_2203_*(BSDmktemp --suffixна macOS, на CI под Linux зелёные)Попутно: гейт
test_3467_…::test_failed_validation_skips_reload_and_fails_the_stepищет конецelseподстрокойfi— первая версия моего сообщения об ошибке содержала словоconfigи роняла его. Текст сообщения переписан кириллицей; хрупкость гейта не трогал.Приёмка после мержа (2026-09-17)
docker psна Poincare:gendesign-celery-exporterиgendesign-redis-exporter—Up.celery_worker_up == 1,up{job="celery"} == 1,up{job="redis"} == 1.NoActiveCeleryWorkersиQueueExporterDown— не firing; в канал приходит RESOLVED.GET /api/v1/rulesотдаёт новое выражение ContainerNearMemoryLimit; ночь на 18.09 проходит без тревоги по tradein-postgres.Не сделано, отмечаю
Экспортёр увидел три очереди (
celery,geo,scrape_kn), аCeleryQueueGrowingсмотрит толькоcelery— комментарий в compose «все таски в один queue» неверен. Отдельной задачей.🤖 Generated with Claude Code
Две тревоги шумели в канале каждую ночь и каждые три часа, обе врали текстом. NoActiveCeleryWorkers горела с 12.09 без перерыва при живом воркере (`Up 29 hours`, 15 задач за 10 минут). Экспортёр не поднимался ни разу: тега danihodovic/celery-exporter:0.13.0 на Docker Hub не существует (`pull` → `not found`, логи джобы agent-apps 12.09 и 16.09), а под `set -e` упавший pull обрывал ВСЮ джобу — с 12.09 на Poincare не доезжало ничего из агента метрик: ни этот экспортёр, ни redis-exporter, ни новый конфиг Alloy. Второй дефект за первым: флага `--queue` в 0.12.2 нет, опция зовётся `--queues` — с одним исправленным тегом экспортёр упал бы при старте. Тег и флаг сверены с исходником (src/cli.py, src/exporter.py) и пробой на боевом брокере: временный контейнер 0.12.2 отдал `celery_worker_up{hostname="687f9212bebb"} 1.0`. Адрес брокера не тронут — алиас `gendesign-redis` на сети gendesign_shared существует и резолвится. Правило разделено на две новости. NoActiveCeleryWorkers — только когда экспортёр жив, а воркеров нет. QueueExporterDown (warning) — когда не отвечает сам экспортёр, с текстом «авария наблюдаемости, не продукта». Заодно прежняя ветка `count(celery_worker_up == 1) == 0` не сработала бы никогда: count() от пустого вектора пуст, мёртвый воркер она пропускала. ContainerNearMemoryLimit на tradein-postgres: working_set включает активный кэш страниц, ночные сканы поднимают его к потолку. Анонимная память за неделю 11–170 МБ из 3 ГБ, oom_kill = 0 за 21 сутки — «дальше OOM-kill» был ложью. Добавлено второе условие: анонимная память > 50 % лимита. Калибровка ЭТИМ выражением по 14 суткам истории: tradein-postgres 5 → 0 эпизодов, tradein-browser 2 → 2 (06.09 и 12.09, rss до 95 % — настоящие). Юнит-тесты правил (ops/metrics/prometheus/tests/infra_test.yml, 6 случаев, каждый уже случался на проде) исполняются деплоем перед reload. На старых правилах promtool test rules → rc=1 (6 расхождений), на новых → rc=0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>