From 2326e61de5e5a21dd44b393896f52c1c0d2a9cf7 Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Thu, 27 Aug 2020 12:42:55 -0400 Subject: [PATCH] Clear and re-create gauges to avoid "stuck" feature flag reporting. --- .../storage/FeatureFlagsManager.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/FeatureFlagsManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/FeatureFlagsManager.java index 0a881a2e5..eaa7c0aa5 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/FeatureFlagsManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/FeatureFlagsManager.java @@ -2,13 +2,14 @@ package org.whispersystems.textsecuregcm.storage; import com.google.common.annotations.VisibleForTesting; import io.dropwizard.lifecycle.Managed; +import io.micrometer.core.instrument.Gauge; import io.micrometer.core.instrument.Metrics; -import io.micrometer.core.instrument.Tag; import java.time.Duration; import java.util.Collections; -import java.util.List; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @@ -30,6 +31,7 @@ public class FeatureFlagsManager implements Managed { private final ScheduledExecutorService refreshExecutorService; private ScheduledFuture refreshFuture; private final AtomicReference> featureFlags = new AtomicReference<>(Collections.emptyMap()); + private final Set gauges = new HashSet<>(); private static final String GAUGE_NAME = "status"; private static final String FLAG_TAG_NAME = "flag"; @@ -77,11 +79,19 @@ public class FeatureFlagsManager implements Managed { featureFlags.set(Collections.unmodifiableMap(refreshedFeatureFlags)); + for (final Gauge gauge : gauges) { + Metrics.globalRegistry.remove(gauge); + } + + gauges.clear(); + for (final Map.Entry entry : refreshedFeatureFlags.entrySet()) { final String featureFlag = entry.getKey(); final boolean active = entry.getValue(); - Metrics.gauge(name(getClass(), GAUGE_NAME), List.of(Tag.of(FLAG_TAG_NAME, featureFlag)), active ? 1 : 0); + gauges.add(Gauge.builder(name(getClass(), GAUGE_NAME), () -> active ? 1 : 0) + .tag(FLAG_TAG_NAME, featureFlag) + .register(Metrics.globalRegistry)); } } }