]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: alert badge includes suppressed alerts 39512/head
authorAashish Sharma <aashishsharma@localhost.localdomain>
Mon, 4 Jan 2021 05:09:16 +0000 (10:39 +0530)
committerAashish Sharma <aashishsharma@localhost.localdomain>
Wed, 17 Feb 2021 08:25:55 +0000 (13:55 +0530)
On a cluster with alerting enabled, when alerts are triggered, even if they are silenced, the vertical navigation item (Cluster > Monitoring) displays the total number of alerts, including the ones suppressed.This PR intends to fix this issue.

Fixes: https://tracker.ceph.com/issues/48591
Signed-off-by: Aashish Sharma <aasharma@redhat.com>
(cherry picked from commit b4e32461f1f8430f223965c245974b2a2dbab3aa)

src/pybind/mgr/dashboard/frontend/src/app/core/navigation/navigation/navigation.component.html
src/pybind/mgr/dashboard/frontend/src/app/shared/services/prometheus-alert.service.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/prometheus-alert.service.ts

index 891f674785ddd46b3bf9b4c457d77f1b76f23c26..5a71b110bfb9871ffd96b82858fcb6df32f10325 100644 (file)
             *ngIf="permissions.prometheus.read">
           <a routerLink="/monitoring">
             <ng-container i18n>Monitoring</ng-container>
-            <small *ngIf="prometheusAlertService.alerts.length > 0"
-                   class="badge badge-danger">{{ prometheusAlertService.alerts.length }}</small>
+            <small *ngIf="prometheusAlertService.activeAlerts > 0"
+                   class="badge badge-danger">{{ prometheusAlertService.activeAlerts }}</small>
           </a>
         </li>
       </ul>
index 8bf4c41a822276a3ca6a788c5efef55d52b047b5..cbac0014c68824209b8bd26cb9c6377f4d0d16d0 100644 (file)
@@ -187,4 +187,26 @@ describe('PrometheusAlertService', () => {
       expect(notificationService.show).toHaveBeenCalledTimes(2);
     });
   });
+
+  describe('alert badge', () => {
+    beforeEach(() => {
+      service = TestBed.get(PrometheusAlertService);
+
+      prometheusService = TestBed.get(PrometheusService);
+      spyOn(prometheusService, 'ifAlertmanagerConfigured').and.callFake((fn) => fn());
+      spyOn(prometheusService, 'getAlerts').and.callFake(() => of(alerts));
+
+      alerts = [
+        prometheus.createAlert('alert0', 'active'),
+        prometheus.createAlert('alert1', 'suppressed'),
+        prometheus.createAlert('alert2', 'suppressed')
+      ];
+      service.refresh();
+    });
+
+    it('should count active alerts', () => {
+      service.refresh();
+      expect(service.activeAlerts).toBe(1);
+    });
+  });
 });
index dc1731b92665796168dc31f6acba908040295e8e..365ad007ccb0e7f4e6774919adfdc0165c923ec5 100644 (file)
@@ -17,6 +17,7 @@ export class PrometheusAlertService {
   private canAlertsBeNotified = false;
   alerts: AlertmanagerAlert[] = [];
   rules: PrometheusRule[] = [];
+  activeAlerts: number;
 
   constructor(
     private alertFormatter: PrometheusAlertFormatter,
@@ -60,6 +61,11 @@ export class PrometheusAlertService {
     if (this.canAlertsBeNotified) {
       this.notifyOnAlertChanges(alerts, this.alerts);
     }
+    this.activeAlerts = _.reduce<AlertmanagerAlert, number>(
+      this.alerts,
+      (result, alert) => (alert.status.state === 'active' ? ++result : result),
+      0
+    );
     this.alerts = alerts;
     this.canAlertsBeNotified = true;
   }