]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: alert badge includes suppressed alerts 38751/head
authorAashish Sharma <aashishsharma@localhost.localdomain>
Mon, 4 Jan 2021 05:09:16 +0000 (10:39 +0530)
committerAashish Sharma <aashishsharma@localhost.localdomain>
Thu, 7 Jan 2021 05:09:38 +0000 (10:39 +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>
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 0b2fd7aa4294df6e50df8fe3784b4cf716156af9..059c6c905e46bd8a737f95b3726e5b290f3dde6e 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 1c4ac57441c5ac9a7b9648085ad96257f3cfe790..d16d0c85d88ae88e6eca70a515ccc02a23d4e6ca 100644 (file)
@@ -183,4 +183,26 @@ describe('PrometheusAlertService', () => {
       expect(notificationService.show).toHaveBeenCalledTimes(2);
     });
   });
+
+  describe('alert badge', () => {
+    beforeEach(() => {
+      service = TestBed.inject(PrometheusAlertService);
+
+      prometheusService = TestBed.inject(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 0e47306a6bc6350c4a2056b1530047fb8cba7e66..6acd244617e1843223cb4debc6e0bbda90f7dfe1 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;
   }