Зачем: рядом с кластером ClickHouse не хватало остальной платформы, а поднимать её по кускам — значит каждый раз вспоминать порядок. Теперь `make up` даёт стенд целиком, а `make smoke` честно отвечает, работает он или нет. Что: - Kafka в режиме KRaft (без ZooKeeper), Postgres под метаданные, Airflow 3.3 четырьмя сервисами и Superset 6.1 с драйверами ClickHouse; - мониторинг: Prometheus снимает метрики с обеих нод ClickHouse и keeper, Grafana получает подготовленный источник данных; - подключение Airflow ведёт на ноду 1, подключение Superset — на ноду 2: ловушка правильных ошибок, забытый `ON CLUSTER` виден в дашборде сам; - `scripts/stand-smoke.sh` — сквозная проверка из 24 пунктов: топик в Kafka, цели Prometheus, запуск примера DAG через API Airflow, проверка подключения Superset и расход памяти против порога 3,4 ГБ; - `make config-test` — статические ворота: Compose, синтаксис Bash и Python, стражи README; стражи smoke проверяют, что отчёт краснеет на сломанном стенде и зеленеет после восстановления; - решения записаны в `docs/adr/0001-stand-services.md`, состав стенда и порядок работы — в README. Проверка: на чистых томах `make clean` → `cp .env.example .env` → `make up` (1 мин 51 с) → `make smoke` — 24 пройдено, 0 ошибок, 2171 MiB. Перезапуск `make down` → `make up` → `make smoke` — 24/0. Также зелены `make config-test` (3/0 и 5/0), `make smoke-cluster` (8/8) и `make smoke-guards` (3/0 и 3/0). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
69 lines
2.4 KiB
Bash
Executable File
69 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -uo pipefail
|
|
|
|
readonly ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
read -r -a COMPOSE_CMD <<<"${COMPOSE_BIN:-docker compose}"
|
|
readonly LOG_FILE="$(mktemp)"
|
|
restored=0
|
|
passed=0
|
|
|
|
compose() {
|
|
"${COMPOSE_CMD[@]}" --project-directory "$ROOT_DIR" "$@"
|
|
}
|
|
|
|
restore_stand() {
|
|
make --no-print-directory -C "$ROOT_DIR" COMPOSE="${COMPOSE_BIN:-docker compose}" up >/dev/null
|
|
}
|
|
|
|
on_exit() {
|
|
local status=$?
|
|
trap - EXIT INT TERM
|
|
rm -f "$LOG_FILE"
|
|
if [[ "$restored" -eq 0 ]] && ! restore_stand; then
|
|
printf 'ОШИБКА: не удалось восстановить стенд после проверки.\n' >&2
|
|
status=1
|
|
fi
|
|
exit "$status"
|
|
}
|
|
|
|
trap on_exit EXIT
|
|
trap 'exit 130' INT TERM
|
|
|
|
if make --no-print-directory -C "$ROOT_DIR" COMPOSE="${COMPOSE_BIN:-docker compose}" smoke >"$LOG_FILE" 2>&1; then
|
|
passed=$((passed + 1))
|
|
printf 'ЗЕЛЁНО: перед проверкой отказа make smoke проходит полностью.\n'
|
|
else
|
|
printf 'ОШИБКА: исходный стенд не проходит make smoke; проверка отказа недостоверна.\n' >&2
|
|
exit 1
|
|
fi
|
|
|
|
compose stop prometheus >/dev/null
|
|
make --no-print-directory -C "$ROOT_DIR" COMPOSE="${COMPOSE_BIN:-docker compose}" smoke >"$LOG_FILE" 2>&1
|
|
status=$?
|
|
|
|
if [[ "$status" -ne 0 ]] && grep -q 'ОШИБКА: сервис prometheus' "$LOG_FILE"; then
|
|
passed=$((passed + 1))
|
|
printf 'ЗЕЛЁНО: остановленный prometheus делает make smoke красным и назван в отчёте.\n'
|
|
else
|
|
printf 'ОШИБКА: make smoke не обнаружил остановленный prometheus; код=%s.\n' "$status" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if ! restore_stand; then
|
|
printf 'ОШИБКА: не удалось восстановить стенд после проверки.\n' >&2
|
|
exit 1
|
|
fi
|
|
restored=1
|
|
|
|
if make --no-print-directory -C "$ROOT_DIR" COMPOSE="${COMPOSE_BIN:-docker compose}" smoke >"$LOG_FILE" 2>&1; then
|
|
passed=$((passed + 1))
|
|
printf 'ЗЕЛЁНО: после восстановления make smoke снова проходит полностью.\n'
|
|
else
|
|
printf 'ОШИБКА: после восстановления стенд не проходит make smoke.\n' >&2
|
|
exit 1
|
|
fi
|
|
|
|
rm -f "$LOG_FILE"
|
|
trap - EXIT INT TERM
|
|
printf 'ИТОГ: пройдено %d, ошибок 0\n' "$passed"
|