From ab8399017022b30e0823b8d34e7bb6a7329e1cea Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Thu, 17 Aug 2023 11:41:13 -0400 Subject: [PATCH] Send latency metrics as distributions --- .../textsecuregcm/metrics/MessageMetrics.java | 12 ++++++------ .../textsecuregcm/metrics/MetricsUtil.java | 7 ++++--- .../textsecuregcm/push/PushLatencyManager.java | 9 +++++++-- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MessageMetrics.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MessageMetrics.java index f00c8eeb4..2e8502f92 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MessageMetrics.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MessageMetrics.java @@ -7,15 +7,13 @@ package org.whispersystems.textsecuregcm.metrics; import static org.whispersystems.textsecuregcm.metrics.MetricsUtil.name; -import com.vdurmont.semver4j.Semver; import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.Tag; +import io.micrometer.core.instrument.Timer; import java.time.Duration; import java.time.Instant; import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.textsecuregcm.entities.MessageProtos; @@ -23,7 +21,6 @@ import org.whispersystems.textsecuregcm.entities.OutgoingMessageEntity; import org.whispersystems.textsecuregcm.identity.ServiceIdentifier; import org.whispersystems.textsecuregcm.storage.Account; import org.whispersystems.textsecuregcm.storage.ClientReleaseManager; -import org.whispersystems.textsecuregcm.util.ua.ClientPlatform; public final class MessageMetrics { @@ -32,7 +29,7 @@ public final class MessageMetrics { private static final String MISMATCHED_ACCOUNT_ENVELOPE_UUID_COUNTER_NAME = name(MessageMetrics.class, "mismatchedAccountEnvelopeUuid"); - private static final String DELIVERY_LATENCY_TIMER_NAME = name(MessageMetrics.class, "deliveryLatency"); + public static final String DELIVERY_LATENCY_TIMER_NAME = name(MessageMetrics.class, "deliveryLatency"); public static void measureAccountOutgoingMessageUuidMismatches(final Account account, final OutgoingMessageEntity outgoingMessage) { @@ -70,7 +67,10 @@ public final class MessageMetrics { UserAgentTagUtil.getClientVersionTag(userAgent, clientReleaseManager).ifPresent(tags::add); - Metrics.timer(DELIVERY_LATENCY_TIMER_NAME, tags) + Timer.builder(DELIVERY_LATENCY_TIMER_NAME) + .publishPercentileHistogram(true) + .tags(tags) + .register(Metrics.globalRegistry) .record(Duration.between(Instant.ofEpochMilli(serverTimestamp), Instant.now())); } } 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 553f9045a..cb28acf13 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsUtil.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsUtil.java @@ -11,14 +11,13 @@ import io.dropwizard.setup.Environment; import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Metrics; -import io.micrometer.core.instrument.Tags; import io.micrometer.core.instrument.config.MeterFilter; import io.micrometer.core.instrument.distribution.DistributionStatisticConfig; import io.micrometer.statsd.StatsdMeterRegistry; import java.util.concurrent.TimeUnit; import org.whispersystems.textsecuregcm.WhisperServerConfiguration; +import org.whispersystems.textsecuregcm.push.PushLatencyManager; import org.whispersystems.textsecuregcm.util.Constants; -import org.whispersystems.textsecuregcm.util.HostnameUtil; public class MetricsUtil { @@ -86,7 +85,9 @@ public class MetricsUtil { // filters are applied after map filters. .meterFilter(MeterFilter.deny(id -> id.getName().startsWith(PREFIX + ".lettuce") && !id.getName().contains("command.completion.max") - )); + )) + .meterFilter(MeterFilter.denyNameStartsWith(PushLatencyManager.TIMER_NAME + ".percentile")) + .meterFilter(MeterFilter.denyNameStartsWith(MessageMetrics.DELIVERY_LATENCY_TIMER_NAME + ".percentile")); } public static void registerSystemResourceMetrics(final Environment environment) { diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/push/PushLatencyManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/PushLatencyManager.java index a9ab13950..6908b0117 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/push/PushLatencyManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/push/PushLatencyManager.java @@ -11,6 +11,7 @@ import com.google.common.annotations.VisibleForTesting; import io.lettuce.core.SetArgs; import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.Tag; +import io.micrometer.core.instrument.Timer; import java.time.Clock; import java.time.Duration; import java.time.Instant; @@ -43,7 +44,7 @@ public class PushLatencyManager { private final Clock clock; - private static final String TIMER_NAME = MetricRegistry.name(PushLatencyManager.class, "latency"); + public static final String TIMER_NAME = MetricRegistry.name(PushLatencyManager.class, "latency"); private static final int TTL = (int) Duration.ofDays(1).toSeconds(); private static final Logger log = LoggerFactory.getLogger(PushLatencyManager.class); @@ -103,7 +104,11 @@ public class PushLatencyManager { pushRecord.urgent().ifPresent(urgent -> tags.add(Tag.of("urgent", String.valueOf(urgent)))); - Metrics.timer(TIMER_NAME, tags).record(latency); + Timer.builder(TIMER_NAME) + .publishPercentileHistogram(true) + .tags(tags) + .register(Metrics.globalRegistry) + .record(latency); } }); }