diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicConfiguration.java index a9f0f4e25..cc67178d5 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicConfiguration.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicConfiguration.java @@ -66,7 +66,7 @@ public class DynamicConfiguration { @JsonProperty @Valid - DynamicMetricsConfiguration metricsConfiguration = new DynamicMetricsConfiguration(false); + DynamicMetricsConfiguration metricsConfiguration = new DynamicMetricsConfiguration(false, false); @JsonProperty @Valid diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicMetricsConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicMetricsConfiguration.java index 170763eef..b7e7f0de1 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicMetricsConfiguration.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicMetricsConfiguration.java @@ -6,8 +6,10 @@ package org.whispersystems.textsecuregcm.configuration.dynamic; /** - * @param enableLettuceRemoteTag - whether the `remote` tag should be added. Note: although this is dynamic, meters are + * @param enableLettuceRemoteTag whether the `remote` tag should be added. Note: although this is dynamic, meters are * cached after creation, so changes will only affect servers launched after the change. + * @param enableAwsSdkMetrics whether to record AWS SDK metrics. Note: although this is dynamic, meters are cached after + * creation, so changes will only affect servers launched after the change. */ -public record DynamicMetricsConfiguration(boolean enableLettuceRemoteTag) { +public record DynamicMetricsConfiguration(boolean enableLettuceRemoteTag, boolean enableAwsSdkMetrics) { } 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 fb509e1c0..a5612790c 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsUtil.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsUtil.java @@ -85,6 +85,8 @@ public class MetricsUtil { .percentiles(.75, .95, .99, .999) .build(); + final String awsSdkMetricNamePrefix = MetricsUtil.name(MicrometerAwsSdkMetricPublisher.class); + return config .meterFilter(new MeterFilter() { @Override @@ -108,7 +110,9 @@ public class MetricsUtil { return MeterFilter.super.map(id); } }) - .meterFilter(MeterFilter.denyNameStartsWith(MessageMetrics.DELIVERY_LATENCY_TIMER_NAME + ".percentile")); + .meterFilter(MeterFilter.denyNameStartsWith(MessageMetrics.DELIVERY_LATENCY_TIMER_NAME + ".percentile")) + .meterFilter(MeterFilter.deny(id -> !dynamicConfigurationManager.getConfiguration().getMetricsConfiguration().enableAwsSdkMetrics() + && id.getName().startsWith(awsSdkMetricNamePrefix))); } public static void registerSystemResourceMetrics(final Environment environment) { diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MicrometerAwsSdkMetricPublisher.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MicrometerAwsSdkMetricPublisher.java index 9587ed8b3..314b00deb 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MicrometerAwsSdkMetricPublisher.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MicrometerAwsSdkMetricPublisher.java @@ -8,6 +8,7 @@ import java.time.Duration; import java.util.Map; import java.util.Optional; import java.util.concurrent.ExecutorService; +import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import software.amazon.awssdk.metrics.MetricCollection; @@ -102,13 +103,13 @@ public class MicrometerAwsSdkMetricPublisher implements MetricPublisher { @Override public void publish(final MetricCollection metricCollection) { - /* if (METRIC_COLLECTION_TYPE_API_CALL.equals(metricCollection.name())) { + if (METRIC_COLLECTION_TYPE_API_CALL.equals(metricCollection.name())) { try { recordMetricsExecutorService.submit(() -> recordApiCallMetrics(metricCollection)); } catch (final RejectedExecutionException ignored) { // This can happen if clients make new calls to an upstream service while the server is shutting down } - } */ + } } private void recordApiCallMetrics(final MetricCollection apiCallMetricCollection) { diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MetricsUtilTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MetricsUtilTest.java index ad095e1b9..3c8d5258c 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MetricsUtilTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MetricsUtilTest.java @@ -36,21 +36,21 @@ class MetricsUtilTest { @ParameterizedTest @ValueSource(booleans = {true, false}) void lettuceTagRejection(final boolean enableLettuceRemoteTag) { - DynamicConfiguration dynamicConfiguration = mock(DynamicConfiguration.class); - DynamicMetricsConfiguration metricsConfiguration = new DynamicMetricsConfiguration(enableLettuceRemoteTag); + final DynamicConfiguration dynamicConfiguration = mock(DynamicConfiguration.class); + final DynamicMetricsConfiguration metricsConfiguration = new DynamicMetricsConfiguration(enableLettuceRemoteTag, false); when(dynamicConfiguration.getMetricsConfiguration()).thenReturn(metricsConfiguration); - DynamicConfigurationManager dynamicConfigurationManager = + @SuppressWarnings("unchecked") final DynamicConfigurationManager dynamicConfigurationManager = mock(DynamicConfigurationManager.class); when(dynamicConfigurationManager.getConfiguration()).thenReturn(dynamicConfiguration); - MeterRegistry registry = new SimpleMeterRegistry(); + final MeterRegistry registry = new SimpleMeterRegistry(); MetricsUtil.configureMeterFilters(registry.config(), dynamicConfigurationManager); registry.counter("lettuce.command.completion.max", "command", "hello", "remote", "world", "allowed", "!").increment(); final List meters = registry.getMeters(); assertThat(meters).hasSize(1); - Meter meter = meters.get(0); + final Meter meter = meters.getFirst(); assertThat(meter.getId().getName()).isEqualTo("chat.lettuce.command.completion.max"); assertThat(meter.getId().getTag("command")).isNull(); AbstractStringAssert remoteTag = assertThat(meter.getId().getTag("remote")); @@ -62,4 +62,23 @@ class MetricsUtilTest { } assertThat(meter.getId().getTag("allowed")).isNotNull(); } + + @ParameterizedTest + @ValueSource(booleans = {true, false}) + void awsSdkMetricRejection(final boolean enableAwsSdkMetrics) { + @SuppressWarnings("unchecked") final DynamicConfigurationManager dynamicConfigurationManager = + mock(DynamicConfigurationManager.class); + + final DynamicConfiguration dynamicConfiguration = mock(DynamicConfiguration.class); + final DynamicMetricsConfiguration metricsConfiguration = new DynamicMetricsConfiguration(false, enableAwsSdkMetrics); + + when(dynamicConfigurationManager.getConfiguration()).thenReturn(dynamicConfiguration); + when(dynamicConfiguration.getMetricsConfiguration()).thenReturn(metricsConfiguration); + + final MeterRegistry registry = new SimpleMeterRegistry(); + MetricsUtil.configureMeterFilters(registry.config(), dynamicConfigurationManager); + registry.counter("chat.MicrometerAwsSdkMetricPublisher.days_since_last_incident").increment(); + + assertThat(registry.getMeters()).hasSize(enableAwsSdkMetrics ? 1 : 0); + } }