Skip to content

Commit 08a69f5

Browse files
authored
Merge pull request #156 from Helene/prometheus_endpoints
Enable flexible management of Prometheus endpoints
2 parents 20bde10 + 1e690d5 commit 08a69f5

File tree

4 files changed

+70
-440
lines changed

4 files changed

+70
-440
lines changed

source/messages.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
'MetricErr': 'Metric {0} cannot be found. Please check if the corresponding sensor is configured',
4343
'InconsistentParams': 'Received parameters {} inconsistent with request parameters {}',
4444
'SensorDisabled': 'Sensor for metric {} is disabled',
45+
'EndpointNotSupported': 'Endpoint {} you try to access is not supported',
4546
'NoData': 'Empty results received', # Please check the pmcollector is properly configured and running.
4647
'NoSensorConfigData': 'No sensor configuration data parsed',
4748
'NoDataStartNextAttempt': 'No Metadata results received from the pmcollector. Start retry attempt {} in 60s (MAX_ATTEMPTS_COUNT:{})',

source/prometheus.py

Lines changed: 12 additions & 241 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ def __init__(self, logger, mdHandler, port, raw_data=False):
3939
self.raw_data = raw_data
4040
self.static_sensors_list = ['CPU', 'Memory', 'GPFSFileset']
4141
self.cache_strategy = False
42+
self.endpoints = {}
4243
self.caching_collectors = []
4344
if self.cache_strategy:
4445
self.initialize_cache_collectors()
@@ -148,260 +149,30 @@ def GET(self, **params):
148149
raise cherrypy.HTTPError(400, MSG[400])
149150

150151
# /update
151-
if 'update' in cherrypy.request.script_name:
152+
if '/update' == cherrypy.request.script_name:
152153
# cherrypy.response.headers['Content-Type'] = 'application/json'
153154
resp = self.md.update()
154155

155-
# /metrics_gpfs_disk
156-
elif '/metrics_gpfs_disk' == cherrypy.request.script_name:
157-
resp = self.metrics(['GPFSDisk'])
158-
cherrypy.response.headers['Content-Type'] = 'text/plain'
159-
resString = '\n'.join(resp) + '\n'
160-
return resString
161-
162-
# /metrics_gpfs_filesystem
163-
elif 'metrics_gpfs_filesystem' in cherrypy.request.script_name:
164-
resp = self.metrics(['GPFSFilesystem'])
165-
cherrypy.response.headers['Content-Type'] = 'text/plain'
166-
resString = '\n'.join(resp) + '\n'
167-
return resString
168-
169-
# /metrics_gpfsnsddisk
170-
elif 'metrics_gpfs_nsddisk' in cherrypy.request.script_name:
171-
resp = self.metrics(['GPFSNSDDisk'])
172-
cherrypy.response.headers['Content-Type'] = 'text/plain'
173-
resString = '\n'.join(resp) + '\n'
174-
return resString
175-
176-
# /metrics_gpfs_poolio
177-
elif 'metrics_gpfs_poolio' in cherrypy.request.script_name:
178-
resp = self.metrics(['GPFSPoolIO'])
179-
cherrypy.response.headers['Content-Type'] = 'text/plain'
180-
resString = '\n'.join(resp) + '\n'
181-
return resString
182-
183-
# /metrics_gpfs_vfsx
184-
elif 'metrics_gpfs_vfsx' in cherrypy.request.script_name:
185-
resp = self.metrics(['GPFSVFSX'])
186-
cherrypy.response.headers['Content-Type'] = 'text/plain'
187-
resString = '\n'.join(resp) + '\n'
188-
return resString
189-
190-
# /metrics_gpfsioc
191-
elif 'metrics_gpfsioc' in cherrypy.request.script_name:
192-
resp = self.metrics(['GPFSIOC'])
193-
cherrypy.response.headers['Content-Type'] = 'text/plain'
194-
resString = '\n'.join(resp) + '\n'
195-
return resString
196-
197-
# /metrics_gpfs_vio64
198-
elif 'metrics_gpfs_vio64' in cherrypy.request.script_name:
199-
resp = self.metrics(['GPFSVIO64'])
200-
cherrypy.response.headers['Content-Type'] = 'text/plain'
201-
resString = '\n'.join(resp) + '\n'
202-
return resString
203-
204-
# /metrics_gpfs_pddisk
205-
elif 'metrics_gpfs_pddisk' in cherrypy.request.script_name:
206-
resp = self.metrics(['GPFSPDDisk'])
207-
cherrypy.response.headers['Content-Type'] = 'text/plain'
208-
resString = '\n'.join(resp) + '\n'
209-
return resString
210-
211-
# /metrics_gpfs_vflush
212-
elif 'metrics_gpfs_vflush' in cherrypy.request.script_name:
213-
resp = self.metrics(['GPFSvFLUSH'])
214-
cherrypy.response.headers['Content-Type'] = 'text/plain'
215-
resString = '\n'.join(resp) + '\n'
216-
return resString
217-
218-
# /metrics_gpfs_node
219-
elif 'metrics_gpfs_node' in cherrypy.request.script_name:
220-
resp = self.metrics(['GPFSNode'])
221-
cherrypy.response.headers['Content-Type'] = 'text/plain'
222-
resString = '\n'.join(resp) + '\n'
223-
return resString
224-
225-
# /metrics_gpfs_nodeapi
226-
elif 'metrics_gpfs_nodeapi' in cherrypy.request.script_name:
227-
resp = self.metrics(['GPFSNodeAPI'])
228-
cherrypy.response.headers['Content-Type'] = 'text/plain'
229-
resString = '\n'.join(resp) + '\n'
230-
return resString
231-
232-
# /metrics_gpfs_filesystemapi
233-
elif 'metrics_gpfs_filesystemapi' in cherrypy.request.script_name:
234-
resp = self.metrics(['GPFSFilesystemAPI'])
235-
cherrypy.response.headers['Content-Type'] = 'text/plain'
236-
resString = '\n'.join(resp) + '\n'
237-
return resString
238-
239-
# /metrics_gpfs_lroc
240-
elif 'metrics_gpfs_lroc' in cherrypy.request.script_name:
241-
resp = self.metrics(['GPFSLROC'])
242-
cherrypy.response.headers['Content-Type'] = 'text/plain'
243-
resString = '\n'.join(resp) + '\n'
244-
return resString
245-
246-
# /metrics_gpfs_chms
247-
elif 'metrics_gpfs_chms' in cherrypy.request.script_name:
248-
resp = self.metrics(['GPFSCHMS'])
249-
cherrypy.response.headers['Content-Type'] = 'text/plain'
250-
resString = '\n'.join(resp) + '\n'
251-
return resString
252-
253-
# /metrics_gpfs_afm
254-
elif '/metrics_gpfs_afm' == cherrypy.request.script_name:
255-
resp = self.metrics(['GPFSAFM'])
256-
cherrypy.response.headers['Content-Type'] = 'text/plain'
257-
resString = '\n'.join(resp) + '\n'
258-
return resString
259-
260-
# /metrics_gpfs_afmfs
261-
elif '/metrics_gpfs_afmfs' == cherrypy.request.script_name:
262-
resp = self.metrics(['GPFSAFMFS'])
263-
cherrypy.response.headers['Content-Type'] = 'text/plain'
264-
resString = '\n'.join(resp) + '\n'
265-
return resString
266-
267-
# /metrics_gpfs_afmfset
268-
elif '/metrics_gpfs_afmfset' == cherrypy.request.script_name:
269-
resp = self.metrics(['GPFSAFMFSET'])
270-
cherrypy.response.headers['Content-Type'] = 'text/plain'
271-
resString = '\n'.join(resp) + '\n'
272-
return resString
273-
274-
# /metrics_gpfs_rpcs
275-
elif 'metrics_gpfs_rpcs' in cherrypy.request.script_name:
276-
resp = self.metrics(['GPFSRPCS'])
277-
cherrypy.response.headers['Content-Type'] = 'text/plain'
278-
resString = '\n'.join(resp) + '\n'
279-
return resString
280-
281-
# /metrics_gpfs_filesetquota
282-
elif 'metrics_gpfs_filesetquota' in cherrypy.request.script_name:
283-
resp = self.metrics(['GPFSFilesetQuota'])
284-
cherrypy.response.headers['Content-Type'] = 'text/plain'
285-
resString = '\n'.join(resp) + '\n'
286-
return resString
287-
288-
# /metrics_gpfs_fileset
289-
elif 'metrics_gpfs_fileset' in cherrypy.request.script_name:
290-
resp = self.metrics(['GPFSFileset'])
291-
cherrypy.response.headers['Content-Type'] = 'text/plain'
292-
resString = '\n'.join(resp) + '\n'
293-
return resString
294-
295-
# /metrics_gpfs_pool
296-
elif 'metrics_gpfs_pool' in cherrypy.request.script_name:
297-
resp = self.metrics(['GPFSPool'])
298-
cherrypy.response.headers['Content-Type'] = 'text/plain'
299-
resString = '\n'.join(resp) + '\n'
300-
return resString
301-
302-
# /metrics_gpfs_diskcap
303-
elif '/metrics_gpfs_diskcap' == cherrypy.request.script_name:
304-
resp = self.metrics(['GPFSDiskCap'])
305-
cherrypy.response.headers['Content-Type'] = 'text/plain'
306-
resString = '\n'.join(resp) + '\n'
307-
return resString
308-
309-
# /metrics_gpfs_waiters
310-
elif 'metrics_gpfs_waiters' in cherrypy.request.script_name:
311-
resp = self.metrics(['GPFSWaiters'])
312-
cherrypy.response.headers['Content-Type'] = 'text/plain'
313-
resString = '\n'.join(resp) + '\n'
314-
return resString
315-
316-
# /metrics_gpfs_event_producer
317-
elif 'metrics_gpfs_event_producer' in cherrypy.request.script_name:
318-
resp = self.metrics(['GPFSEventProducer'])
319-
cherrypy.response.headers['Content-Type'] = 'text/plain'
320-
resString = '\n'.join(resp) + '\n'
321-
return resString
322-
323-
# /metrics_gpfs_mutex
324-
elif 'metrics_gpfs_mutex' in cherrypy.request.script_name:
325-
resp = self.metrics(['GPFSMutex'])
326-
cherrypy.response.headers['Content-Type'] = 'text/plain'
327-
resString = '\n'.join(resp) + '\n'
328-
return resString
329-
330-
# /metrics_gpfs_condvar
331-
elif 'metrics_gpfs_condvar' in cherrypy.request.script_name:
332-
resp = self.metrics(['GPFSCondvar'])
333-
cherrypy.response.headers['Content-Type'] = 'text/plain'
334-
resString = '\n'.join(resp) + '\n'
335-
return resString
336-
337-
# /metrics_gpfs_qos
338-
elif 'metrics_gpfs_qos' in cherrypy.request.script_name:
339-
resp = self.metrics(['GPFSQoS'])
340-
cherrypy.response.headers['Content-Type'] = 'text/plain'
341-
resString = '\n'.join(resp) + '\n'
342-
return resString
343-
344-
# /metrics_gpfs_fcm
345-
elif 'metrics_gpfs_fcm' in cherrypy.request.script_name:
346-
resp = self.metrics(['GPFSFCM'])
347-
cherrypy.response.headers['Content-Type'] = 'text/plain'
348-
resString = '\n'.join(resp) + '\n'
349-
return resString
350-
351-
# /metrics_nfsio
352-
elif 'metrics_nfsio' in cherrypy.request.script_name:
353-
resp = self.metrics(['NFSIO'])
354-
cherrypy.response.headers['Content-Type'] = 'text/plain'
355-
resString = '\n'.join(resp) + '\n'
356-
return resString
357-
358-
# /metrics_smb_stats
359-
elif 'metrics_smb_stats' in cherrypy.request.script_name:
360-
resp = self.metrics(['SMBStats'])
361-
cherrypy.response.headers['Content-Type'] = 'text/plain'
362-
resString = '\n'.join(resp) + '\n'
363-
return resString
364-
365-
# /metrics_smb_globalstats
366-
elif 'metrics_smb_globalstats' in cherrypy.request.script_name:
367-
resp = self.metrics(['SMBGlobalStats'])
368-
cherrypy.response.headers['Content-Type'] = 'text/plain'
369-
resString = '\n'.join(resp) + '\n'
370-
return resString
371-
372-
# /metrics_ctdb_stats
373-
elif 'metrics_ctdb_stats' in cherrypy.request.script_name:
374-
resp = self.metrics(['CTDBStats'])
375-
cherrypy.response.headers['Content-Type'] = 'text/plain'
376-
resString = '\n'.join(resp) + '\n'
377-
return resString
378-
379-
# /metrics_ctdb_dbstats
380-
elif 'metrics_ctdb_dbstats' in cherrypy.request.script_name:
381-
resp = self.metrics(['CTDBDBStats'])
156+
elif self.endpoints and self.endpoints.get(cherrypy.request.script_name,
157+
None):
158+
sensor = self.endpoints[cherrypy.request.script_name]
159+
resp = self.metrics([sensor])
382160
cherrypy.response.headers['Content-Type'] = 'text/plain'
383161
resString = '\n'.join(resp) + '\n'
384162
return resString
385163

386164
# /metrics
387-
elif 'metrics' in cherrypy.request.script_name:
165+
elif '/metrics' == cherrypy.request.script_name:
388166
resp = self.metrics()
389167
cherrypy.response.headers['Content-Type'] = 'text/plain'
390168
resString = '\n'.join(resp) + '\n'
391169
return resString
392170

393-
elif 'aggregators' in cherrypy.request.script_name:
394-
resp = ["noop", "sum", "avg", "max", "min", "rate"]
395-
396-
elif 'config/filters' in cherrypy.request.script_name:
397-
supportedFilters = {}
398-
filterDesc = {}
399-
filterDesc['description'] = '''Accepts an exact value or a regular expressions and matches against
400-
values for the given tag. The value can be omitted if the filter is used to specify groupBy on the tag only.'''
401-
filterDesc['examples'] = '''node=pm_filter(machine1), node=pm_filter(machine[1-6]), node=pm_filter(m1|m2),
402-
node=pm_filter(mac.*), node=pm_filter((?!^z).*)'''
403-
supportedFilters['pm_filter'] = filterDesc
404-
resp = supportedFilters
171+
else:
172+
self.logger.error(MSG['EndpointNotSupported'].format(sensor))
173+
raise cherrypy.HTTPError(400,
174+
MSG['EndpointNotSupported'].format(
175+
cherrypy.request.script_name))
405176

406177
del cherrypy.response.headers['Allow']
407178
cherrypy.response.headers['Access-Control-Allow-Origin'] = '*'

source/prometheus_endpoints.json

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"/metrics_gpfs_disk": "GPFSDisk",
3+
"/metrics_gpfs_filesystem": "GPFSFilesystem",
4+
"/metrics_gpfs_nsddisk": "GPFSNSDDisk",
5+
"/metrics_gpfs_poolio": "GPFSPoolIO",
6+
"/metrics_gpfs_vfsx": "GPFSVFSX",
7+
"/metrics_gpfsioc": "GPFSIOC",
8+
"/metrics_gpfs_vio64": "GPFSVIO64",
9+
"/metrics_gpfs_pddisk": "GPFSPDDisk",
10+
"/metrics_gpfs_vflush": "GPFSvFLUSH",
11+
"/metrics_gpfs_node": "GPFSNode",
12+
"/metrics_gpfs_nodeapi": "GPFSNodeAPI",
13+
"/metrics_gpfs_filesystemapi": "GPFSFilesystemAPI",
14+
"/metrics_gpfs_lroc": "GPFSLROC",
15+
"/metrics_gpfs_chms": "GPFSCHMS",
16+
"/metrics_gpfs_afm": "GPFSAFM",
17+
"/metrics_gpfs_afmfs": "GPFSAFMFS",
18+
"/metrics_gpfs_afmfset": "GPFSAFMFSET",
19+
"/metrics_gpfs_filesetquota": "GPFSFilesetQuota",
20+
"/metrics_gpfs_fileset": "GPFSFileset",
21+
"/metrics_gpfs_pool": "GPFSPool",
22+
"/metrics_gpfs_diskcap": "GPFSDiskCap",
23+
"/metrics_gpfs_event_producer": "GPFSEventProducer",
24+
"/metrics_gpfs_mutex": "GPFSMutex",
25+
"/metrics_gpfs_condvar": "GPFSCondvar",
26+
"/metrics_gpfs_qos": "GPFSQoS",
27+
"/metrics_gpfs_fcm": "GPFSFCM",
28+
"/metrics_nfsio": "NFSIO",
29+
"/metrics_smb_stats": "SMBStats",
30+
"/metrics_smb_globalstats": "SMBGlobalStats",
31+
"/metrics_ctdb_stats": "CTDBStats",
32+
"/metrics_ctdb_dbstats": "CTDBDBStats"
33+
}

0 commit comments

Comments
 (0)