Files
sientia-dataops-opc-ingestor/ingestor/managers/data_manager.py
vitor-aignosi fa51d142e8 SIENTIAPDE-988
Enhance README and Docker setup; improve IngestorManager and DataManager functionality, add error handling, and implement unit tests for OPC initialization and subscription management.
2025-04-17 17:13:13 -03:00

59 lines
2.0 KiB
Python

import json
from logging import Logger
from kafka import KafkaProducer
class DataManager():
def __init__(self, kafka_servers: str, logger: Logger) -> None:
self.kafka_producer = KafkaProducer(
bootstrap_servers=kafka_servers,
value_serializer=lambda v: json.dumps(v).encode(
'utf-8'), # Serialize JSON messages
key_serializer=lambda k: str(k).encode('utf-8') if k else None,
)
self.logger = logger
def __del__(self):
"""Destructor to close the producer connection."""
self.logger.info("Closing Kafka producer...")
self.kafka_producer.flush()
self.kafka_producer.close()
def delivery_report(self, msg: str):
"""Callback for delivery reports from Kafka."""
self.logger.info(
f"Record successfully produced to {msg.topic} [{msg.partition}] at offset {msg.offset}")
def delivery_error(self, err: str):
"""Callback for delivery reports from Kafka."""
self.logger.error(f"Delivery failed for record : {err}")
def publish(self, topic: str, data: dict) -> None:
"""
Publishes a message to a specified Kafka topic.
Args:
topic (str): The name of the Kafka topic to which the message will be published.
data (dict): The message data to be sent to the Kafka topic.
Returns:
None
Raises:
Exception: If there is an error during message delivery, it will be handled by the `delivery_error` callback.
"""
try:
self.logger.info(
f"Publishing message to topic {topic}: {data}")
self.kafka_producer.send(
topic=topic, value=data).add_callback(
self.delivery_report).add_errback(
self.delivery_error)
self.kafka_producer.flush(timeout=10)
except Exception as e:
self.logger.error(f"Failed to publish message: {e}")