20
20
@author: HWASSMAN
21
21
'''
22
22
23
-
24
- from collections import defaultdict
23
+ import copy
24
+ from collections import defaultdict , OrderedDict
25
25
from typing import Set , List , Dict , DefaultDict
26
26
27
27
# dict.iteritems() deprecated in python 3
@@ -36,6 +36,7 @@ class Topo(object):
36
36
def __init__ (self , jsonStr = None ):
37
37
self .topo = jsonStr
38
38
self .__metricsDef = defaultdict (dict ) # metrics dictionary, per sensor for all elements in the metadata
39
+ self .__metricsType = defaultdict (dict ) # metrics types dictionary
39
40
self .__levels = defaultdict (dict ) # component level priority dictionary, per sensor
40
41
self .__ids = {} # fieldIds dictionary
41
42
self .__groupKeys = {}
@@ -55,22 +56,24 @@ def _processMetadata(self, metadata):
55
56
_components = defaultdict (set )
56
57
# filters dictionary, per sensor, per (cluster or cluster_node) component
57
58
_filters = defaultdict (list )
59
+ # ordered dictionary to store filedLabel:fieldName pairs in order as they occur in metaStr
60
+ _tags = OrderedDict ()
58
61
# name of the (cluster or cluster_node) component
59
62
label = metaStr .get ('fieldLabel' )
60
63
61
64
if label in self .__compTree .keys ():
62
65
_components = self .__compTree [label ]['componentsMap' ]
63
66
_filters = self .__compTree [label ]['filtersMap' ]
64
67
65
- self ._parse_topoJSONStr (self .__metricsDef , self .__levels , self .__ids , self .__groupKeys , _components , _filters , metaStr )
68
+ self ._parse_topoJSONStr (self .__metricsDef , self .__metricsType , self . __levels , self .__ids , self .__groupKeys , _components , _filters , _tags , metaStr )
66
69
tree_entry = {}
67
70
tree_entry ['componentsMap' ] = _components
68
71
tree_entry ['filtersMap' ] = _filters
69
72
70
73
# comp_tree[label] = tree_entry
71
74
self .__compTree [label ] = tree_entry
72
75
73
- def _parse_topoJSONStr (self , metrics , levels , ids , groupKeys , components , filters , metaStr ):
76
+ def _parse_topoJSONStr (self , metrics , metricsType , levels , ids , groupKeys , components , filters , _tags , metaStr ):
74
77
'''
75
78
This function parses the 'node' or 'attribute' object found in the given JSON string (metaStr) in
76
79
the componets or metrics dictionary. Also the used metric filters (per sensor) will be stored
@@ -80,15 +83,24 @@ def _parse_topoJSONStr(self, metrics, levels, ids, groupKeys, components, filter
80
83
81
84
field_value = metaStr ['fieldLabel' ]
82
85
field_name = metaStr ['fieldName' ]
86
+ field_type = metaStr ['fieldSemantics' ]
83
87
84
88
# check if entity is a component
85
89
if metaStr ['type' ] == 'node' :
90
+ if field_name == "sensor" :
91
+ # remove all partialKey tags from _tags dict except parent since we step in the new sensor level metaKey
92
+ parent = _tags .popitem (last = False )
93
+ _tags .clear ()
94
+ _tags .update ([parent ])
95
+ else :
96
+ _tags [field_name ] = field_value
97
+
86
98
if field_value not in components [field_name ]:
87
99
components [field_name ].add (field_value )
88
100
# check if metaStr includes next level metaStr
89
101
if 'keys' in metaStr and len (metaStr ['keys' ]) > 0 :
90
102
for metaKey in metaStr ['keys' ]:
91
- self ._parse_topoJSONStr (metrics , levels , ids , groupKeys , components , filters , metaKey )
103
+ self ._parse_topoJSONStr (metrics , metricsType , levels , ids , groupKeys , components , filters , _tags , metaKey )
92
104
93
105
# check if entity is a metric
94
106
elif metaStr ['type' ] == 'attribute' :
@@ -100,21 +112,22 @@ def _parse_topoJSONStr(self, metrics, levels, ids, groupKeys, components, filter
100
112
101
113
if field_name not in iterval (metrics [sensor ]):
102
114
metrics [sensor ][field_id ] = field_name
115
+ metricsType [field_name ] = field_type
103
116
104
117
if groupKey not in groupKeys :
105
118
# parse sensor relevant data f.e. groupKey, filters, levels
106
119
groupKeys [groupKey ] = len (groupKeys ) + 1
107
- tags = {}
108
- levTree = {}
109
- for i , compValue in enumerate (partKey ):
110
- for compLabel in components :
111
- if compValue in components [compLabel ]:
112
- levTree [i + 1 ] = compLabel
113
- tags [compLabel ] = compValue
114
- # if tags not in filters[sensor]:
115
- # not needed as groupkeys check will allow this to be reached only once
116
- filters [sensor ].append (tags )
120
+ group_tags = copy .deepcopy (_tags )
121
+
122
+ # if not all((value in tags.values()) for value in partKey):
123
+ # rint("different key values")
124
+
125
+ filters [sensor ].append (group_tags )
117
126
if sensor not in levels :
127
+ levTree = {}
128
+ for i , tag_key in enumerate (group_tags .keys ()):
129
+ levTree [i + 1 ] = tag_key
130
+
118
131
levels [sensor ] = levTree
119
132
120
133
# parse key id
@@ -177,6 +190,11 @@ def metricsSpec(self):
177
190
''' Returns all defined metrics as dictionary of (metric_name : metric_id) items '''
178
191
return self .__metricsDef
179
192
193
+ @property
194
+ def metricsType (self ):
195
+ ''' Returns a dictionary of (metric_name : metric_type) items '''
196
+ return self .__metricsType
197
+
180
198
@property
181
199
def getAllEnabledMetricsNames (self ):
182
200
''' Returns list of all found metrics names'''
@@ -201,7 +219,7 @@ def getSensorForMetric(self, searchMetric):
201
219
if (searchMetric .find ("(" ) >= 0 ):
202
220
searchMetric = searchMetric [searchMetric .find ("(" ) + 1 :- 1 ]
203
221
for sensor , metrics in self .__metricsDef .items ():
204
- if searchMetric in metrics .values ():
222
+ if searchMetric in set ( metrics .values () ):
205
223
return sensor
206
224
return None
207
225
@@ -237,7 +255,7 @@ def getAllFilterMapsForSensor(self, searchSensor):
237
255
based on metadata topology returned from zimon "topo".
238
256
'''
239
257
filtersMaps = []
240
- if searchSensor in self .allFiltersMaps .keys ():
258
+ if searchSensor in set ( self .allFiltersMaps .keys () ):
241
259
filtersMaps .extend (self .allFiltersMaps [searchSensor ])
242
260
return filtersMaps
243
261
@@ -274,13 +292,11 @@ def getAllFilterKeysForMetric(self, searchMetric):
274
292
return keys
275
293
276
294
def getAllFilterKeysForSensor (self , searchSensor ):
277
- keys = []
295
+ filter_keys = set ()
278
296
filtersMap = self .getAllFilterMapsForSensor (searchSensor )
279
- for a in filtersMap :
280
- keys .extend (list (a .keys ()))
281
- if len (keys ) > 1 :
282
- return list (set (keys ))
283
- return keys
297
+ for filter in filtersMap :
298
+ filter_keys .update (filter .keys ())
299
+ return list (filter_keys )
284
300
285
301
def getAllFilterKeysForMeasurementsMetrics (self , searchMetrics ):
286
302
filterKeys = []
0 commit comments