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