feat(gateway): DataSink.publish_reading multi-name fan-out

This commit is contained in:
PedroHMCosme
2026-07-14 10:51:52 -03:00
parent 44df022e32
commit ae88ac662e
2 changed files with 108 additions and 0 deletions

39
ingestor/io/data_sink.py Normal file
View File

@@ -0,0 +1,39 @@
import ingestor.metrics as metrics
class DataSink:
"""Gateway egress wrapper: fans a reading out to every configured name/collection.
`postgres` is unused for now — task 12 adds `update_write_status` on top of it.
"""
def __init__(self, data_manager, postgres, metadata: dict | None = None) -> None:
self.data_manager = data_manager
self.postgres = postgres
self.metadata = metadata
async def emit_metric(self, **kwargs) -> None:
# ponytail: delegate to data_manager, it's already a SientiaMonitoring
await self.data_manager.emit_metric(**kwargs)
async def publish_reading(self, tag: str, value, timestamp, names: list[dict]) -> None:
"""Publish one MongoDB document per name entry and record its tag value metric."""
for name in names:
doc = {
'tag': tag,
'name': name['tag_name'],
'model_id': name['model_id'],
'timestamp': timestamp,
'value': value,
}
await self.data_manager.publish(name['collection'], doc)
await self.emit_metric(
metric_object=metrics.OPC_TAG_VALUE,
method='set',
value=value,
tags={
'pod_id': self.data_manager.pod_id,
'tag_name': name['tag_name'],
'model_id': name['model_id'],
},
)