Skip to content

Commit

Permalink
Send latency metrics as distributions
Browse files Browse the repository at this point in the history
  • Loading branch information
jon-signal committed Aug 17, 2023
1 parent 8103a22 commit ab83990
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,20 @@

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;
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 {

Expand All @@ -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) {
Expand Down Expand Up @@ -70,7 +67,10 @@ public static void measureOutgoingMessageLatency(final long serverTimestamp,

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()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,13 @@
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 {

Expand Down Expand Up @@ -86,7 +85,9 @@ public Meter.Id map(final Meter.Id id) {
// 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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -103,7 +104,11 @@ void recordQueueRead(final UUID accountUuid, final long deviceId, final String u

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);
}
});
}
Expand Down

0 comments on commit ab83990

Please sign in to comment.