From 8ca7f85bf0be89159de08e738940d719224bca20 Mon Sep 17 00:00:00 2001 From: Jonathan Klabunde Tomer <125505367+jkt-signal@users.noreply.github.com> Date: Mon, 11 Aug 2025 14:11:17 -0700 Subject: [PATCH] fix NPE in MetricsUtil#configureHistogramFilters --- .../textsecuregcm/metrics/MetricsUtil.java | 12 ++++++++++++ .../textsecuregcm/storage/MessagePersister.java | 12 +++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsUtil.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsUtil.java index 024e00267..fe9c54925 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsUtil.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsUtil.java @@ -26,6 +26,8 @@ import java.time.Duration; import java.util.Optional; import java.util.stream.IntStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.whispersystems.textsecuregcm.WhisperServerConfiguration; import org.whispersystems.textsecuregcm.WhisperServerVersion; import org.whispersystems.textsecuregcm.configuration.OpenTelemetryConfiguration; @@ -35,6 +37,8 @@ import org.whispersystems.textsecuregcm.util.Constants; public class MetricsUtil { + private static final Logger log = LoggerFactory.getLogger(MetricsUtil.class); + public static final String PREFIX = "chat"; private static volatile boolean registeredMetrics = false; @@ -155,6 +159,14 @@ public class MetricsUtil { return config; } + if (config.getMinimumExpectedValueAsDouble() == null || config.getMaximumExpectedValueAsDouble() == null) { + log.error("Distribution {} does not specify lower or upper bounds, not exporting histograms", id.getName()); + return DistributionStatisticConfig.builder() + .percentilesHistogram(false) + .build() + .merge(config); + } + final double lowerBound = config.getMinimumExpectedValueAsDouble(); final double upperBound = config.getMaximumExpectedValueAsDouble(); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagePersister.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagePersister.java index db048bbb8..e99addadb 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagePersister.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagePersister.java @@ -22,6 +22,7 @@ import java.util.Locale; import java.util.Optional; import java.util.UUID; import java.util.concurrent.atomic.AtomicLong; +import java.util.stream.IntStream; import org.apache.commons.lang3.tuple.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,16 +59,17 @@ public class MessagePersister implements Managed { private static final Counter TRIMMED_MESSAGE_COUNTER = Metrics.counter(name(MessagePersister.class, "trimmedMessage")); private static final Counter TRIMMED_MESSAGE_BYTES_COUNTER = Metrics.counter(name(MessagePersister.class, "trimmedMessageBytes")); - private static final DistributionSummary QUEUE_COUNT_DISTRIBUTION_SUMMARY = DistributionSummary.builder( - name(MessagePersister.class, "queueCount")) - .publishPercentileHistogram(true) - .register(Metrics.globalRegistry); - private static final String QUEUE_SIZE_DISTRIBUTION_SUMMARY_NAME = name(MessagePersister.class, "queueSize"); static final int QUEUE_BATCH_LIMIT = 100; static final int MESSAGE_BATCH_LIMIT = 100; + private static final DistributionSummary QUEUE_COUNT_DISTRIBUTION_SUMMARY = DistributionSummary.builder( + name(MessagePersister.class, "queueCount")) + .publishPercentiles(new double[0]) + .serviceLevelObjectives(IntStream.range(1, QUEUE_BATCH_LIMIT + 1).mapToDouble(i -> i).toArray()) + .register(Metrics.globalRegistry); + private static final long EXCEPTION_PAUSE_MILLIS = Duration.ofSeconds(3).toMillis(); private static final int CONSECUTIVE_EMPTY_CACHE_REMOVAL_LIMIT = 3;