]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/pybind/mgr/dashboard/controllers/prometheus.py
import 14.2.4 nautilus point release
[ceph.git] / ceph / src / pybind / mgr / dashboard / controllers / prometheus.py
index b80fc05c4bc057d71f96d543ff3dfdca8f03938a..4145fbdfd8ca0518e7559276efa9469e90c47364 100644 (file)
@@ -8,6 +8,7 @@ import requests
 from . import Controller, ApiController, BaseController, RESTController, Endpoint
 from ..security import Scope
 from ..settings import Settings
+from ..exceptions import DashboardException
 
 
 @Controller('/api/prometheus_receiver', secure=False)
@@ -22,20 +23,57 @@ class PrometheusReceiver(BaseController):
         self.notifications.append(notification)
 
 
-@ApiController('/prometheus', Scope.PROMETHEUS)
-class Prometheus(RESTController):
+class PrometheusRESTController(RESTController):
+    def prometheus_proxy(self, method, path, params=None, payload=None):
+        return self._proxy(self._get_api_url(Settings.PROMETHEUS_API_HOST),
+                           method, path, params, payload)
+
+    def alert_proxy(self, method, path, params=None, payload=None):
+        return self._proxy(self._get_api_url(Settings.ALERTMANAGER_API_HOST),
+                           method, path, params, payload)
 
-    def _get_api_url(self):
-        return Settings.ALERTMANAGER_API_HOST.rstrip('/') + '/api/v1'
+    def _get_api_url(self, host):
+        return host.rstrip('/') + '/api/v1'
 
-    def _api_request(self, url_suffix, params=None):
-        url = self._get_api_url() + url_suffix
-        response = requests.request('GET', url, params=params)
-        payload = json.loads(response.content)
-        return payload['data'] if 'data' in payload else []
+    def _proxy(self, base_url, method, path, params=None, payload=None):
+        try:
+            response = requests.request(method, base_url + path, params=params, json=payload)
+        except Exception:
+            raise DashboardException('Could not reach external API', http_status_code=404,
+                                     component='prometheus')
+        content = json.loads(response.content)
+        if content['status'] == 'success':
+            if 'data' in content:
+                return content['data']
+            return content
+        raise DashboardException(content, http_status_code=400, component='prometheus')
 
+
+@ApiController('/prometheus', Scope.PROMETHEUS)
+class Prometheus(PrometheusRESTController):
     def list(self, **params):
-        return self._api_request('/alerts', params)
+        return self.alert_proxy('GET', '/alerts', params)
+
+    @RESTController.Collection(method='GET')
+    def rules(self, **params):
+        data = self.prometheus_proxy('GET', '/rules', params)
+        configs = data['groups']
+        rules = []
+        for config in configs:
+            rules += config['rules']
+        return rules
+
+    @RESTController.Collection(method='GET', path='/silences')
+    def get_silences(self, **params):
+        return self.alert_proxy('GET', '/silences', params)
+
+    @RESTController.Collection(method='POST', path='/silence', status=201)
+    def create_silence(self, **params):
+        return self.alert_proxy('POST', '/silences', payload=params)
+
+    @RESTController.Collection(method='DELETE', path='/silence/{s_id}', status=204)
+    def delete_silence(self, s_id):
+        return self.alert_proxy('DELETE', '/silence/' + s_id) if s_id else None
 
 
 @ApiController('/prometheus/notifications', Scope.PROMETHEUS)