Add kafka test

This commit is contained in:
2024-08-07 23:59:44 +02:00
parent f525beaf11
commit 28f9bb389d
11 changed files with 913 additions and 0 deletions

View File

@@ -0,0 +1,17 @@
# Usa una imagen base de Python
FROM python:3.9-slim
# Configura el directorio de trabajo
WORKDIR /app
# Copia el archivo de requisitos al contenedor
COPY requirements.txt /app/
# Instala las dependencias
RUN pip install --no-cache-dir -r requirements.txt
# Copia el script de Python al contenedor
COPY consumer-notification.py /app/
# Comando por defecto para ejecutar el script
CMD ["python", "consumer-notification.py"]

View File

@@ -0,0 +1,66 @@
import json
import logging
from time import sleep
from kafka import KafkaConsumer
# Configuración del registro
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
def main():
# Nombre del tema de Kafka del que se consumen los mensajes
parsed_topic_name = 'parsed_recipes'
# Umbral de calorías para la notificación
calories_threshold = 200
# Crear un consumidor de Kafka
consumer = KafkaConsumer(
parsed_topic_name,
auto_offset_reset='earliest', # Inicia desde el 1er mensaje si es nuevo
bootstrap_servers=['kafka:9092'], # Servidor Kafka
api_version=(0, 10), # Versión de la API de Kafka
# Tiempo máx. de espera mensajes (milisegundos)
consumer_timeout_ms=2000
)
logging.info('[+] Iniciando el consumidor de notificaciones...')
try:
for msg in consumer:
# Decodificar el mensaje de JSON
record = json.loads(msg.value)
# Obtener el valor de calorías
calories = int(record.get('calories', 0))
title = record.get('title', 'Sin título') # Obtener el título
# Verificar si las calorías exceden el umbral
if calories > calories_threshold:
logging.warning(
f'[!] Alerta: {title} tiene {calories} calorías')
# Esperar 5 segundos antes de procesar el siguiente mensaje
sleep(5)
except Exception as ex:
logging.error(
'[!] Error en el consumidor de notificaciones', exc_info=True)
finally:
if consumer is not None:
consumer.close() # Cerrar el consumidor al finalizar
logging.info('[i] Consumidor cerrado.')
if __name__ == '__main__':
main()

View File

@@ -0,0 +1 @@
kafka-python