feat(generator): доработка по ревью rev5 — тики, метрики, история
- Зачем:
- ревью rev5 выявило несоответствие плану: дефолт 60s против 5s,
неработающий jitter, отсутствие Prometheus-метрик и персистентности
- Что:
- дефолт GEN_TICK_SECONDS изменён с 60s на 5s (steady-stream режим)
- реализован GEN_JITTER_PCT в расчёте объёма тика (вариативность)
- добавлены Prometheus метрики: generator_events_total,
generator_publish_errors_total, generator_tick_duration_seconds,
generator_last_success_timestamp (порт 9109)
- добавлен ClickHouseBatchHistory с записью в meta.generator_batches
- lazy import kafka-python для тестов без Kafka
- обновлён scrape_config в configs/prometheus.yml
- удалён нерабочий verify_kafka.py
- Проверка:
- test_comprehensive.py: 9/9 тестов пройдено
- docker build -t generator:rev5 . — успешно
- docker-compose.yml валиден
This commit is contained in:
+63
-33
@@ -1,6 +1,6 @@
|
||||
# Генератор событий (MVP)
|
||||
# Генератор событий (MVP rev5)
|
||||
|
||||
Автономный сервис для стриминга событий в Kafka.
|
||||
Автономный генератор событий для Kafka с режимом `steady-stream`.
|
||||
|
||||
## Архитектура
|
||||
|
||||
@@ -10,9 +10,11 @@ generator-service -> Kafka topics -> (потребители отдельно)
|
||||
|
||||
Генератор работает автономно и не зависит от потребителей (Airflow, ClickHouse).
|
||||
|
||||
## Режим работы: `steady`
|
||||
## Режим работы: `steady-stream`
|
||||
|
||||
- Каждую минуту публикуем переменный объём событий (Poisson + jitter)
|
||||
- Публикуем постепенно, **короткими тиками** (по умолчанию каждые 5 секунд)
|
||||
- На каждом тике отправляем небольшую порцию сообщений
|
||||
- Держим целевую интенсивность `events/min` без крупных минутных batch
|
||||
- Распределяем события по 4 топикам:
|
||||
- `browser_events`
|
||||
- `location_events`
|
||||
@@ -25,14 +27,26 @@ generator-service -> Kafka topics -> (потребители отдельно)
|
||||
| Переменная | Описание | По умолчанию |
|
||||
|------------|----------|--------------|
|
||||
| `KAFKA_BOOTSTRAP_SERVERS` | Адрес Kafka | `kafka:29092` |
|
||||
| `GEN_TICK_SECONDS` | Интервал между тиками | `60` |
|
||||
| `GEN_TICK_SECONDS` | Интервал между тиками | `5` (1-10 сек рекомендуется) |
|
||||
| `GEN_LAMBDA_BASE_PER_MIN` | Базовая интенсивность (событий/мин) | `200` |
|
||||
| `GEN_JITTER_PCT` | Процент вариативности | `20` |
|
||||
| `GEN_MIN_EVENTS_PER_TICK` | Минимум событий за тик | `50` |
|
||||
| `GEN_MAX_EVENTS_PER_TICK` | Максимум событий за тик | `500` |
|
||||
| `GEN_MIN_EVENTS_PER_TICK` | Минимум событий за тик | `5` |
|
||||
| `GEN_MAX_EVENTS_PER_TICK` | Максимум событий за тик | `50` |
|
||||
| `GEN_DATA_DIR` | Путь к JSONL файлам | `/data` |
|
||||
| `GEN_SEED` | Сид для воспроизводимости | — |
|
||||
| `GEN_ENABLED` | Включить генерацию | `true` |
|
||||
| `GEN_METRICS_PORT` | Порт для Prometheus | `9109` |
|
||||
| `CLICKHOUSE_HOST` | Хост ClickHouse для истории | `clickhouse` |
|
||||
| `CLICKHOUSE_PORT` | Порт ClickHouse | `9000` |
|
||||
|
||||
### Режим "раз в минуту" (для демо)
|
||||
|
||||
Для контролируемых демо можно установить:
|
||||
```bash
|
||||
GEN_TICK_SECONDS=60
|
||||
GEN_MIN_EVENTS_PER_TICK=50
|
||||
GEN_MAX_EVENTS_PER_TICK=500
|
||||
```
|
||||
|
||||
## Управление через Makefile
|
||||
|
||||
@@ -50,36 +64,59 @@ make generator-logs
|
||||
make generator-restart
|
||||
```
|
||||
|
||||
## Логи и метрики
|
||||
## Метрики Prometheus
|
||||
|
||||
### Логи
|
||||
Генератор экспортирует метрики на `:9109/metrics`:
|
||||
|
||||
```
|
||||
=== Tick 1 (batch_id=a1b2c3d4) ===
|
||||
Generating ~156 base events
|
||||
Batch a1b2c3d4 completed: sent=624, errors=0, gen_time=0.012s, pub_time=0.234s, total_time=0.247s
|
||||
browser_events: 156 sent
|
||||
location_events: 156 sent
|
||||
device_events: 156 sent
|
||||
geo_events: 156 sent
|
||||
Sleeping for 59.8s until next tick
|
||||
| Метрика | Тип | Описание |
|
||||
|---------|-----|----------|
|
||||
| `generator_events_total` | Counter | Всего отправлено событий (по топикам) |
|
||||
| `generator_publish_errors_total` | Counter | Ошибки публикации (по топикам) |
|
||||
| `generator_tick_duration_seconds` | Histogram | Длительность тика |
|
||||
| `generator_last_success_timestamp` | Gauge | Время последнего успешного тика |
|
||||
|
||||
### Проверка метрик
|
||||
|
||||
```bash
|
||||
curl http://localhost:9109/metrics
|
||||
curl http://localhost:9090/api/v1/targets | grep generator
|
||||
```
|
||||
|
||||
### Метрики (в коде)
|
||||
## История batch
|
||||
|
||||
- `generator_events_total` — всего отправлено событий
|
||||
- `generator_publish_errors_total` — ошибки публикации
|
||||
- `generator_tick_duration_seconds` — длительность тика
|
||||
История сохраняется в таблице `meta.generator_batches` (ClickHouse):
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
batch_id,
|
||||
started_at,
|
||||
sent_total,
|
||||
status
|
||||
FROM meta.generator_batches
|
||||
ORDER BY started_at DESC
|
||||
LIMIT 10
|
||||
```
|
||||
|
||||
Поля:
|
||||
- `batch_id` — идентификатор батча
|
||||
- `started_at` / `finished_at` — время начала/окончания
|
||||
- `sent_total` — всего отправлено
|
||||
- `sent_browser/location/device/geo` — по топикам
|
||||
- `status` — success/partial/error
|
||||
- `error_message` — описание ошибки (если есть)
|
||||
|
||||
## Тестирование
|
||||
|
||||
### Локальные тесты
|
||||
|
||||
```bash
|
||||
# Сборка образа для тестов
|
||||
docker build -t generator:test .
|
||||
|
||||
# Базовые тесты
|
||||
docker run --rm -v $(pwd)/..:/workspace -w /workspace/generator generator:test python test_local.py
|
||||
|
||||
# Комплексные тесты (проверка граничных случаев, статистики, формата)
|
||||
# Комплексные тесты
|
||||
docker run --rm -v $(pwd)/..:/workspace -w /workspace/generator generator:test python test_comprehensive.py
|
||||
```
|
||||
|
||||
@@ -92,17 +129,10 @@ make generator-up
|
||||
# Проверить логи
|
||||
make generator-logs
|
||||
|
||||
# Проверить метрики
|
||||
curl http://localhost:9109/metrics
|
||||
|
||||
# Проверить сообщения в Kafka
|
||||
docker compose exec kafka /opt/kafka/bin/kafka-console-consumer.sh \
|
||||
--bootstrap-server kafka:29092 --topic browser_events --from-beginning
|
||||
```
|
||||
|
||||
## История batch
|
||||
|
||||
Хранится в памяти (последние 1000 записей). Поля:
|
||||
|
||||
- `batch_id` — идентификатор батча
|
||||
- `started_at` / `finished_at` — время начала/окончания
|
||||
- `sent_total` — всего отправлено
|
||||
- `sent_browser/location/device/geo` — по топикам
|
||||
- `status` — success/partial/error
|
||||
|
||||
Reference in New Issue
Block a user