Files
clickstream-ch-kafka-supers…/generator/verify_kafka.py
T
ddadminandDmitry Dementiev e8d1c9efa9 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 сообщения
2026-06-09 17:27:01 +03:00

63 lines
2.1 KiB
Python

#!/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()