feat(infra): добавлен автономный генератор событий для Kafka
- Зачем: - нужен постоянный поток данных для демонстрации работы стека - текущий batch-загрузчик не позволяет показать streaming-сценарии - Что: - добавлен сервис generator с режимом steady (Poisson-интенсивность) - генератор публикует в 4 топика: browser/location/device/geo_events - сохраняются связи event_id и click_id между событиями - сборка через uv для скорости и компактности образа - добавлены команды generator-* в Makefile - комплексные тесты: валидация, статистика, формат сообщений - Проверка: - `docker run --rm -v $(pwd)/..:/workspace -w /workspace/generator generator:test python test_comprehensive.py` — 8/8 тестов - `make generator-up` — 3 тика без ошибок, отправлено 2904 сообщения
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Скрипт для проверки сообщений в Kafka от генератора.
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
from kafka import KafkaConsumer
|
||||
|
||||
|
||||
def verify_messages(bootstrap_servers="kafka:29092", timeout_ms=10000):
|
||||
"""Проверяет сообщения в Kafka топиках."""
|
||||
print(f"Connecting to Kafka at {bootstrap_servers}...")
|
||||
|
||||
topics = ["browser_events", "location_events", "device_events", "geo_events"]
|
||||
|
||||
for topic in topics:
|
||||
print(f"\n=== Topic: {topic} ===")
|
||||
try:
|
||||
consumer = KafkaConsumer(
|
||||
topic,
|
||||
bootstrap_servers=bootstrap_servers,
|
||||
auto_offset_reset="latest",
|
||||
consumer_timeout_ms=timeout_ms,
|
||||
enable_auto_commit=False,
|
||||
group_id="verify-group",
|
||||
)
|
||||
|
||||
# Получаем информацию о партициях
|
||||
partitions = consumer.partitions_for_topic(topic)
|
||||
if partitions:
|
||||
print(f" Partitions: {partitions}")
|
||||
|
||||
# Смотрим end offsets
|
||||
end_offsets = consumer.end_offsets(
|
||||
[consumer.cluster.topic_partitions(topic)]
|
||||
)
|
||||
print(f" End offsets: {end_offsets}")
|
||||
|
||||
# Читаем последние сообщения
|
||||
messages = []
|
||||
for msg in consumer:
|
||||
messages.append(msg)
|
||||
if len(messages) >= 5:
|
||||
break
|
||||
|
||||
if messages:
|
||||
print(f" Last {len(messages)} messages:")
|
||||
for i, msg in enumerate(messages[:3]):
|
||||
value = json.loads(msg.value.decode("utf-8"))
|
||||
print(f" [{i}] offset={msg.offset}, key={msg.key}, value={json.dumps(value)[:100]}...")
|
||||
else:
|
||||
print(" No new messages")
|
||||
|
||||
consumer.close()
|
||||
|
||||
except Exception as e:
|
||||
print(f" Error: {e}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
verify_messages()
|
||||
Reference in New Issue
Block a user