From 63019752cb35482b386b0fe208f78eef63867fbf Mon Sep 17 00:00:00 2001
From: Jan David Mol <mol@astron.nl>
Date: Fri, 3 Sep 2021 11:44:17 +0200
Subject: [PATCH] L2SS-359: Expose 2D arrays as well, and prefix single-digit
 indices with 0 to allow alphabetical sorting.

---
 .../code/collector.py                         | 34 +++++++++++--------
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/docker-compose/tango-prometheus-exporter/code/collector.py b/docker-compose/tango-prometheus-exporter/code/collector.py
index 9c765e400..970d730a2 100644
--- a/docker-compose/tango-prometheus-exporter/code/collector.py
+++ b/docker-compose/tango-prometheus-exporter/code/collector.py
@@ -50,15 +50,15 @@ class CustomCollector(object):
                 attr_info.data_type == ArgType.DevLong64 or attr_info.data_type == ArgType.DevULong64 or
                 attr_info.data_type == ArgType.DevInt or attr_info.data_type == ArgType.DevFloat or 
                 attr_info.data_type == ArgType.DevDouble):
-                    metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, '', 'float', str(attr_value.dim_x), str(attr_value.dim_y), str(x), '0'], float(attr_value.value[x]))
+                    metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, '', 'float', str(attr_value.dim_x), str(attr_value.dim_y), f"{x:02}", '0'], float(attr_value.value[x]))
             elif(attr_info.data_type == ArgType.DevBoolean):
-                metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, '','bool', str(attr_value.dim_x), str(attr_value.dim_y), str(x), '0'], int(attr_value.value[x]))
+                metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, '','bool', str(attr_value.dim_x), str(attr_value.dim_y), f"{x:02}", '0'], int(attr_value.value[x]))
             elif(attr_info.data_type == ArgType.DevString):
-                metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, str(attr_value.value[x]),'string', str(attr_value.dim_x), str(attr_value.dim_y), str(x), '0'], 1)
+                metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, str(attr_value.value[x]),'string', str(attr_value.dim_x), str(attr_value.dim_y), f"{x:02}", '0'], 1)
             elif(attr_info.data_type == ArgType.DevEnum):
-                metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, str(attr_value.value[x]),'enum', str(attr_value.dim_x), str(attr_value.dim_y), str(x), '0'], int(attr_value.value[x]))
+                metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, str(attr_value.value[x]),'enum', str(attr_value.dim_x), str(attr_value.dim_y), f"{x:02}", '0'], int(attr_value.value[x]))
             elif(attr_info.data_type == ArgType.DevState):
-                metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, str(attr_value.value[x]),'state', str(attr_value.dim_x), str(attr_value.dim_y), str(x), '0'], int(attr_value.value[x]))
+                metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, str(attr_value.value[x]),'state', str(attr_value.dim_x), str(attr_value.dim_y), f"{x:02}", '0'], int(attr_value.value[x]))
             else:
                 pass
         return 1
@@ -67,20 +67,23 @@ class CustomCollector(object):
         attr_value = dev.read_attribute(attr_info.name)
         for y in range(int(attr_value.dim_y)): 
             for x in range(int(attr_value.dim_x)):
+                """ NOTE: We switch x and y in the annotation, to allow queries to combine 1D and 2D arrays in their first dimension using the same label (x). We effectively expose
+                          the array as [x][y] instead of [y][x]. """
+
                 if(attr_info.data_type == ArgType.DevShort or attr_info.data_type == ArgType.DevLong or
                     attr_info.data_type == ArgType.DevUShort or attr_info.data_type == ArgType.DevULong or
                     attr_info.data_type == ArgType.DevLong64 or attr_info.data_type == ArgType.DevULong64 or
                     attr_info.data_type == ArgType.DevInt or attr_info.data_type == ArgType.DevFloat or 
                     attr_info.data_type == ArgType.DevDouble):
-                        metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, '', 'float', str(attr_value.dim_x), str(attr_value.dim_y), str(x), str(y)], float(attr_value.value[y][x]))
+                        metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, '', 'float', str(attr_value.dim_x), str(attr_value.dim_y), f"{y:02}", f"{x:02}"], float(attr_value.value[y][x]))
                 elif(attr_info.data_type == ArgType.DevBoolean):
-                    metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, '','bool', str(attr_value.dim_x), str(attr_value.dim_y), str(x), str(y)], int(attr_value.value[y][x]))
+                    metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, '','bool', str(attr_value.dim_x), str(attr_value.dim_y), f"{y:02}", f"{x:02}"], int(attr_value.value[y][x]))
                 elif(attr_info.data_type == ArgType.DevString):
-                    metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, str(attr_value.value[y][x]),'string', str(attr_value.dim_x), str(attr_value.dim_y), str(x), str(y)], 1)
+                    metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, str(attr_value.value[y][x]),'string', str(attr_value.dim_x), str(attr_value.dim_y), f"{y:02}", f"{x:02}"], 1)
                 elif(attr_info.data_type == ArgType.DevEnum):
-                    metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, str(attr_value.value[y][x]),'enum', str(attr_value.dim_x), str(attr_value.dim_y), str(x), str(y)], int(attr_value.value[y][x]))
+                    metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, str(attr_value.value[y][x]),'enum', str(attr_value.dim_x), str(attr_value.dim_y), f"{y:02}", f"{x:02}"], int(attr_value.value[y][x]))
                 elif(attr_info.data_type == ArgType.DevState):
-                    metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, str(attr_value.value[y][x]),'state', str(attr_value.dim_x), str(attr_value.dim_y), str(x), str(y)], int(attr_value.value[y][x]))
+                    metric.add_metric([dev.dev_name(), attr_info.name, attr_info.label, str(attr_value.value[y][x]),'state', str(attr_value.dim_x), str(attr_value.dim_y), f"{y:02}", f"{x:02}"], int(attr_value.value[y][x]))
                 else:
                     pass
         return 1
@@ -179,12 +182,13 @@ class CustomCollector(object):
                                     read_count += 1
                                 
                             elif(attr_info.data_format == AttrDataFormat.IMAGE):
-                                # res = self.add_to_metric_image(dev, attr_info, attribute_metrics)
-                                # if(res <= 0):
-                                not_managed_attribute_count += 1
+                                res = self.add_to_metric_image(dev, attr_info, attribute_metrics)
+                                if(res <= 0):
+                                    not_managed_attribute_count += 1
                                 #print("*******NOT MANAGED: "+attr_info.name)
-                                image_count += 1
-                                # read_count += 1
+                                else:
+                                    image_count += 1
+                                    read_count += 1
                             else:
                                 # AttrDataFormat.FMT_UNKNOWN
                                 not_managed_attribute_count += 1
-- 
GitLab