From 228ffcbfce780f6e09090a77c1a19f61c79b079a Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Wed, 27 May 2020 17:36:04 -0400 Subject: [PATCH] Differentiate between websocket and "boring" HTTP traffic. --- .../textsecuregcm/WhisperServerService.java | 7 ++++--- .../MetricsApplicationEventListener.java | 6 +++++- .../metrics/MetricsRequestEventListener.java | 20 +++++++++++-------- .../textsecuregcm/metrics/TrafficSource.java | 6 ++++++ .../MetricsRequestEventListenerTest.java | 20 +++++++++---------- 5 files changed, 37 insertions(+), 22 deletions(-) create mode 100644 service/src/main/java/org/whispersystems/textsecuregcm/metrics/TrafficSource.java diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java index c5e163508..cce52e215 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java @@ -86,6 +86,7 @@ import org.whispersystems.textsecuregcm.metrics.FreeMemoryGauge; import org.whispersystems.textsecuregcm.metrics.MetricsApplicationEventListener; import org.whispersystems.textsecuregcm.metrics.NetworkReceivedGauge; import org.whispersystems.textsecuregcm.metrics.NetworkSentGauge; +import org.whispersystems.textsecuregcm.metrics.TrafficSource; import org.whispersystems.textsecuregcm.providers.RedisClientFactory; import org.whispersystems.textsecuregcm.providers.RedisHealthCheck; import org.whispersystems.textsecuregcm.push.APNSender; @@ -318,7 +319,7 @@ public class WhisperServerService extends Application accountAuthFilter = new BasicCredentialAuthFilter.Builder().setAuthenticator(accountAuthenticator).buildAuthFilter (); AuthFilter disabledPermittedAccountAuthFilter = new BasicCredentialAuthFilter.Builder().setAuthenticator(disabledPermittedAccountAuthenticator).buildAuthFilter(); - environment.jersey().register(new MetricsApplicationEventListener()); + environment.jersey().register(new MetricsApplicationEventListener(TrafficSource.HTTP)); environment.jersey().register(new PolymorphicAuthDynamicFeature<>(ImmutableMap.of(Account.class, accountAuthFilter, DisabledPermittedAccount.class, disabledPermittedAccountAuthFilter))); @@ -347,7 +348,7 @@ public class WhisperServerService extends Application webSocketEnvironment = new WebSocketEnvironment<>(environment, config.getWebSocketConfiguration(), 90000); webSocketEnvironment.setAuthenticator(new WebSocketAccountAuthenticator(accountAuthenticator)); webSocketEnvironment.setConnectListener(new AuthenticatedConnectListener(pushSender, receiptSender, messagesManager, pubSubManager, apnFallbackManager)); - webSocketEnvironment.jersey().register(new MetricsApplicationEventListener()); + webSocketEnvironment.jersey().register(new MetricsApplicationEventListener(TrafficSource.WEBSOCKET)); webSocketEnvironment.jersey().register(new KeepAliveController(pubSubManager)); webSocketEnvironment.jersey().register(messageController); webSocketEnvironment.jersey().register(profileController); @@ -358,7 +359,7 @@ public class WhisperServerService extends Application provisioningEnvironment = new WebSocketEnvironment<>(environment, webSocketEnvironment.getRequestLog(), 60000); provisioningEnvironment.setConnectListener(new ProvisioningConnectListener(pubSubManager)); - provisioningEnvironment.jersey().register(new MetricsApplicationEventListener()); + provisioningEnvironment.jersey().register(new MetricsApplicationEventListener(TrafficSource.WEBSOCKET)); provisioningEnvironment.jersey().register(new KeepAliveController(pubSubManager)); registerCorsFilter(environment); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsApplicationEventListener.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsApplicationEventListener.java index b014c8b4f..7d3687244 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsApplicationEventListener.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsApplicationEventListener.java @@ -10,7 +10,11 @@ import org.glassfish.jersey.server.monitoring.RequestEventListener; */ public class MetricsApplicationEventListener implements ApplicationEventListener { - private final MetricsRequestEventListener metricsRequestEventListener = new MetricsRequestEventListener(); + private final MetricsRequestEventListener metricsRequestEventListener; + + public MetricsApplicationEventListener(final TrafficSource trafficSource) { + this.metricsRequestEventListener = new MetricsRequestEventListener(trafficSource); + } @Override public void onEvent(final ApplicationEvent event) { diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsRequestEventListener.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsRequestEventListener.java index 104560c04..f5e3d4e2c 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsRequestEventListener.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsRequestEventListener.java @@ -17,19 +17,22 @@ import java.util.List; */ class MetricsRequestEventListener implements RequestEventListener { - static final String COUNTER_NAME = MetricRegistry.name(MetricsRequestEventListener.class, "request"); + static final String COUNTER_NAME = MetricRegistry.name(MetricsRequestEventListener.class, "request"); - static final String PATH_TAG = "path"; - static final String STATUS_CODE_TAG = "status"; + static final String PATH_TAG = "path"; + static final String STATUS_CODE_TAG = "status"; + static final String TRAFFIC_SOURCE_TAG = "trafficSource"; - private final MeterRegistry meterRegistry; + private final TrafficSource trafficSource; + private final MeterRegistry meterRegistry; - public MetricsRequestEventListener() { - this(Metrics.globalRegistry); + public MetricsRequestEventListener(final TrafficSource trafficSource) { + this(trafficSource, Metrics.globalRegistry); } @VisibleForTesting - MetricsRequestEventListener(final MeterRegistry meterRegistry) { + MetricsRequestEventListener(final TrafficSource trafficSource, final MeterRegistry meterRegistry) { + this.trafficSource = trafficSource; this.meterRegistry = meterRegistry; } @@ -37,9 +40,10 @@ class MetricsRequestEventListener implements RequestEventListener { public void onEvent(final RequestEvent event) { if (event.getType() == RequestEvent.Type.FINISHED) { if (!event.getUriInfo().getMatchedTemplates().isEmpty()) { - final List tags = new ArrayList<>(4); + final List tags = new ArrayList<>(5); tags.add(Tag.of(PATH_TAG, getPathTemplate(event.getUriInfo()))); tags.add(Tag.of(STATUS_CODE_TAG, String.valueOf(event.getContainerResponse().getStatus()))); + tags.add(Tag.of(TRAFFIC_SOURCE_TAG, trafficSource.name().toLowerCase())); event.getContainerRequest().getRequestHeader("User-Agent") .stream() diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/TrafficSource.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/TrafficSource.java new file mode 100644 index 000000000..9cf5cdce0 --- /dev/null +++ b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/TrafficSource.java @@ -0,0 +1,6 @@ +package org.whispersystems.textsecuregcm.metrics; + +public enum TrafficSource { + HTTP, + WEBSOCKET +} diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MetricsRequestEventListenerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MetricsRequestEventListenerTest.java index 0e5ef1c0a..fd803d47a 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MetricsRequestEventListenerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MetricsRequestEventListenerTest.java @@ -3,7 +3,6 @@ package org.whispersystems.textsecuregcm.metrics; import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Tag; -import org.bouncycastle.ocsp.Req; import org.glassfish.jersey.server.ContainerRequest; import org.glassfish.jersey.server.ContainerResponse; import org.glassfish.jersey.server.ExtendedUriInfo; @@ -13,15 +12,13 @@ import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; -import java.util.List; -import java.util.Optional; import java.util.Set; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; @@ -30,17 +27,19 @@ import static org.mockito.Mockito.when; public class MetricsRequestEventListenerTest { - private MeterRegistry meterRegistry; - private Counter counter; + private MeterRegistry meterRegistry; + private Counter counter; - private MetricsRequestEventListener listener; + private MetricsRequestEventListener listener; + + private static final TrafficSource TRAFFIC_SOURCE = TrafficSource.HTTP; @Before public void setup() { meterRegistry = mock(MeterRegistry.class); counter = mock(Counter.class); - listener = new MetricsRequestEventListener(meterRegistry); + listener = new MetricsRequestEventListener(TRAFFIC_SOURCE, meterRegistry); } @Test @@ -78,9 +77,10 @@ public class MetricsRequestEventListenerTest { tags.add(tag); } - assertEquals(4, tags.size()); + assertEquals(5, tags.size()); assertTrue(tags.contains(Tag.of(MetricsRequestEventListener.PATH_TAG, path))); assertTrue(tags.contains(Tag.of(MetricsRequestEventListener.STATUS_CODE_TAG, String.valueOf(statusCode)))); + assertTrue(tags.contains(Tag.of(MetricsRequestEventListener.TRAFFIC_SOURCE_TAG, TRAFFIC_SOURCE.name().toLowerCase()))); assertTrue(tags.contains(Tag.of(UserAgentTagUtil.PLATFORM_TAG, "android"))); assertTrue(tags.contains(Tag.of(UserAgentTagUtil.VERSION_TAG, "4.53.7"))); }