From 0237550b9d924c9bc3b22e990a48b1a9cd40f8ed Mon Sep 17 00:00:00 2001 From: Patrick Seidensal Date: Tue, 19 Nov 2019 16:45:52 +0100 Subject: [PATCH] mgr/dashboard: return Prometheus alert groups, too Fixes: https://tracker.ceph.com/issues/42877 Signed-off-by: Patrick Seidensal (cherry picked from commit 4917279f9f5ed321cada297706a96e7ce16f01eb) --- .../mgr/dashboard/controllers/prometheus.py | 7 +------ .../silence-form.component.spec.ts | 21 ++++++++++++++----- .../silence-form/silence-form.component.ts | 7 ++++++- .../src/app/shared/api/prometheus.service.ts | 6 +++--- .../app/shared/models/prometheus-alerts.ts | 6 ++++++ 5 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/pybind/mgr/dashboard/controllers/prometheus.py b/src/pybind/mgr/dashboard/controllers/prometheus.py index 4145fbdfd8ca0..40333541d1aa6 100644 --- a/src/pybind/mgr/dashboard/controllers/prometheus.py +++ b/src/pybind/mgr/dashboard/controllers/prometheus.py @@ -56,12 +56,7 @@ class Prometheus(PrometheusRESTController): @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 + return self.prometheus_proxy('GET', '/rules', params) @RESTController.Collection(method='GET', path='/silences') def get_silences(self, **params): diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-form/silence-form.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-form/silence-form.component.spec.ts index 216c10bef228f..cd338b4355d7b 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-form/silence-form.component.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-form/silence-form.component.spec.ts @@ -108,11 +108,22 @@ describe('SilenceFormComponent', () => { ); ifPrometheusSpy = spyOn(prometheusService, 'ifPrometheusConfigured').and.callFake((fn) => fn()); rulesSpy = spyOn(prometheusService, 'getRules').and.callFake(() => - of([ - prometheus.createRule('alert0', 'someSeverity', [prometheus.createAlert('alert0')]), - prometheus.createRule('alert1', 'someSeverity', []), - prometheus.createRule('alert2', 'someOtherSeverity', [prometheus.createAlert('alert2')]) - ]) + of({ + groups: [ + { + file: '', + interval: 0, + name: '', + rules: [ + prometheus.createRule('alert0', 'someSeverity', [prometheus.createAlert('alert0')]), + prometheus.createRule('alert1', 'someSeverity', []), + prometheus.createRule('alert2', 'someOtherSeverity', [ + prometheus.createAlert('alert2') + ]) + ] + } + ] + }) ); router = TestBed.get(Router); diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-form/silence-form.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-form/silence-form.component.ts index a9eb0aed0d89f..8e984e907584e 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-form/silence-form.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-form/silence-form.component.ts @@ -186,7 +186,12 @@ export class SilenceFormComponent { this.prometheusService.ifPrometheusConfigured( () => this.prometheusService.getRules().subscribe( - (rules) => (this.rules = rules), + (groups) => { + this.rules = groups['groups'].reduce( + (acc, group) => _.concat(acc, group.rules), + [] + ); + }, () => { this.prometheusService.disablePrometheusConfig(); this.rules = []; diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/api/prometheus.service.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/api/prometheus.service.ts index bdcd7fd35f526..81488bbf0453e 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/api/prometheus.service.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/api/prometheus.service.ts @@ -7,7 +7,7 @@ import { AlertmanagerSilence } from '../models/alertmanager-silence'; import { AlertmanagerAlert, AlertmanagerNotification, - PrometheusRule + PrometheusRuleGroup } from '../models/prometheus-alerts'; import { ApiModule } from './api.module'; import { SettingsService } from './settings.service'; @@ -48,8 +48,8 @@ export class PrometheusService { return this.http.get(`${this.baseURL}/silences`, { params }); } - getRules(params = {}): Observable { - return this.http.get(`${this.baseURL}/rules`, { params }); + getRules(params = {}): Observable<{ groups: PrometheusRuleGroup[] }> { + return this.http.get<{ groups: PrometheusRuleGroup[] }>(`${this.baseURL}/rules`, { params }); } setSilence(silence: AlertmanagerSilence) { diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/models/prometheus-alerts.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/models/prometheus-alerts.ts index 56a0eb7f605d3..222581b1cda68 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/models/prometheus-alerts.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/models/prometheus-alerts.ts @@ -26,6 +26,12 @@ class PrometheusAlert { value: number; } +export interface PrometheusRuleGroup { + name: string; + file: string; + rules: PrometheusRule[]; +} + export class PrometheusRule { name: string; // => PrometheusAlertLabels.alertname query: string; -- 2.39.5