From 78a7112675bbef002ef1864dd64c1872e06d133a Mon Sep 17 00:00:00 2001 From: Jonathan Klabunde Tomer <125505367+jkt-signal@users.noreply.github.com> Date: Thu, 21 Aug 2025 14:53:21 -0700 Subject: [PATCH] Use native exponential histograms --- .../textsecuregcm/WhisperServerService.java | 2 +- .../OpenTelemetryConfiguration.java | 6 ++ .../controllers/DeviceController.java | 4 -- .../controllers/KeepAliveController.java | 2 - .../controllers/MessageController.java | 4 -- .../textsecuregcm/metrics/MessageMetrics.java | 13 ++-- .../textsecuregcm/metrics/MetricsUtil.java | 60 +------------------ .../metrics/OpenWebSocketCounter.java | 12 +--- .../MultiRecipientMessageProvider.java | 2 - .../textsecuregcm/push/MessageSender.java | 29 +++++---- .../storage/MessagePersister.java | 2 - .../storage/PagedSingleUseKEMPreKeyStore.java | 5 +- .../AuthenticatedConnectListener.java | 6 +- .../ProvisioningConnectListener.java | 3 +- .../websocket/WebSocketConnection.java | 2 - .../controllers/MessageControllerTest.java | 2 +- .../metrics/MessageMetricsTest.java | 3 +- .../metrics/MetricsUtilTest.java | 42 ------------- .../WebSocketConnectionIntegrationTest.java | 4 +- .../websocket/WebSocketConnectionTest.java | 4 +- service/src/test/resources/config/test.yml | 3 - 21 files changed, 41 insertions(+), 169 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java index 7e6a920dd..c85d06268 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java @@ -980,7 +980,7 @@ public class WhisperServerService extends Application 0) { @@ -112,6 +103,7 @@ public class MetricsUtil { static void configureMeterFilters(MeterRegistry.Config config, final DynamicConfigurationManager dynamicConfigurationManager) { final DistributionStatisticConfig defaultDistributionStatisticConfig = DistributionStatisticConfig.builder() + .percentilesHistogram(true) .percentiles(.75, .95, .99, .999) .build(); @@ -120,7 +112,7 @@ public class MetricsUtil { config.meterFilter(new MeterFilter() { @Override public DistributionStatisticConfig configure(final Meter.Id id, final DistributionStatisticConfig config) { - return Optional.ofNullable(config.isPercentileHistogram()).orElse(false) ? config : defaultDistributionStatisticConfig.merge(config); + return defaultDistributionStatisticConfig.merge(config); } }) // Remove high-cardinality `command` tags from Lettuce metrics and prepend "chat." to meter names @@ -144,54 +136,6 @@ public class MetricsUtil { && id.getName().startsWith(awsSdkMetricNamePrefix))); } - @VisibleForTesting - static void configureHistogramFilters(MeterRegistry.Config config, OpenTelemetryConfiguration openTelemetryConfig) { - if (openTelemetryConfig.histogramFlavor() != HistogramFlavor.EXPLICIT_BUCKET_HISTOGRAM) { - // This workaround for Micrometer's awful defaults is only required for explicit bucket histograms. - return; - } - - config.meterFilter(new MeterFilter() { - @Override - public DistributionStatisticConfig configure(final Meter.Id id, final DistributionStatisticConfig config) { - if (config.isPercentileHistogram() == null || !config.isPercentileHistogram()) { - 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(); - - final int numBuckets = Optional.ofNullable(openTelemetryConfig.maxBucketsPerMeter().get(id.getName())) - .orElse(openTelemetryConfig.maxBucketCount()); - - // Bucket i covers values from (buckets[i-1], buckets[i]] except the first one which covers (-inf, buckets[0]]. - // A final bucket will automatically be added at positive infinity, so if we want numBuckets total buckets, we - // need numBuckets - 1 explicit ones; if we want those to have equal ratios between values, and want an explicit - // bucket for (-inf, lowerBound] as well as an implicit one for (upperBound, inf], the ratio between buckets will be - // r = (upperBound/lowerBound)^(1/(numBuckets - 2)), so that we have values at lowerBound * r^i - // for i in [0, numBuckets-2] i.e. numBuckets - 1 values, plus the one at infinity - final double scale = Math.pow(upperBound / lowerBound, 1.0 / (numBuckets - 2)); - final double[] buckets = IntStream.range(0, numBuckets - 1).mapToDouble(i -> lowerBound * Math.pow(scale, i)).toArray(); - - // yes, percentilesHistogram(false)! Otherwise, Micrometer will add its own non-configurable buckets based on an - // inferior selection algorithm that produces 69(!) buckets for a range from 1ms to 30s and still yields ±25% relative error - return DistributionStatisticConfig.builder() - .percentilesHistogram(false) - .serviceLevelObjectives(buckets) - .build() - .merge(config); - } - }); - } - public static void registerSystemResourceMetrics(final Environment environment) { new ProcessorMetrics().bindTo(Metrics.globalRegistry); new FileDescriptorMetrics().bindTo(Metrics.globalRegistry); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/OpenWebSocketCounter.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/OpenWebSocketCounter.java index 4af9fc1cd..019ba31df 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/OpenWebSocketCounter.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/OpenWebSocketCounter.java @@ -6,8 +6,6 @@ import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.Tag; import io.micrometer.core.instrument.Tags; import io.micrometer.core.instrument.Timer; - -import java.time.Duration; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import org.whispersystems.textsecuregcm.util.EnumMapUtil; @@ -22,7 +20,6 @@ public class OpenWebSocketCounter { private final String newConnectionCounterName; private final String durationTimerName; - private final Duration longestExpectedConnectionDuration; private final Tags tags; @@ -31,21 +28,18 @@ public class OpenWebSocketCounter { public OpenWebSocketCounter(final String openWebSocketGaugeName, final String newConnectionCounterName, - final String durationTimerName, - final Duration longestExpectedConnectionDuration) { + final String durationTimerName) { - this(openWebSocketGaugeName, newConnectionCounterName, durationTimerName, longestExpectedConnectionDuration, Tags.empty()); + this(openWebSocketGaugeName, newConnectionCounterName, durationTimerName, Tags.empty()); } public OpenWebSocketCounter(final String openWebSocketGaugeName, final String newConnectionCounterName, final String durationTimerName, - final Duration longestExpectedConnectionDuration, final Tags tags) { this.newConnectionCounterName = newConnectionCounterName; this.durationTimerName = durationTimerName; - this.longestExpectedConnectionDuration = longestExpectedConnectionDuration; this.tags = tags; @@ -92,8 +86,6 @@ public class OpenWebSocketCounter { context.addWebsocketClosedListener((_, statusCode, _) -> { sample.stop(Timer.builder(durationTimerName) .publishPercentileHistogram(true) - .minimumExpectedValue(Duration.ofSeconds(1)) - .maximumExpectedValue(longestExpectedConnectionDuration) .tags(tagsWithClientPlatform) .register(Metrics.globalRegistry)); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/providers/MultiRecipientMessageProvider.java b/service/src/main/java/org/whispersystems/textsecuregcm/providers/MultiRecipientMessageProvider.java index 50787ef81..b18b08f35 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/providers/MultiRecipientMessageProvider.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/providers/MultiRecipientMessageProvider.java @@ -37,8 +37,6 @@ public class MultiRecipientMessageProvider implements MessageBodyReader MAX_MESSAGE_SIZE; - if (contentLength > MAX_MESSAGE_SIZE) { - Metrics.counter(REJECT_OVERSIZE_MESSAGE_COUNTER_NAME, tags).increment(); - - throw new MessageTooLargeException(); - } else { - DistributionSummary.builder(CONTENT_SIZE_DISTRIBUTION_NAME) - .tags(tags) + DistributionSummary.builder(CONTENT_SIZE_DISTRIBUTION_NAME) + .tags(Tags.of(platformTag, + Tag.of("oversize", String.valueOf(oversize)), + Tag.of("multiRecipientMessage", String.valueOf(isMultiRecipientMessage)), + Tag.of("syncMessage", String.valueOf(isSyncMessage)), + Tag.of("story", String.valueOf(isStory)))) .publishPercentileHistogram(true) - .minimumExpectedValue(256.0) - .maximumExpectedValue((double) MAX_MESSAGE_SIZE) .register(Metrics.globalRegistry) .record(contentLength); + + if (oversize) { + Metrics.counter(REJECT_OVERSIZE_MESSAGE_COUNTER_NAME, Tags.of(platformTag, + Tag.of("multiRecipientMessage", String.valueOf(isMultiRecipientMessage)), + Tag.of("syncMessage", String.valueOf(isSyncMessage)), + Tag.of("story", String.valueOf(isStory)))) + .increment(); + + throw new MessageTooLargeException(); } } 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 e99addadb..df61ae425 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagePersister.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagePersister.java @@ -66,8 +66,6 @@ public class MessagePersister implements Managed { 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(); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/PagedSingleUseKEMPreKeyStore.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/PagedSingleUseKEMPreKeyStore.java index 68c45874e..9d0b6a9be 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/PagedSingleUseKEMPreKeyStore.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/PagedSingleUseKEMPreKeyStore.java @@ -22,8 +22,6 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.IntStream; - import org.signal.libsignal.protocol.InvalidKeyException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -75,8 +73,7 @@ public class PagedSingleUseKEMPreKeyStore { final DistributionSummary availableKeyCountDistributionSummary = DistributionSummary .builder(name(getClass(), "availableKeyCount")) - .publishPercentiles(new double[0]) - .serviceLevelObjectives(IntStream.range(1, 102).mapToDouble(i -> i).toArray()) + .publishPercentileHistogram() .register(Metrics.globalRegistry); private final String takeKeyTimerName = name(getClass(), "takeKey"); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/websocket/AuthenticatedConnectListener.java b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/AuthenticatedConnectListener.java index b5cfab9e3..c84b51c22 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/websocket/AuthenticatedConnectListener.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/AuthenticatedConnectListener.java @@ -8,8 +8,6 @@ package org.whispersystems.textsecuregcm.websocket; import static org.whispersystems.textsecuregcm.metrics.MetricsUtil.name; import io.micrometer.core.instrument.Tags; - -import java.time.Duration; import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -88,10 +86,10 @@ public class AuthenticatedConnectListener implements WebSocketConnectListener { this.experimentEnrollmentManager = experimentEnrollmentManager; openAuthenticatedWebSocketCounter = - new OpenWebSocketCounter(OPEN_WEBSOCKET_GAUGE_NAME, NEW_CONNECTION_COUNTER_NAME, CONNECTED_DURATION_TIMER_NAME, Duration.ofHours(3), Tags.of(AUTHENTICATED_TAG_NAME, "true")); + new OpenWebSocketCounter(OPEN_WEBSOCKET_GAUGE_NAME, NEW_CONNECTION_COUNTER_NAME, CONNECTED_DURATION_TIMER_NAME, Tags.of(AUTHENTICATED_TAG_NAME, "true")); openUnauthenticatedWebSocketCounter = - new OpenWebSocketCounter(OPEN_WEBSOCKET_GAUGE_NAME, NEW_CONNECTION_COUNTER_NAME, CONNECTED_DURATION_TIMER_NAME, Duration.ofHours(3), Tags.of(AUTHENTICATED_TAG_NAME, "false")); + new OpenWebSocketCounter(OPEN_WEBSOCKET_GAUGE_NAME, NEW_CONNECTION_COUNTER_NAME, CONNECTED_DURATION_TIMER_NAME, Tags.of(AUTHENTICATED_TAG_NAME, "false")); } @Override diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningConnectListener.java b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningConnectListener.java index 6c7371364..8eb6287b0 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningConnectListener.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningConnectListener.java @@ -55,8 +55,7 @@ public class ProvisioningConnectListener implements WebSocketConnectListener { this.timeout = timeout; this.openWebSocketCounter = new OpenWebSocketCounter(MetricsUtil.name(getClass(), "openWebsockets"), MetricsUtil.name(getClass(), "newConnections"), - MetricsUtil.name(getClass(), "sessionDuration"), - Duration.ofSeconds(90)); + MetricsUtil.name(getClass(), "sessionDuration")); } @Override diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java index e4482123e..87ff156cf 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java @@ -236,8 +236,6 @@ public class WebSocketConnection implements MessageAvailabilityListener, Disconn }) .thenRun(() -> sample.stop(Timer.builder(SEND_MESSAGE_DURATION_TIMER_NAME) .publishPercentileHistogram(true) - .minimumExpectedValue(Duration.ofMillis(100)) - .maximumExpectedValue(Duration.ofDays(1)) .tags(Tags.of(UserAgentTagUtil.getPlatformTag(client.getUserAgent()))) .register(Metrics.globalRegistry))); } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/MessageControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/MessageControllerTest.java index c035c01b6..381cfd2df 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/MessageControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/MessageControllerTest.java @@ -195,7 +195,7 @@ class MessageControllerTest { new MessageController(rateLimiters, cardinalityEstimator, messageSender, receiptSender, accountsManager, messagesManager, phoneNumberIdentifiers, pushNotificationManager, pushNotificationScheduler, reportMessageManager, messageDeliveryScheduler, mock(ClientReleaseManager.class), - serverSecretParams, SpamChecker.noop(), new MessageMetrics(Duration.ofDays(30)), mock(MessageDeliveryLoopMonitor.class), + serverSecretParams, SpamChecker.noop(), new MessageMetrics(), mock(MessageDeliveryLoopMonitor.class), clock)) .build(); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MessageMetricsTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MessageMetricsTest.java index 447ddf432..eeec5de64 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MessageMetricsTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MessageMetricsTest.java @@ -14,7 +14,6 @@ import static org.mockito.Mockito.when; import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; -import java.time.Duration; import java.util.Optional; import java.util.UUID; import org.junit.jupiter.api.BeforeEach; @@ -43,7 +42,7 @@ class MessageMetricsTest { when(account.isIdentifiedBy(new AciServiceIdentifier(aci))).thenReturn(true); when(account.isIdentifiedBy(new PniServiceIdentifier(pni))).thenReturn(true); simpleMeterRegistry = new SimpleMeterRegistry(); - messageMetrics = new MessageMetrics(simpleMeterRegistry, Duration.ofDays(30)); + messageMetrics = new MessageMetrics(simpleMeterRegistry); } @Test 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 160dbf33d..3c8d5258c 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MetricsUtilTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MetricsUtilTest.java @@ -10,26 +10,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import io.micrometer.core.instrument.Clock; -import io.micrometer.core.instrument.DistributionSummary; import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.MeterRegistry; -import io.micrometer.core.instrument.cumulative.CumulativeDistributionSummary; -import io.micrometer.core.instrument.distribution.CountAtBucket; -import io.micrometer.core.instrument.distribution.DistributionStatisticConfig; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; -import io.micrometer.registry.otlp.OtlpMeterRegistry; - -import java.time.Duration; import java.util.List; -import java.util.Map; -import java.util.stream.IntStream; - import org.assertj.core.api.AbstractStringAssert; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import org.whispersystems.textsecuregcm.configuration.OpenTelemetryConfiguration; import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicConfiguration; import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicMetricsConfiguration; import org.whispersystems.textsecuregcm.storage.DynamicConfigurationManager; @@ -93,34 +81,4 @@ class MetricsUtilTest { assertThat(registry.getMeters()).hasSize(enableAwsSdkMetrics ? 1 : 0); } - - @Test - void exponentialHistogramBuckets() { - final OpenTelemetryConfiguration openTelemetryConfig = - new OpenTelemetryConfiguration(true, Duration.ZERO, 8, Map.of(), Map.of()); - - // Yes, this has to be OtlpMeterRegistry—its histograms behave differently than SimpleMeterRegistry's - final MeterRegistry registry = new OtlpMeterRegistry(openTelemetryConfig, Clock.SYSTEM); - - MetricsUtil.configureHistogramFilters(registry.config(), openTelemetryConfig); - final DistributionSummary summary = DistributionSummary.builder("test.distribution") - .publishPercentileHistogram() - .minimumExpectedValue(1.0) - .maximumExpectedValue(64.0) - .register(registry); - - IntStream.range(1, 128).forEach(summary::record); - - final CountAtBucket[] counts = summary.takeSnapshot().histogramCounts(); - assertThat(counts).containsExactly( - new CountAtBucket(1.0, 1), - new CountAtBucket(2.0, 1), - new CountAtBucket(4.0, 2), - new CountAtBucket(8.0, 4), - new CountAtBucket(16.0, 8), - new CountAtBucket(32.0, 16), - new CountAtBucket(64.0, 32), - new CountAtBucket(Double.POSITIVE_INFINITY, 63)); - } - } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnectionIntegrationTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnectionIntegrationTest.java index 5853b9282..3fb04ea36 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnectionIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnectionIntegrationTest.java @@ -134,7 +134,7 @@ class WebSocketConnectionIntegrationTest { final WebSocketConnection webSocketConnection = new WebSocketConnection( mock(ReceiptSender.class), new MessagesManager(messagesDynamoDb, messagesCache, redisMessageAvailabilityManager, reportMessageManager, sharedExecutorService, Clock.systemUTC()), - new MessageMetrics(Duration.ofDays(30)), + new MessageMetrics(), mock(PushNotificationManager.class), mock(PushNotificationScheduler.class), account, @@ -223,7 +223,7 @@ class WebSocketConnectionIntegrationTest { final WebSocketConnection webSocketConnection = new WebSocketConnection( mock(ReceiptSender.class), new MessagesManager(messagesDynamoDb, messagesCache, redisMessageAvailabilityManager, reportMessageManager, sharedExecutorService, Clock.systemUTC()), - new MessageMetrics(Duration.ofDays(30)), + new MessageMetrics(), mock(PushNotificationManager.class), mock(PushNotificationScheduler.class), account, diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnectionTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnectionTest.java index f9c9d215a..06e9408dc 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnectionTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnectionTest.java @@ -119,7 +119,7 @@ class WebSocketConnectionTest { WebSocketAccountAuthenticator webSocketAuthenticator = new WebSocketAccountAuthenticator(accountAuthenticator); AuthenticatedConnectListener connectListener = new AuthenticatedConnectListener(accountsManager, receiptSender, messagesManager, - new MessageMetrics(Duration.ofDays(30)), mock(PushNotificationManager.class), mock(PushNotificationScheduler.class), + new MessageMetrics(), mock(PushNotificationManager.class), mock(PushNotificationScheduler.class), mock(RedisMessageAvailabilityManager.class), mock(DisconnectionRequestManager.class), messageDeliveryScheduler, clientReleaseManager, mock(MessageDeliveryLoopMonitor.class), mock(ExperimentEnrollmentManager.class)); @@ -625,7 +625,7 @@ class WebSocketConnectionTest { private WebSocketConnection webSocketConnection(final WebSocketClient client) { return new WebSocketConnection(receiptSender, messagesManager, - new MessageMetrics(Duration.ofDays(30)), + new MessageMetrics(), mock(PushNotificationManager.class), mock(PushNotificationScheduler.class), account, diff --git a/service/src/test/resources/config/test.yml b/service/src/test/resources/config/test.yml index 6bc1edbba..16c05c7a5 100644 --- a/service/src/test/resources/config/test.yml +++ b/service/src/test/resources/config/test.yml @@ -303,9 +303,6 @@ openTelemetry: environment: dev shutdownWaitDuration: PT0S url: http://127.0.0.1:4318/ - maxBucketCount: 16 - maxBucketsPerMeter: - chat.SomeClass.someMetric: 64 unidentifiedDelivery: certificate: CgIIAQ==