fix(metrics): правка queries.yml доезжает до postgres-экспортёров (#3486)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 15s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 19s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Successful in 1m59s
CI / openapi-codegen-check (pull_request) Successful in 3m19s
CI / backend-tests (pull_request) Successful in 8m6s
All checks were successful
CI Trade-In / changes (pull_request) Successful in 15s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 19s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Successful in 1m59s
CI / openapi-codegen-check (pull_request) Successful in 3m19s
CI / backend-tests (pull_request) Successful in 8m6s
queries.yml смонтирован трём экспортёрам одним файлом и читается только при старте, а агентские джобы деплоя пересоздавали лишь alloy: правка ложилась на диск новым инодом, экспортёры продолжали отдавать старые запросы при зелёном деплое. Разрыв латентный — 17.09 иноды хоста и контейнеров совпадают (Poincare 5112170, Beget 569352). agent-apps и agent-infra после подъёма сверяют инод queries.yml у своих экспортёров через ops/metrics/recreate-stale-mount.sh и пересоздают только при расхождении, под гейтом профиля. Гейт пофайловых маунтов теперь читает и docker-compose.metrics-agent.yml (сервис → джоба по профилю), а ci.yml запускает backend-тесты на правку этого файла. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
e5db8dd80f
commit
ec85ea1861
3 changed files with 30 additions and 0 deletions
|
|
@ -233,6 +233,10 @@ jobs:
|
||||||
# уезжает в main зелёной. Ровно то, что осуждает комментарий выше.
|
# уезжает в main зелёной. Ровно то, что осуждает комментарий выше.
|
||||||
- '.forgejo/workflows/deploy-metrics.yml'
|
- '.forgejo/workflows/deploy-metrics.yml'
|
||||||
- 'docker-compose.metrics.yml'
|
- 'docker-compose.metrics.yml'
|
||||||
|
# #3486: гейт test_metrics_single_file_mounts.py читает и
|
||||||
|
# compose агентов — правка ТОЛЬКО его (новый пофайловый маунт у
|
||||||
|
# экспортёра) без этой строки прошла бы мимо гейта.
|
||||||
|
- 'docker-compose.metrics-agent.yml'
|
||||||
# #3443: тот же класс, третий раз. Гейт
|
# #3443: тот же класс, третий раз. Гейт
|
||||||
# backend/tests/ops/test_3443_caddy_reload_not_recreate.py не читает
|
# backend/tests/ops/test_3443_caddy_reload_not_recreate.py не читает
|
||||||
# ops/caddy-apply.sh, а ИСПОЛНЯЕТ его с подставным `docker` — то есть
|
# ops/caddy-apply.sh, а ИСПОЛНЯЕТ его с подставным `docker` — то есть
|
||||||
|
|
|
||||||
|
|
@ -599,6 +599,21 @@ jobs:
|
||||||
[ "$(stat -c %i ops/metrics/alloy/alloy-apps.alloy)" = "$(docker exec gendesign-alloy stat -c %i /etc/alloy/config.alloy)" ] \
|
[ "$(stat -c %i ops/metrics/alloy/alloy-apps.alloy)" = "$(docker exec gendesign-alloy stat -c %i /etc/alloy/config.alloy)" ] \
|
||||||
|| { echo "::error::alloy читает старый инод конфига"; exit 1; }
|
|| { echo "::error::alloy читает старый инод конфига"; exit 1; }
|
||||||
|
|
||||||
|
# ── postgres-экспортёры: queries.yml — бинд-маунт ОДНОГО файла (#3486) ──
|
||||||
|
# PG_EXPORTER_EXTEND_QUERY_PATH читается только при старте, а
|
||||||
|
# `git reset --hard` пишет правку новым инодом: без пересоздания
|
||||||
|
# экспортёр продолжает отдавать старые запросы при зелёном деплое.
|
||||||
|
# Пересоздаём только при расхождении инода. Под гейтом профиля:
|
||||||
|
# `up` с явным именем сервиса включает его профиль сам.
|
||||||
|
if [ -n "$EXPORTER_PROFILE" ]; then
|
||||||
|
METRICS_ROLE=apps METRICS_ALLOY_CONFIG=alloy-apps.alloy COMPOSE_PROFILES="$EXPORTER_PROFILE" \
|
||||||
|
sh ops/metrics/recreate-stale-mount.sh gendesign-metrics-agent docker-compose.metrics-agent.yml \
|
||||||
|
postgres-exporter-gendesign ops/metrics/postgres/queries.yml /etc/pg-queries.yml
|
||||||
|
METRICS_ROLE=apps METRICS_ALLOY_CONFIG=alloy-apps.alloy COMPOSE_PROFILES="$EXPORTER_PROFILE" \
|
||||||
|
sh ops/metrics/recreate-stale-mount.sh gendesign-metrics-agent docker-compose.metrics-agent.yml \
|
||||||
|
postgres-exporter-tradein ops/metrics/postgres/queries.yml /etc/pg-queries.yml
|
||||||
|
fi
|
||||||
|
|
||||||
agent-infra:
|
agent-infra:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: server
|
needs: server
|
||||||
|
|
@ -668,3 +683,10 @@ jobs:
|
||||||
|
|
||||||
[ "$(stat -c %i ops/metrics/alloy/alloy-infra.alloy)" = "$(docker exec gendesign-alloy stat -c %i /etc/alloy/config.alloy)" ] \
|
[ "$(stat -c %i ops/metrics/alloy/alloy-infra.alloy)" = "$(docker exec gendesign-alloy stat -c %i /etc/alloy/config.alloy)" ] \
|
||||||
|| { echo "::error::alloy читает старый инод конфига"; exit 1; }
|
|| { echo "::error::alloy читает старый инод конфига"; exit 1; }
|
||||||
|
|
||||||
|
# queries.yml экспортёра инфраструктурной БД — см. agent-apps (#3486).
|
||||||
|
if [ -n "$EXPORTER_PROFILE" ]; then
|
||||||
|
METRICS_ROLE=infra METRICS_ALLOY_CONFIG=alloy-infra.alloy COMPOSE_PROFILES="$EXPORTER_PROFILE" \
|
||||||
|
sh ops/metrics/recreate-stale-mount.sh gendesign-metrics-agent docker-compose.metrics-agent.yml \
|
||||||
|
postgres-exporter-infra ops/metrics/postgres/queries.yml /etc/pg-queries.yml
|
||||||
|
fi
|
||||||
|
|
|
||||||
|
|
@ -226,6 +226,7 @@ RENDERED = {
|
||||||
MOUNT = re.compile(r"^\./(?P<src>(?:\$\{[^}]*\}|[^:])+):(?P<dst>/[^:]+)")
|
MOUNT = re.compile(r"^\./(?P<src>(?:\$\{[^}]*\}|[^:])+):(?P<dst>/[^:]+)")
|
||||||
COMPOSE_FILES = {
|
COMPOSE_FILES = {
|
||||||
"docker-compose.metrics.yml": "gendesign-metrics",
|
"docker-compose.metrics.yml": "gendesign-metrics",
|
||||||
|
"docker-compose.metrics-agent.yml": "gendesign-metrics-agent",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -296,6 +297,9 @@ def test_gate_sees_the_known_mounts() -> None:
|
||||||
server = {(s, src) for s, src, _d, _p in _file_mounts("docker-compose.metrics.yml")}
|
server = {(s, src) for s, src, _d, _p in _file_mounts("docker-compose.metrics.yml")}
|
||||||
assert ("prometheus", "ops/metrics/prometheus/prometheus.yml") in server, server
|
assert ("prometheus", "ops/metrics/prometheus/prometheus.yml") in server, server
|
||||||
assert ("loki", "ops/metrics/loki/loki-config.yml") in server, server
|
assert ("loki", "ops/metrics/loki/loki-config.yml") in server, server
|
||||||
|
agent = {(s, src) for s, src, _d, _p in _file_mounts("docker-compose.metrics-agent.yml")}
|
||||||
|
for exporter in ("gendesign", "tradein", "infra"):
|
||||||
|
assert (f"postgres-exporter-{exporter}", "ops/metrics/postgres/queries.yml") in agent, agent
|
||||||
|
|
||||||
|
|
||||||
def test_gate_would_notice_a_mount_without_arrival() -> None:
|
def test_gate_would_notice_a_mount_without_arrival() -> None:
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue