]> git.proxmox.com Git - ceph.git/blame - ceph/src/pybind/mgr/dashboard/controllers/prometheus.py
import 15.2.5
[ceph.git] / ceph / src / pybind / mgr / dashboard / controllers / prometheus.py
CommitLineData
11fdf7f2
TL
1# -*- coding: utf-8 -*-
2from __future__ import absolute_import
3
4from datetime import datetime
5import json
6import requests
7
8from . import Controller, ApiController, BaseController, RESTController, Endpoint
9from ..security import Scope
10from ..settings import Settings
494da23a 11from ..exceptions import DashboardException
11fdf7f2
TL
12
13
14@Controller('/api/prometheus_receiver', secure=False)
15class PrometheusReceiver(BaseController):
9f95a23c
TL
16 """
17 The receiver is needed in order to receive alert notifications (reports)
18 """
11fdf7f2
TL
19 notifications = []
20
21 @Endpoint('POST', path='/')
22 def fetch_alert(self, **notification):
23 notification['notified'] = datetime.now().isoformat()
24 notification['id'] = str(len(self.notifications))
25 self.notifications.append(notification)
26
27
494da23a
TL
28class PrometheusRESTController(RESTController):
29 def prometheus_proxy(self, method, path, params=None, payload=None):
9f95a23c 30 # type (str, str, dict, dict)
494da23a 31 return self._proxy(self._get_api_url(Settings.PROMETHEUS_API_HOST),
9f95a23c 32 method, path, 'Prometheus', params, payload)
494da23a
TL
33
34 def alert_proxy(self, method, path, params=None, payload=None):
9f95a23c 35 # type (str, str, dict, dict)
494da23a 36 return self._proxy(self._get_api_url(Settings.ALERTMANAGER_API_HOST),
9f95a23c 37 method, path, 'Alertmanager', params, payload)
11fdf7f2 38
494da23a
TL
39 def _get_api_url(self, host):
40 return host.rstrip('/') + '/api/v1'
11fdf7f2 41
9f95a23c
TL
42 def _proxy(self, base_url, method, path, api_name, params=None, payload=None):
43 # type (str, str, str, str, dict, dict)
494da23a
TL
44 try:
45 response = requests.request(method, base_url + path, params=params, json=payload)
46 except Exception:
9f95a23c
TL
47 raise DashboardException(
48 "Could not reach {}'s API on {}".format(api_name, base_url),
49 http_status_code=404,
50 component='prometheus')
494da23a
TL
51 content = json.loads(response.content)
52 if content['status'] == 'success':
53 if 'data' in content:
54 return content['data']
55 return content
56 raise DashboardException(content, http_status_code=400, component='prometheus')
11fdf7f2 57
494da23a
TL
58
59@ApiController('/prometheus', Scope.PROMETHEUS)
60class Prometheus(PrometheusRESTController):
11fdf7f2 61 def list(self, **params):
494da23a
TL
62 return self.alert_proxy('GET', '/alerts', params)
63
64 @RESTController.Collection(method='GET')
65 def rules(self, **params):
9f95a23c 66 return self.prometheus_proxy('GET', '/rules', params)
494da23a
TL
67
68 @RESTController.Collection(method='GET', path='/silences')
69 def get_silences(self, **params):
70 return self.alert_proxy('GET', '/silences', params)
71
72 @RESTController.Collection(method='POST', path='/silence', status=201)
73 def create_silence(self, **params):
74 return self.alert_proxy('POST', '/silences', payload=params)
75
76 @RESTController.Collection(method='DELETE', path='/silence/{s_id}', status=204)
77 def delete_silence(self, s_id):
78 return self.alert_proxy('DELETE', '/silence/' + s_id) if s_id else None
11fdf7f2
TL
79
80
81@ApiController('/prometheus/notifications', Scope.PROMETHEUS)
82class PrometheusNotifications(RESTController):
83
84 def list(self, **params):
85 if 'from' in params:
86 f = params['from']
87 if f == 'last':
88 return PrometheusReceiver.notifications[-1:]
89 return PrometheusReceiver.notifications[int(f) + 1:]
90 return PrometheusReceiver.notifications