- Зачем:
- менти собирал мир генерацией (минуты и десятки минут CPU); теперь
готовый трёхдневный мир загружается импортом за ~2 минуты, и числа
у всех менти совпадают число-в-число (issue #3).
- Что:
- артефакт data/startup_history/reference-world.json.xz в git:
3 модельных дня daily-wave, ~850 МБ JSON → 32 МБ xz;
- чтение и запись артефакта понимают .xz потоково (lzma); пустое поле
artifact_path в пульте и make startup-history-import читают эталон;
- длительность профиля daily-wave стала 3d — в тон эталонному миру;
- предпроверка чистого стенда ставит зависимости генератора через uv;
экспорт и импорт разведены отдельными переменными Makefile;
- доки и runbook обновлены; новые контрактные тесты: xz round-trip
и дефолтные пути артефакта.
- Проверка:
- make test (210 + 31) и make lint зелёные; импорт на чистом стенде
за 2м03с, manifest совпал (280437 событий), Superset-проверка
зелёная; независимое ревью — APPROVED.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
197 lines
9.5 KiB
Makefile
197 lines
9.5 KiB
Makefile
.PHONY: up down clean ddl data transform logs \
|
|
generated-history-analytics generated-history-check generated-history-runtime-check generated-history-chain-check \
|
|
startup-history-export startup-history-import startup-history-check \
|
|
reload-monitoring recover-monitoring \
|
|
superset-init superset-dashboard superset-ui superset-restart \
|
|
generator-up generator-down generator-logs generator-restart \
|
|
generator-backfill generator-continue generator-reset \
|
|
generator-test generator-test-build generator-test-cov \
|
|
contract-test config-test test lint
|
|
|
|
COMPOSE ?= docker compose
|
|
STARTUP_HISTORY_EXPORT_ARTIFACT ?= $(or $(ARTIFACT),/tmp/clickstream-startup-history.json)
|
|
STARTUP_HISTORY_IMPORT_ARTIFACT ?= $(or $(ARTIFACT),data/startup_history/reference-world.json.xz)
|
|
PROFILE ?= daily-wave
|
|
PYTEST_ARGS ?= -q -p no:cacheprovider
|
|
PYTHON_CHECK_PATHS := airflow/dags configs generator scripts superset tests
|
|
BASH_SCRIPTS := $(shell find scripts -type f -name '*.sh' | sort)
|
|
|
|
# ============================================================================
|
|
# Основные команды
|
|
# ============================================================================
|
|
|
|
up:
|
|
$(COMPOSE) up -d --build clickhouse kafka kafka-ui postgres-metadata airflow-webserver airflow-scheduler prometheus grafana kafka-exporter statsd-exporter
|
|
|
|
# Остановить и удалить контейнеры/сети текущего проекта
|
|
down:
|
|
$(COMPOSE) --profile live-generator down
|
|
|
|
# Полная очистка окружения проекта (включая volumes)
|
|
clean:
|
|
$(COMPOSE) --profile live-generator down -v --remove-orphans
|
|
|
|
logs:
|
|
$(COMPOSE) logs -f --tail=200 $(service)
|
|
|
|
# ============================================================================
|
|
# ETL Pipeline
|
|
# ============================================================================
|
|
|
|
ddl:
|
|
bash ./scripts/apply_clickhouse_ddl.sh
|
|
|
|
data:
|
|
bash ./scripts/load_kafka_data.sh
|
|
|
|
transform:
|
|
bash ./scripts/run_batch.sh
|
|
|
|
# Чистый аналитический прогон: стартовая история генератора -> STG -> ODS -> DDS -> DM -> Superset
|
|
generated-history-analytics:
|
|
COMPOSE_BIN="$(COMPOSE)" bash ./scripts/run_generated_history_analytics.sh
|
|
|
|
# Повторяемая проверка после прогона стартовой истории
|
|
generated-history-check:
|
|
PROFILE="$${PROFILE:-$${GEN_LAUNCH_PROFILE:-$(PROFILE)}}" GEN_LAUNCH_PROFILE="$${GEN_LAUNCH_PROFILE:-$${PROFILE:-$(PROFILE)}}" CHECK_LIVE_SEAM="$${CHECK_LIVE_SEAM:-1}" COMPOSE_BIN="$(COMPOSE)" bash ./scripts/check_generated_analytics.sh
|
|
|
|
# Быстрый runtime gate issue 17: короткий daily-wave backfill + live seam без Superset UI
|
|
generated-history-runtime-check:
|
|
COMPOSE_BIN="$(COMPOSE)" bash ./scripts/run_generated_history_runtime_check.sh
|
|
|
|
# Проверить все завершённые стыки в накопительной цепочке модельных границ
|
|
generated-history-chain-check:
|
|
COMPOSE_BIN="$(COMPOSE)" bash ./scripts/check_generated_history_chain.sh
|
|
|
|
# Сгенерировать стартовую историю и сохранить портативный артефакт
|
|
startup-history-export:
|
|
ARTIFACT="$(STARTUP_HISTORY_EXPORT_ARTIFACT)" COMPOSE_BIN="$(COMPOSE)" bash ./scripts/export_startup_history_artifact.sh
|
|
|
|
# Воспроизвести портативный артефакт стартовой истории в Kafka
|
|
startup-history-import:
|
|
ARTIFACT="$(STARTUP_HISTORY_IMPORT_ARTIFACT)" COMPOSE_BIN="$(COMPOSE)" bash ./scripts/import_startup_history_artifact.sh
|
|
|
|
# Сверить ClickHouse после импорта с manifest артефакта
|
|
startup-history-check:
|
|
COMPOSE_BIN="$(COMPOSE)" bash ./scripts/check_startup_history_manifest.sh
|
|
|
|
# Перезагрузка конфигурации мониторинга (после изменений в provisioning)
|
|
reload-monitoring:
|
|
@echo "=== Перезагрузка сервисов мониторинга ==="
|
|
$(COMPOSE) up -d prometheus grafana kafka-exporter statsd-exporter
|
|
$(COMPOSE) restart prometheus statsd-exporter
|
|
@echo "=== Перезагрузка provisioning Grafana ==="
|
|
@sleep 2
|
|
@curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/datasources/reload && echo " [datasources]"
|
|
@curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/dashboards/reload && echo " [dashboards]"
|
|
@curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/alerting/reload && echo " [alerting]"
|
|
@echo "=== Проверка ==="
|
|
@curl -s http://localhost:9090/api/v1/targets | grep -o '"job":"[^"]*"' | sort | uniq
|
|
|
|
# Восстановление мониторинга после сбоев (например, out of bounds / пустые дашборды)
|
|
recover-monitoring:
|
|
@echo "=== Восстановление мониторинга (жесткий режим) ==="
|
|
$(COMPOSE) rm -sf prometheus statsd-exporter
|
|
$(COMPOSE) up -d prometheus grafana kafka-exporter statsd-exporter
|
|
$(COMPOSE) restart airflow-scheduler airflow-webserver
|
|
@echo "=== Перезагрузка provisioning Grafana ==="
|
|
@sleep 2
|
|
@curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/datasources/reload && echo " [datasources]"
|
|
@curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/dashboards/reload && echo " [dashboards]"
|
|
@curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/alerting/reload && echo " [alerting]"
|
|
@echo "=== Проверка targets ==="
|
|
@curl -s http://localhost:9090/api/v1/targets | grep -o '"job":"[^"]*"' | sort | uniq
|
|
@curl -s http://localhost:9090/api/v1/targets | grep -o '"health":"[^"]*"' | sort | uniq -c
|
|
|
|
# ============================================================================
|
|
# Superset команды
|
|
# ============================================================================
|
|
|
|
# Инициализация Superset (подключение к ClickHouse + датасеты)
|
|
superset-init:
|
|
$(COMPOSE) up -d postgres-metadata clickhouse
|
|
$(COMPOSE) up --abort-on-container-exit --exit-code-from superset-init superset-init
|
|
$(COMPOSE) up -d --no-deps superset
|
|
|
|
# Создание дашборда с чартами
|
|
superset-dashboard:
|
|
$(COMPOSE) exec -T superset bash -c "python /app/superset_init/create_dashboard.py"
|
|
|
|
# Открыть Superset UI
|
|
superset-ui:
|
|
@echo "Superset доступен по адресу: http://localhost:8088"
|
|
@echo "Логин: admin / Пароль: admin"
|
|
|
|
# Перезапуск Superset
|
|
superset-restart:
|
|
$(COMPOSE) restart superset
|
|
|
|
# ============================================================================
|
|
# Генератор событий (автономный стриминг)
|
|
# ============================================================================
|
|
|
|
# Запустить только генератор (полезно для отладки)
|
|
generator-up:
|
|
$(COMPOSE) up -d --build generator
|
|
|
|
# Остановить генератор
|
|
generator-down:
|
|
$(COMPOSE) stop generator
|
|
|
|
# Логи генератора
|
|
generator-logs:
|
|
$(COMPOSE) logs -f --tail=100 generator
|
|
|
|
# Перезапуск генератора с пересборкой
|
|
generator-restart:
|
|
$(COMPOSE) up -d --build --force-recreate generator
|
|
|
|
# Промотать стартовую историю через профиль запуска
|
|
generator-backfill:
|
|
COMPOSE_BIN="$(COMPOSE)" bash ./scripts/run_generator.sh backfill
|
|
|
|
# Продолжить live-поток из существующего state
|
|
generator-continue:
|
|
COMPOSE_BIN="$(COMPOSE)" bash ./scripts/run_generator.sh continue
|
|
|
|
# Запустить live-поток как новый мир
|
|
generator-reset:
|
|
COMPOSE_BIN="$(COMPOSE)" bash ./scripts/run_generator.sh reset
|
|
|
|
# Собрать тестовый образ генератора
|
|
generator-test-build:
|
|
cd generator && docker build -t generator:test .
|
|
|
|
# Запустить тесты генератора (pytest)
|
|
generator-test: generator-test-build
|
|
@echo "=== Запуск тестов генератора ==="
|
|
docker run --rm -v $(PWD):/workspace -w /workspace/generator generator:test pytest tests/ $(PYTEST_ARGS)
|
|
|
|
# Запустить тесты с покрытием
|
|
generator-test-cov: generator-test-build
|
|
@echo "=== Запуск тестов с покрытием ==="
|
|
docker run --rm -v $(PWD):/workspace -w /workspace/generator generator:test pytest tests/ -v --cov=. --cov-report=term-missing
|
|
|
|
# Запустить контрактные тесты верхнего уровня
|
|
contract-test: generator-test-build
|
|
@echo "=== Запуск контрактных тестов репозитория ==="
|
|
docker run --rm -v $(PWD):/workspace -w /workspace generator:test pytest tests/ $(PYTEST_ARGS)
|
|
|
|
# Проверить конфигурацию compose без запуска сервисов
|
|
config-test:
|
|
$(COMPOSE) config --quiet
|
|
|
|
# Быстрый предкоммитный набор: тесты генератора, контракты и конфигурация
|
|
test: generator-test contract-test config-test
|
|
|
|
# Статические проверки без запуска стенда
|
|
lint: generator-test-build
|
|
@echo "=== Проверка синтаксиса Python ==="
|
|
docker run --rm -e PYTHONPYCACHEPREFIX=/tmp/pycache -v $(PWD):/workspace -w /workspace generator:test python -m compileall -q $(PYTHON_CHECK_PATHS)
|
|
@echo "=== Проверка синтаксиса Bash ==="
|
|
bash -n $(BASH_SCRIPTS)
|
|
@echo "=== Проверка docker compose ==="
|
|
$(COMPOSE) config --quiet
|
|
@echo "=== Проверка пробелов в diff ==="
|
|
git diff --check
|