Browse Source

preserve failure count on service recovery in incident header

Recovered services are now shown as ':large_green_circle: <name> (<count>)'
with the last failure count that was observed before the service recovered,
matching the red-circle format.
pull/15456/head
Oleksii Kuripko 5 months ago
parent
commit
43e87d4588
  1. 13
      monitoring/src/main/java/org/thingsboard/monitoring/notification/incident/IncidentManager.java
  2. 8
      monitoring/src/test/java/org/thingsboard/monitoring/notification/incident/IncidentManagerTest.java

13
monitoring/src/main/java/org/thingsboard/monitoring/notification/incident/IncidentManager.java

@ -51,7 +51,7 @@ public class IncidentManager {
private Instant incidentStartTime; private Instant incidentStartTime;
private Instant lastAlertTime; private Instant lastAlertTime;
private final Map<String, Integer> failingServices = new LinkedHashMap<>(); private final Map<String, Integer> failingServices = new LinkedHashMap<>();
private final Set<String> recoveredServices = new LinkedHashSet<>(); private final Map<String, Integer> recoveredServices = new LinkedHashMap<>();
private final Set<String> highLatencyServices = new LinkedHashSet<>(); private final Set<String> highLatencyServices = new LinkedHashSet<>();
public IncidentManager(IncidentTransport transport, long resolutionTimeoutSeconds, public IncidentManager(IncidentTransport transport, long resolutionTimeoutSeconds,
@ -110,13 +110,14 @@ public class IncidentManager {
if (prev == null || prev.intValue() != service.failureCount()) { if (prev == null || prev.intValue() != service.failureCount()) {
changed = true; changed = true;
} }
if (recoveredServices.remove(name)) { if (recoveredServices.remove(name) != null) {
changed = true; changed = true;
} }
} }
case RECOVERED -> { case RECOVERED -> {
if (failingServices.remove(name) != null) { Integer lastFailureCount = failingServices.remove(name);
recoveredServices.add(name); if (lastFailureCount != null) {
recoveredServices.put(name, lastFailureCount);
changed = true; changed = true;
} }
} }
@ -257,9 +258,9 @@ public class IncidentManager {
sb.append(":large_yellow_circle: ").append(name); sb.append(":large_yellow_circle: ").append(name);
first = false; first = false;
} }
for (String name : recoveredServices) { for (Map.Entry<String, Integer> entry : recoveredServices.entrySet()) {
if (!first) sb.append(", "); if (!first) sb.append(", ");
sb.append(":large_green_circle: ").append(name); sb.append(":large_green_circle: ").append(entry.getKey()).append(" (").append(entry.getValue()).append(")");
first = false; first = false;
} }
return sb.toString(); return sb.toString();

8
monitoring/src/test/java/org/thingsboard/monitoring/notification/incident/IncidentManagerTest.java

@ -85,13 +85,13 @@ class IncidentManagerTest {
} }
@Test @Test
void recoveryAfterFailureMovesServiceToGreenAndUpdatesHeader() { void recoveryAfterFailureMovesServiceToGreenAndKeepsFailureCount() {
manager.sendAlert("CoAP failure", List.of(AffectedService.failing("CoAP", 1))); manager.sendAlert("CoAP failure", List.of(AffectedService.failing("CoAP", 4)));
manager.sendAlert("CoAP is OK", List.of(AffectedService.recovered("CoAP"))); manager.sendAlert("CoAP is OK", List.of(AffectedService.recovered("CoAP")));
assertThat(transport.updates).hasSize(1); assertThat(transport.updates).hasSize(1);
String updated = transport.updates.get(0).text(); String updated = transport.updates.get(0).text();
assertThat(updated).contains(":large_green_circle: CoAP").doesNotContain(":red_circle:"); assertThat(updated).contains(":large_green_circle: CoAP (4)").doesNotContain(":red_circle:");
} }
@Test @Test
@ -126,7 +126,7 @@ class IncidentManagerTest {
.asString() .asString()
.contains(":white_check_mark:") .contains(":white_check_mark:")
.contains(":red_circle: WS Connect") .contains(":red_circle: WS Connect")
.contains(":large_green_circle: Login"); .contains(":large_green_circle: Login (1)");
} }
@Test @Test

Loading…
Cancel
Save