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