fix(generator): исключено смешение миров при запуске

- Зачем:
  - старый state и ручной live-генератор могли тихо писать события в новый мир данных.
- Что:
  - добавлена общая проверка чистого стенда для Airflow и host-путей.
  - защищены backfill, import, continue и clean-start сценарии live-generator.
  - описан миграционный отказ старого state.
- Проверка:
  - make generator-test; docker compose config --quiet; py_compile; bash -n.
This commit is contained in:
2026-07-05 20:21:13 +03:00
parent 525bd8cabf
commit 080d5ae313
17 changed files with 464 additions and 45 deletions
+60
View File
@@ -0,0 +1,60 @@
#!/usr/bin/env bash
#
# Проверяет, что новый мир генератора не смешается со старым.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
COMPOSE_BIN="${COMPOSE_BIN:-docker compose}"
KAFKA_BOOTSTRAP_SERVERS_HOST="${KAFKA_BOOTSTRAP_SERVERS_HOST:-localhost:9092}"
GENERATOR_METRICS_URL_HOST="${GENERATOR_METRICS_URL_HOST:-http://localhost:9109/metrics}"
CLICKHOUSE_SERVICE="${CLICKHOUSE_SERVICE:-clickhouse}"
CLICKHOUSE_DB="${CLICKHOUSE_DB:-default}"
CLICKHOUSE_USER="${CLICKHOUSE_USER:-default}"
CLICKHOUSE_PASSWORD="${CLICKHOUSE_PASSWORD:-123456}"
CHECK_MODE="${1:-clean}"
cd "${REPO_ROOT}"
if [[ "${CHECK_MODE}" != "clean" && "${CHECK_MODE}" != "continue" ]]; then
echo "Ошибка: неизвестный режим предпроверки: ${CHECK_MODE}" >&2
exit 2
fi
if [[ "${CHECK_MODE}" == "clean" ]]; then
echo "Предпроверка: live-генератор не должен быть запущен."
PYTHONPATH="${REPO_ROOT}/generator/src" \
uv run python -m clickstream_generator.stand_clean \
--mode live \
--live-metrics-url "${GENERATOR_METRICS_URL_HOST}"
fi
echo "Предпроверка: Kafka data-топики и STG должны быть пустыми или state совместим."
if ! stg_counts="$(${COMPOSE_BIN} exec -T "${CLICKHOUSE_SERVICE}" clickhouse-client \
--user="${CLICKHOUSE_USER}" \
--password="${CLICKHOUSE_PASSWORD}" \
--database="${CLICKHOUSE_DB}" \
--format=TSV \
--query "
SELECT
(SELECT count() FROM stg.browser_raw) AS browser_raw,
(SELECT count() FROM stg.location_raw) AS location_raw,
(SELECT count() FROM stg.device_raw) AS device_raw,
(SELECT count() FROM stg.geo_raw) AS geo_raw
")"; then
echo "Ошибка: не удалось проверить STG через ClickHouse." >&2
echo "Проверьте, что ClickHouse запущен и DDL применён: make ddl" >&2
echo "${stg_counts}" >&2
exit 1
fi
KAFKA_BOOTSTRAP_SERVERS="${KAFKA_BOOTSTRAP_SERVERS_HOST}" \
GEN_DATA_DIR="${REPO_ROOT}/data" \
PYTHONPATH="${REPO_ROOT}/generator/src" \
uv run python -m clickstream_generator.stand_clean \
--mode "${CHECK_MODE}" \
--kafka-bootstrap-servers "${KAFKA_BOOTSTRAP_SERVERS_HOST}" \
--stg-counts "${stg_counts}"
+7 -4
View File
@@ -43,13 +43,16 @@ echo "GEN_MODEL_T0=${GEN_MODEL_T0}"
echo "GEN_MODEL_T_END=${GEN_MODEL_T_END}"
echo ""
echo "Шаг 1: запуск Kafka"
${COMPOSE_BIN} up -d kafka
echo "Шаг 1: запуск Kafka и ClickHouse"
${COMPOSE_BIN} up -d kafka clickhouse
echo "Шаг 2: сборка образа генератора"
echo "Шаг 2: предпроверка чистого стенда"
bash "${SCRIPT_DIR}/assert_stand_clean.sh" clean
echo "Шаг 3: сборка образа генератора"
${COMPOSE_BIN} build generator
echo "Шаг 3: воспроизведение артефакта в Kafka"
echo "Шаг 4: воспроизведение артефакта в Kafka"
${COMPOSE_BIN} run --rm --no-deps \
-v "${ARTIFACT_DIR}:/startup-artifacts:ro" \
-e GEN_LAUNCH_PROFILE="${GEN_LAUNCH_PROFILE}" \
+1 -1
View File
@@ -59,7 +59,7 @@ echo ""
if [[ "${CLEAN_START}" == "1" ]]; then
echo "Шаг 0: очистка volumes ClickHouse/Kafka/state"
${COMPOSE_BIN} down -v --remove-orphans
${COMPOSE_BIN} --profile live-generator down -v --remove-orphans
else
echo "Шаг 0: CLEAN_START=0, очистка пропущена"
fi
+16 -4
View File
@@ -52,13 +52,16 @@ fi
echo ""
if [[ "${VERB}" == "backfill" ]]; then
echo "Шаг 1: запуск Kafka"
${COMPOSE_BIN} up -d kafka
echo "Шаг 1: запуск Kafka и ClickHouse"
${COMPOSE_BIN} up -d kafka clickhouse
echo "Шаг 2: сборка образа генератора"
echo "Шаг 2: предпроверка чистого стенда"
bash "${SCRIPT_DIR}/assert_stand_clean.sh" clean
echo "Шаг 3: сборка образа генератора"
${COMPOSE_BIN} build generator
echo "Шаг 3: backfill стартовой истории"
echo "Шаг 4: backfill стартовой истории"
${COMPOSE_BIN} run --rm --no-deps \
-e GEN_RUN_MODE="${GEN_RUN_MODE}" \
-e GEN_STATE_RESET="${GEN_STATE_RESET}" \
@@ -74,6 +77,15 @@ if [[ "${VERB}" == "backfill" ]]; then
-e GEN_MIN_EVENTS_PER_TICK="${GEN_MIN_EVENTS_PER_TICK}" \
-e GEN_MAX_EVENTS_PER_TICK="${GEN_MAX_EVENTS_PER_TICK}" \
generator
elif [[ "${VERB}" == "continue" ]]; then
echo "Шаг 1: запуск Kafka и ClickHouse"
${COMPOSE_BIN} up -d kafka clickhouse
echo "Шаг 2: проверка state или чистого стенда"
bash "${SCRIPT_DIR}/assert_stand_clean.sh" continue
echo "Шаг 3: запуск live-генератора"
${COMPOSE_BIN} up -d --build generator
else
echo "Шаг 1: запуск live-генератора"
${COMPOSE_BIN} up -d --build generator