fix(observability): стек не поднимался — привилегированную роль спрашиваем у контейнера, а не угадываем (#3078) #3105
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#3105
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3078-metrics-role-discovery"
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?
Что случилось
После мержа #3099 стек наблюдаемости не поднялся ни на одном хосте — ни одного контейнера ни на Beget, ни на Poincare. Файлы при этом доехали на обе машины, CI был зелёный, PR смержен.
Джоба
serverвdeploy-metrics.ymlупала, аagent-appsиagent-infraпропустились как зависимые. Из лога задачи 23657 (26.08 08:55):Секреты были на месте — единственное предупреждение касалось выключенных телеграм-алертов, а падение произошло на создании read-only роли для датасорса Grafana.
Причина
scripts/setup-metrics-grafana-role.shискал привилегированную роль перебором трёх имён:Ни одно из трёх не совпадает ни с одним реальным кластером проекта — имя задаётся переменной
POSTGRES_USERобраза postgres:gendesign-infra-postgresgendesign-postgres-1tradein-postgresТо есть скрипт упал бы на любом кластере проекта, а не только на этом.
Отдельная ирония: комментарий прямо над перебором предупреждал, что «угадывать
postgresневерно: в образе оно задаётся переменнойPOSTGRES_USER» — и дальше шло угадывание.Замер на живом контейнере 26.08 (read-only, ничего не создавалось):
Что стало
Имя берём у самого контейнера —
POSTGRES_USERэто ровно та переменная, которой роль создана приinitdb, то есть источник истины, а не догадка:Прежний список оставлен после него запасным путём: он пригодится кластеру, поднятому не из образа postgres, где переменная пуста. Фикс добавляет источник истины, а не отменяет фолбэк.
Попутно: глоб в
paths:деплояВоркфлоу запускает три setup-скрипта (
secrets,grafana-role,exporter-dsn), а в триггере стоял только первый:Значит правка двух остальных не заводила выкат — на хосте молча продолжала исполняться старая версия. Тот же класс, что #2203 закрыл глобом
ops/*.sh, и без этой правки текущий PR не задеплоил бы сам себя. Заменено наscripts/setup-metrics-*.sh.Тесты
backend/tests/ops/test_3078_metrics_role_discovery.py, 6 штук. Исполняют РЕАЛЬНЫЙ скрипт с подставнымdocker(отвечает заinspect, отдаёт заданныйPOSTGRES_USER, принимаетpsqlтолько от привилегированной роли) и проверяют фактический выбор роли, а не наличие правильных слов в комментарии:infra— роль из контейнера выбрана, скрипт отработал;gendesignиtradein— два других кластера проекта;POSTGRES_USERпуст → работает прежний перебор (инвариант: фолбэк цел);paths:.Фальсификация: на исходном скрипте краснеют 3 из 5 ролевых тестов — проходят только те два, что фиксируют сохранённое поведение. Гард по
paths:на исходном воркфлоу тоже краснеет и указывает пальцем наsetup-metrics-exporter-dsn.sh.Проверено помимо тестов
bash -nизменённого скрипта; YAML воркфлоу парсится;tests/opsцеликом — 28 passed.Что этот PR НЕ чинит
Алерты останутся выключенными. В том же логе:
METRICS_TELEGRAM_BOT_TOKEN/CHAT_ID не заданы. Метрики и логи собираются, но предупреждать некому. Alertmanager без канала — ровно тот же класс «механизм есть, вывода нет», ради которого #3078 и заводился. Переменные секретные, задать их — за владельцем.TRADEIN_EXPORTER_DSNбудет пуст на Poincare.setup-metrics-exporter-dsn.shвыводит его изTRADEIN_DATABASE_URL, а той переменной там нет — это #3094. То есть экспортер базы Меры не заведётся, пока не закрыт #3094.Refs #3078, #3099