@@ -75,7 +75,7 @@ def format_response(self, data) -> [str]:
75
75
return resp
76
76
77
77
@execution_time ()
78
- def metrics (self , export_sensors : Optional [list ] = None ):
78
+ def metrics (self , export_sensors : Optional [list ] = None , filters : Optional [ dict ] = None ):
79
79
export_sensors = export_sensors or []
80
80
resp = []
81
81
@@ -84,18 +84,18 @@ def metrics(self, export_sensors: Optional[list] = None):
84
84
respList = self .format_response (collector .cached_metrics )
85
85
resp .extend (respList )
86
86
elif len (export_sensors ) > 0 :
87
- resp = self ._metrics (export_sensors )
87
+ resp = self ._metrics (export_sensors , filters )
88
88
else :
89
89
resp = self ._metrics (self .static_sensors_list )
90
90
91
91
return resp
92
92
93
- def _metrics (self , export_sensors : list ):
93
+ def _metrics (self , export_sensors : list , filters : Optional [ dict ] = None ):
94
94
resp = []
95
95
collectors = []
96
96
97
97
for sensor in export_sensors :
98
- collector = self .build_collector (sensor )
98
+ collector = self .build_collector (sensor , filters )
99
99
collectors .append (collector )
100
100
101
101
for collector in collectors :
@@ -121,27 +121,30 @@ def initialize_cache_collectors(self):
121
121
name = thread_name ).subscribe ()
122
122
123
123
@cond_execution_time (enabled = analytics .inspect )
124
- def build_collector (self , sensor ) -> SensorCollector :
124
+ def build_collector (self , sensor : str , filters : Optional [ dict ] = None ) -> SensorCollector :
125
125
126
126
period = self .md .getSensorPeriod (sensor )
127
127
if period < 1 :
128
128
self .logger .error (MSG ['SensorDisabled' ].format (sensor ))
129
129
raise cherrypy .HTTPError (400 , MSG ['SensorDisabled' ].format (sensor ))
130
130
131
- attrs = {}
131
+ attrs = {'sensor' : sensor , 'period' : period }
132
132
133
- if self .raw_data :
134
- attrs = {'sensor' : sensor , 'period' : period ,
135
- 'nsamples' : period , 'rawData' : True }
136
- elif "counter" in self .TOPO .getSensorMetricTypes (sensor ).values ():
137
- attrs = {'sensor' : sensor , 'period' : period ,
138
- 'nsamples' : period , 'rawData' : True }
133
+ if self .raw_data or "counter" in self .TOPO .getSensorMetricTypes (sensor ).values ():
134
+ attrs .update ({'nsamples' : period , 'rawData' : True })
139
135
self .logger .debug (MSG ['SensorForceRawData' ].format (sensor ))
140
136
else :
141
- attrs = {'sensor' : sensor , 'period' : period ,
142
- 'nsamples' : 1 }
137
+ attrs .update ({'nsamples' : 1 })
138
+ if filters :
139
+ for key , value in filters .items ():
140
+ if isinstance (value , list ):
141
+ filters [key ] = "|" .join (value )
142
+ self .logger .debug (f"Collector filters: { filters } " )
143
+ attrs ['filters' ] = filters
144
+
143
145
request = QueryPolicy (** attrs )
144
146
collector = SensorCollector (sensor , period , self .logger , request )
147
+ collector .validate_query_filters ()
145
148
146
149
# self.logger.trace(f'request instance {str(request.__dict__)}')
147
150
# self.logger.trace(f'Created Collector instance {str(collector.__dict__)}')
@@ -154,6 +157,7 @@ def GET(self, **params):
154
157
resp = []
155
158
156
159
self .logger .trace (f"Request headers:{ str (cherrypy .request .headers )} " )
160
+ self .logger .info (f"Request params:{ str (params )} " )
157
161
conn = cherrypy .request .headers .get ('Host' ).split (':' )
158
162
if len (conn ) == 2 and int (conn [1 ]) != int (self .port ):
159
163
self .logger .error (MSG ['EndpointNotSupportedForPort' ].
@@ -163,7 +167,7 @@ def GET(self, **params):
163
167
if self .endpoints and self .endpoints .get (cherrypy .request .script_name ,
164
168
None ):
165
169
sensor = self .endpoints [cherrypy .request .script_name ]
166
- resp = self .metrics ([sensor ])
170
+ resp = self .metrics ([sensor ], params )
167
171
cherrypy .response .headers ['Content-Type' ] = 'text/plain'
168
172
resString = '\n ' .join (resp ) + '\n '
169
173
return resString
0 commit comments