diff --git a/docker-compose/tango-prometheus-exporter/code/tango-prometheus-client.py b/docker-compose/tango-prometheus-exporter/code/tango-prometheus-client.py index 505c89c5afc7216ce8c9627fcb4f2326f875f1f9..cb39534121ec4002501e7e091df106fbb5f01577 100644 --- a/docker-compose/tango-prometheus-exporter/code/tango-prometheus-client.py +++ b/docker-compose/tango-prometheus-exporter/code/tango-prometheus-client.py @@ -6,6 +6,7 @@ from tango import Database, DeviceProxy, CmdArgType as ArgType, AttrDataFormat, import logging import json import fnmatch +import re from logstash_async.handler import AsynchronousLogstashHandler, LogstashFormatter logger = logging.getLogger() @@ -37,8 +38,42 @@ class ArchiverPolicy(object): def __init__(self, config: dict = None): self.config = config or self.EMPTY_POLICY + def device_list(self) -> list: + """ Retrieve the device list from TangoDB """ + device_list = [] + db = Database() + server_list = db.get_server_list() # e.g. SDP/STAT, RECV/STAT + for i in range(0, len(server_list)): + # https://pytango.readthedocs.io/en/stable/database.html#tango.Database.get_device_class_list + class_list = db.get_device_class_list(server_list[i]) + for j in range(0, len(class_list), 2): + if "dserver" in class_list[j]: + continue + device_list.append(class_list[j].lower()) + return device_list + + def multimember_device_list(config_devices: list) -> list: + """ Retrieve multimember devices if there are any regulare expressions in the policy file """ + multimember_devices = [] + for device in config_devices: + if re.match('.*/.*/[*]', device): + members = Database().get_device_member(device) + retrieved_devices = [f"{device[:-1]}{m}" for m in members] + multimember_devices += retrieved_devices + return multimember_devices + def devices(self) -> list: - return list(self.config["devices"].keys()) + """ Filter the device list from TangoDB following the lofar2-policy file """ + # Devices list from TangoDB + db_devices = self.device_list() + # Devices listed in policy file + config_devices = list(k.lower() for k in self.config["devices"].keys()) + # Multimember device list + multimember_devices = self.multimember_device_list + # Filter devices following policy file + devices = [x for x in db_devices if x in config_devices] + devices += multimember_devices + return devices def attribute_list(self, device_name: str, attribute_list: list) -> dict: """ Return the full set of archiving policy for the given device. """ @@ -176,20 +211,6 @@ class CustomCollector(object): return metrics - def device_list(self) -> list: - """ Retrieve the device list from TangoDB """ - device_list = [] - db = Database() - server_list = db.get_server_list() # e.g. SDP/STAT, RECV/STAT - for i in range(0, len(server_list)): - # https://pytango.readthedocs.io/en/stable/database.html#tango.Database.get_device_class_list - class_list = db.get_device_class_list(server_list[i]) - for j in range(0, len(class_list), 2): - if "dserver" in class_list[j]: - continue - device_list.append(class_list[j].lower()) - return device_list - def collect(self): """ Yield all scraped metrics from all devices, as configured. """ diff --git a/docker-compose/tango-prometheus-exporter/lofar2-policy.json b/docker-compose/tango-prometheus-exporter/lofar2-policy.json index 5c7d49b01a2fdb2bf79a1b5d4559e8d9dc5e530b..06a1febb3267dcff2234597900a19d3ca858178d 100644 --- a/docker-compose/tango-prometheus-exporter/lofar2-policy.json +++ b/docker-compose/tango-prometheus-exporter/lofar2-policy.json @@ -29,6 +29,10 @@ }, "STAT/Docker/1": { }, + "STAT/Observation/*":{ + }, + "STAT/ObservationControl/1":{ + }, "STAT/PSOC/1": { }, "STAT/RECV/1": {