SIENTIAPDE-1325
Enhance Ingestor Class with Asynchronous Metrics and Monitoring Integration - Refactored Ingestor class to inherit from SientiaMonitoring for improved observability. - Updated methods to utilize asynchronous operations for declaring active ingestors and managing slots. - Integrated pod_id label into various metrics for better tracking. - Adjusted unit tests to reflect changes in the Ingestor initialization and asynchronous behavior.
This commit is contained in:
@@ -5,12 +5,13 @@ from typing import Any
|
||||
from sientia_do.notifications.handlers import CoreNotificationHandler as NotificationHandler
|
||||
from sientia_do.observability.logger import get_logger
|
||||
from sientia_do.observability.metrics_controller import MetricsController
|
||||
from sientia_do.observability.sientia_monitoring import SientiaMonitoring
|
||||
|
||||
import ingestor.metrics as metrics
|
||||
from ingestor.managers.ingestor_manager import IngestorManager
|
||||
|
||||
|
||||
class Ingestor:
|
||||
class Ingestor(SientiaMonitoring):
|
||||
"""
|
||||
Main OPC Ingestor class that orchestrates data collection from OPC UA servers.
|
||||
|
||||
@@ -100,6 +101,13 @@ class Ingestor:
|
||||
)
|
||||
self.metrics_controller = MetricsController(logger=self.logger)
|
||||
|
||||
SientiaMonitoring.__init__(
|
||||
self,
|
||||
logger=self.logger,
|
||||
notification_handler=self.notification_handler,
|
||||
metrics_controller=self.metrics_controller,
|
||||
)
|
||||
|
||||
self.metadata = {
|
||||
'model_id': '-',
|
||||
'model_name': '-',
|
||||
@@ -192,17 +200,22 @@ class Ingestor:
|
||||
assert self.ingestor_manager is not None
|
||||
|
||||
# Declare ingestor active
|
||||
self.ingestor_manager.declare_active()
|
||||
await self.ingestor_manager.declare_active()
|
||||
|
||||
# Get slot lease
|
||||
acquired = self.ingestor_manager.get_slot_leases()
|
||||
acquired = await self.ingestor_manager.get_slot_leases()
|
||||
self.logger.info(f'Acquired slots: {acquired}')
|
||||
|
||||
await self.handle_acquired_tags(acquired)
|
||||
|
||||
metrics.SLOTS_MANAGED.labels(pod_id=self.pod_id).set(
|
||||
len(self.ingestor_manager.managed_tags)
|
||||
) # Set initial
|
||||
await self.emit_metric(
|
||||
metric_object=metrics.SLOTS_MANAGED,
|
||||
method='set',
|
||||
value=len(self.ingestor_manager.managed_tags),
|
||||
tags={
|
||||
'pod_id': self.pod_id,
|
||||
},
|
||||
)
|
||||
|
||||
async def manage_no_slots(self, number_of_slots: int):
|
||||
"""
|
||||
@@ -273,9 +286,13 @@ class Ingestor:
|
||||
await self.ingestor_manager.unsubscribe_slot(lease)
|
||||
self.ingestor_manager.managed_tags.pop(lease)
|
||||
|
||||
# Update metric after removal
|
||||
metrics.SLOTS_MANAGED.labels(pod_id=self.pod_id).set(
|
||||
len(self.ingestor_manager.managed_tags)
|
||||
await self.emit_metric(
|
||||
metric_object=metrics.SLOTS_MANAGED,
|
||||
method='set',
|
||||
value=len(self.ingestor_manager.managed_tags),
|
||||
tags={
|
||||
'pod_id': self.pod_id,
|
||||
},
|
||||
)
|
||||
|
||||
async def update_ingestor_manager(self, old_managed_tags: dict[str, Any]):
|
||||
@@ -337,9 +354,13 @@ class Ingestor:
|
||||
self.logger.info(f'Unsubscribing from slot {slot}')
|
||||
await self.ingestor_manager.unsubscribe_slot(slot)
|
||||
|
||||
# Ensure the gauge is updated after any potential changes here
|
||||
metrics.SLOTS_MANAGED.labels(pod_id=self.pod_id).set(
|
||||
len(self.ingestor_manager.managed_tags)
|
||||
await self.emit_metric(
|
||||
metric_object=metrics.SLOTS_MANAGED,
|
||||
method='set',
|
||||
value=len(self.ingestor_manager.managed_tags),
|
||||
tags={
|
||||
'pod_id': self.pod_id,
|
||||
},
|
||||
)
|
||||
|
||||
async def loop(self):
|
||||
@@ -369,7 +390,7 @@ class Ingestor:
|
||||
if not self.ingestor_manager:
|
||||
return
|
||||
|
||||
self.ingestor_manager.declare_active()
|
||||
await self.ingestor_manager.declare_active()
|
||||
|
||||
self.logger.info('Polling for slot updates...')
|
||||
# Get active ingestors
|
||||
@@ -382,7 +403,14 @@ class Ingestor:
|
||||
number_of_slots = await self.ingestor_manager.get_number_of_slots()
|
||||
|
||||
# Update active ingestors gauge
|
||||
metrics.ACTIVE_INGESTORS.set(number_of_ingestors)
|
||||
await self.emit_metric(
|
||||
metric_object=metrics.ACTIVE_INGESTORS,
|
||||
method='set',
|
||||
value=number_of_ingestors,
|
||||
tags={
|
||||
'pod_id': self.pod_id,
|
||||
},
|
||||
)
|
||||
|
||||
# Handle no slots
|
||||
self.logger.info('Managing no slots...')
|
||||
@@ -396,8 +424,13 @@ class Ingestor:
|
||||
await self.manage_leases(available_slots, lacking_ingestors, slot_diff)
|
||||
|
||||
# Update managed slots gauge
|
||||
metrics.SLOTS_MANAGED.labels(pod_id=self.pod_id).set(
|
||||
len(self.ingestor_manager.managed_tags)
|
||||
await self.emit_metric(
|
||||
metric_object=metrics.SLOTS_MANAGED,
|
||||
method='set',
|
||||
value=len(self.ingestor_manager.managed_tags),
|
||||
tags={
|
||||
'pod_id': self.pod_id,
|
||||
},
|
||||
)
|
||||
|
||||
self.logger.debug(
|
||||
|
||||
@@ -58,14 +58,17 @@ APP_UP = Gauge(
|
||||
ACTIVE_INGESTORS = Gauge(
|
||||
'ingestor_active_total',
|
||||
'Number of active ingestors reported by Redis',
|
||||
POD_ID_LABEL,
|
||||
)
|
||||
SLOTS_TOTAL = Gauge(
|
||||
'ingestor_slots_total',
|
||||
'Total number of slots configured in Redis',
|
||||
POD_ID_LABEL,
|
||||
)
|
||||
LEASES_TOTAL = Gauge(
|
||||
'ingestor_leases_total',
|
||||
'Total number of leases (allocated slots) in Redis',
|
||||
POD_ID_LABEL,
|
||||
)
|
||||
SLOTS_MANAGED = Gauge(
|
||||
'ingestor_slots_managed_current',
|
||||
|
||||
Reference in New Issue
Block a user