Update sientia-dataops-library version to 1.2.0 in requirements.txt; refactor logging in activities to use a unified Logger instance and include metadata in log messages across various activities.
84 lines
2.7 KiB
Python
84 lines
2.7 KiB
Python
import random
|
|
from datetime import datetime, timezone
|
|
from typing import Any
|
|
import json
|
|
from kafka import KafkaProducer
|
|
from temporalio import activity
|
|
|
|
from sientia_do.notifications.handlers import NotificationHandler
|
|
from sientia_do.temporal.activities.base import BaseActivity
|
|
from sientia_do.temporal.utils.logger import Logger
|
|
|
|
|
|
class Faker(BaseActivity):
|
|
def __init__(self, bootstrap_servers: str, logger: Logger,
|
|
notification_handler: NotificationHandler):
|
|
self.producer = KafkaProducer(
|
|
bootstrap_servers=bootstrap_servers,
|
|
value_serializer=lambda v: json.dumps(v).encode('utf-8')
|
|
)
|
|
|
|
# Predefined lists for tag and name
|
|
self.tags = {
|
|
'ns=1;i=1001': 'Temperature Sensor',
|
|
'ns=1;i=1002': 'Vibration Meter',
|
|
'ns=1;i=1003': 'Pressure Gauge',
|
|
'ns=1;i=1004': 'Flow Meter',
|
|
'ns=1;i=1005': 'Voltage Sensor',
|
|
'ns=1;i=1006': 'Current Sensor'
|
|
}
|
|
|
|
BaseActivity.__init__(self, logger, notification_handler)
|
|
|
|
@activity.defn(name="generate_and_send_data")
|
|
async def generate_and_send_data(self, input_data: dict[str, Any]):
|
|
"""
|
|
Generates random data and sends it to a Kafka topic.
|
|
|
|
Args:
|
|
input_data (dict[str, Any]): The input data containing:
|
|
topic (str): The Kafka topic to send data to
|
|
num_messages (int, optional): Number of messages to generate.
|
|
Defaults to random.randint(1, len(self.tags)).
|
|
|
|
"""
|
|
metadata = input_data['metadata']
|
|
topic = input_data.get('topic')
|
|
num_messages = input_data.get(
|
|
'num_messages', random.randint(1, len(self.tags))) # NOSONAR
|
|
|
|
if not topic:
|
|
raise ValueError("Topic must be specified in input_data")
|
|
|
|
self.info(
|
|
f"Generating {num_messages} messages for topic {topic}",
|
|
metadata=metadata
|
|
)
|
|
|
|
for _ in range(num_messages):
|
|
# Select random tag and name
|
|
tag = random.choice(list(self.tags.keys())) # NOSONAR
|
|
name = self.tags[tag]
|
|
|
|
# Generate random value between 0 and 100
|
|
if random.random() < 0.1: # NOSONAR
|
|
value = None
|
|
else:
|
|
value = round(random.uniform(0, 100), 2)
|
|
|
|
# Create data dictionary
|
|
data = {
|
|
'tag': tag,
|
|
'name': name,
|
|
'timestamp': datetime.now(timezone.utc).strftime('%Y-%m-%d %H:%M:%S'),
|
|
'value': value
|
|
}
|
|
|
|
# Send to Kafka
|
|
self.producer.send(topic, value=data)
|
|
|
|
# Ensure all messages are sent
|
|
self.producer.flush()
|
|
|
|
self.info("Success", metadata=metadata)
|