Skip to content

Commit 00062fd

Browse files
committed
Revert "Use Micrometer rather than Dropwizard for a few metrics"
This reverts commit 2bc91c1.
1 parent 2bc91c1 commit 00062fd

File tree

4 files changed

+81
-94
lines changed

4 files changed

+81
-94
lines changed

service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java

Lines changed: 69 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import io.dropwizard.core.setup.Bootstrap;
2222
import io.dropwizard.core.setup.Environment;
2323
import io.dropwizard.jetty.HttpsConnectorFactory;
24-
import io.dropwizard.lifecycle.setup.LifecycleEnvironment;
2524
import io.grpc.ServerBuilder;
2625
import io.lettuce.core.metrics.MicrometerCommandLatencyRecorder;
2726
import io.lettuce.core.metrics.MicrometerOptions;
@@ -365,8 +364,8 @@ public void run(WhisperServerConfiguration config, Environment environment) thro
365364

366365
UncaughtExceptionHandler.register();
367366

368-
ScheduledExecutorService dynamicConfigurationExecutor = ScheduledExecutorServiceBuilder.of(environment, "dynamicConfiguration")
369-
.threads(1).build();
367+
ScheduledExecutorService dynamicConfigurationExecutor = environment.lifecycle()
368+
.scheduledExecutorService(name(getClass(), "dynamicConfiguration-%d")).threads(1).build();
370369

371370
DynamicConfigurationManager<DynamicConfiguration> dynamicConfigurationManager =
372371
new DynamicConfigurationManager<>(
@@ -398,7 +397,8 @@ public void run(WhisperServerConfiguration config, Environment environment) thro
398397

399398
environment.lifecycle().manage(new ManagedAwsCrt());
400399

401-
final ExecutorService awsSdkMetricsExecutor = virtualExecutorService(environment, "awsSdkMetrics");
400+
final ExecutorService awsSdkMetricsExecutor = environment.lifecycle()
401+
.virtualExecutorService(name(getClass(), "awsSdkMetrics-%d"));
402402

403403
final DynamoDbAsyncClient dynamoDbAsyncClient = config.getDynamoDbClientConfiguration()
404404
.buildAsyncClient(awsCredentialsProvider, new MicrometerAwsSdkMetricPublisher(awsSdkMetricsExecutor, "dynamoDbAsync"));
@@ -415,7 +415,8 @@ public void run(WhisperServerConfiguration config, Environment environment) thro
415415
BlockingQueue<Runnable> messageDeletionQueue = new LinkedBlockingQueue<>();
416416
Metrics.gaugeCollectionSize(name(getClass(), "messageDeletionQueueSize"), Collections.emptyList(),
417417
messageDeletionQueue);
418-
ExecutorService messageDeletionAsyncExecutor = ExecutorServiceBuilder.of(environment, "messageDeletionAsyncExecutor")
418+
ExecutorService messageDeletionAsyncExecutor = environment.lifecycle()
419+
.executorService(name(getClass(), "messageDeletionAsyncExecutor-%d"))
419420
.minThreads(2)
420421
.maxThreads(2)
421422
.allowCoreThreadTimeOut(true)
@@ -502,79 +503,98 @@ public void run(WhisperServerConfiguration config, Environment environment) thro
502503
Metrics.gaugeCollectionSize(MetricsUtil.name(getClass(), "messageDeliveryQueue"), Collections.emptyList(),
503504
messageDeliveryQueue);
504505

505-
ScheduledExecutorService recurringJobExecutor = ScheduledExecutorServiceBuilder.of(environment, "recurringJob").threads(6).build();
506-
ScheduledExecutorService websocketScheduledExecutor = ScheduledExecutorServiceBuilder.of(environment, "websocket").threads(8).build();
507-
ExecutorService apnSenderExecutor = ExecutorServiceBuilder.of(environment, "apnSender")
506+
ScheduledExecutorService recurringJobExecutor = environment.lifecycle()
507+
.scheduledExecutorService(name(getClass(), "recurringJob-%d")).threads(6).build();
508+
ScheduledExecutorService websocketScheduledExecutor = environment.lifecycle()
509+
.scheduledExecutorService(name(getClass(), "websocket-%d")).threads(8).build();
510+
ExecutorService apnSenderExecutor = environment.lifecycle().executorService(name(getClass(), "apnSender-%d"))
508511
.maxThreads(1).minThreads(1).build();
509-
ExecutorService fcmSenderExecutor = ExecutorServiceBuilder.of(environment, "fcmSender")
512+
ExecutorService fcmSenderExecutor = environment.lifecycle().executorService(name(getClass(), "fcmSender-%d"))
510513
.maxThreads(32).minThreads(32).workQueue(fcmSenderQueue).build();
511-
ExecutorService secureValueRecoveryServiceExecutor = ExecutorServiceBuilder.of(environment, "secureValueRecoveryService")
512-
.maxThreads(1).minThreads(1).build();
513-
ExecutorService storageServiceExecutor = ExecutorServiceBuilder.of(environment, "storageService")
514-
.maxThreads(1).minThreads(1).build();
515-
ExecutorService virtualThreadEventLoggerExecutor = ExecutorServiceBuilder.of(environment, "virtualThreadEventLogger")
516-
.minThreads(1).maxThreads(1).build();
517-
ExecutorService asyncOperationQueueingExecutor = ExecutorServiceBuilder.of(environment, "asyncOperationQueueing")
518-
.minThreads(1).maxThreads(1).build();
519-
ScheduledExecutorService secureValueRecoveryServiceRetryExecutor =
520-
ScheduledExecutorServiceBuilder.of(environment, "secureValueRecoveryServiceRetry").threads(1).build();
521-
ScheduledExecutorService storageServiceRetryExecutor =
522-
ScheduledExecutorServiceBuilder.of(environment, "storageServiceRetry").threads(1).build();
523-
ScheduledExecutorService remoteStorageRetryExecutor =
524-
ScheduledExecutorServiceBuilder.of(environment, "remoteStorageRetry").threads(1).build();
525-
ScheduledExecutorService registrationIdentityTokenRefreshExecutor =
526-
ScheduledExecutorServiceBuilder.of(environment, "registrationIdentityTokenRefresh").threads(1).build();
514+
ExecutorService secureValueRecoveryServiceExecutor = environment.lifecycle()
515+
.executorService(name(getClass(), "secureValueRecoveryService-%d")).maxThreads(1).minThreads(1).build();
516+
ExecutorService storageServiceExecutor = environment.lifecycle()
517+
.executorService(name(getClass(), "storageService-%d")).maxThreads(1).minThreads(1).build();
518+
ExecutorService virtualThreadEventLoggerExecutor = environment.lifecycle()
519+
.executorService(name(getClass(), "virtualThreadEventLogger-%d")).minThreads(1).maxThreads(1).build();
520+
ExecutorService asyncOperationQueueingExecutor = environment.lifecycle()
521+
.executorService(name(getClass(), "asyncOperationQueueing-%d")).minThreads(1).maxThreads(1).build();
522+
ScheduledExecutorService secureValueRecoveryServiceRetryExecutor = environment.lifecycle()
523+
.scheduledExecutorService(name(getClass(), "secureValueRecoveryServiceRetry-%d")).threads(1).build();
524+
ScheduledExecutorService storageServiceRetryExecutor = environment.lifecycle()
525+
.scheduledExecutorService(name(getClass(), "storageServiceRetry-%d")).threads(1).build();
526+
ScheduledExecutorService remoteStorageRetryExecutor = environment.lifecycle()
527+
.scheduledExecutorService(name(getClass(), "remoteStorageRetry-%d")).threads(1).build();
528+
ScheduledExecutorService registrationIdentityTokenRefreshExecutor = environment.lifecycle()
529+
.scheduledExecutorService(name(getClass(), "registrationIdentityTokenRefresh-%d")).threads(1).build();
527530

528531
Scheduler messageDeliveryScheduler = Schedulers.fromExecutorService(
529-
ExecutorServiceBuilder.of(environment, "messageDelivery")
530-
.minThreads(20)
531-
.maxThreads(20)
532-
.workQueue(messageDeliveryQueue)
533-
.build(),
532+
ExecutorServiceMetrics.monitor(Metrics.globalRegistry,
533+
environment.lifecycle().executorService(name(getClass(), "messageDelivery-%d"))
534+
.minThreads(20)
535+
.maxThreads(20)
536+
.workQueue(messageDeliveryQueue)
537+
.build(),
538+
MetricsUtil.name(getClass(), "messageDeliveryExecutor"), MetricsUtil.PREFIX),
534539
"messageDelivery");
535540

536541
// TODO: generally speaking this is a DynamoDB I/O executor for the accounts table; we should eventually have a general executor for speaking to the accounts table, but most of the server is still synchronous so this isn't widely useful yet
537-
ExecutorService batchIdentityCheckExecutor = ExecutorServiceBuilder.of(environment, "batchIdentityCheck").minThreads(32).maxThreads(32).build();
538-
ExecutorService subscriptionProcessorExecutor = ExecutorServiceBuilder.of(environment, "subscriptionProcessor")
542+
ExecutorService batchIdentityCheckExecutor = environment.lifecycle().executorService(name(getClass(), "batchIdentityCheck-%d")).minThreads(32).maxThreads(32).build();
543+
ExecutorService subscriptionProcessorExecutor = environment.lifecycle()
544+
.executorService(name(getClass(), "subscriptionProcessor-%d"))
539545
.maxThreads(availableProcessors) // mostly this is IO bound so tying to number of processors is tenuous at best
540546
.minThreads(availableProcessors) // mostly this is IO bound so tying to number of processors is tenuous at best
541547
.allowCoreThreadTimeOut(true).
542548
build();
543-
ExecutorService receiptSenderExecutor = ExecutorServiceBuilder.of(environment, "receiptSender")
549+
ExecutorService receiptSenderExecutor = environment.lifecycle()
550+
.executorService(name(getClass(), "receiptSender-%d"))
544551
.maxThreads(2)
545552
.minThreads(2)
546553
.workQueue(receiptSenderQueue)
547554
.rejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy())
548555
.build();
549-
ExecutorService registrationCallbackExecutor = ExecutorServiceBuilder.of(environment, "registration")
556+
ExecutorService registrationCallbackExecutor = environment.lifecycle()
557+
.executorService(name(getClass(), "registration-%d"))
550558
.maxThreads(2)
551559
.minThreads(2)
552560
.build();
553-
ExecutorService accountLockExecutor = ExecutorServiceBuilder.of(environment, "accountLock")
561+
ExecutorService accountLockExecutor = environment.lifecycle()
562+
.executorService(name(getClass(), "accountLock-%d"))
554563
.minThreads(8)
555564
.maxThreads(8)
556565
.build();
557566
// unbounded executor (same as cachedThreadPool)
558-
ExecutorService remoteStorageHttpExecutor = ExecutorServiceBuilder.of(environment, "remoteStorage")
567+
ExecutorService remoteStorageHttpExecutor = environment.lifecycle()
568+
.executorService(name(getClass(), "remoteStorage-%d"))
559569
.minThreads(0)
560570
.maxThreads(Integer.MAX_VALUE)
561571
.workQueue(new SynchronousQueue<>())
562572
.keepAliveTime(io.dropwizard.util.Duration.seconds(60L))
563573
.build();
564-
ExecutorService cloudflareTurnHttpExecutor = ExecutorServiceBuilder.of(environment, "cloudflareTurn")
574+
ExecutorService cloudflareTurnHttpExecutor = environment.lifecycle()
575+
.executorService(name(getClass(), "cloudflareTurn-%d"))
565576
.maxThreads(2)
566577
.minThreads(2)
567578
.build();
568-
ExecutorService googlePlayBillingExecutor = virtualExecutorService(environment, "googlePlayBilling");
569-
ExecutorService appleAppStoreExecutor = virtualExecutorService(environment, "appleAppStore");
570-
ExecutorService clientEventExecutor = virtualExecutorService(environment, "clientEvent");
571-
ExecutorService disconnectionRequestListenerExecutor = virtualExecutorService(environment, "disconnectionRequest");
572-
573-
ScheduledExecutorService appleAppStoreRetryExecutor = ScheduledExecutorServiceBuilder.of(environment, "appleAppStoreRetry").threads(1).build();
574-
ScheduledExecutorService subscriptionProcessorRetryExecutor = ScheduledExecutorServiceBuilder.of(environment, "subscriptionProcessorRetry").threads(1).build();
575-
ScheduledExecutorService cloudflareTurnRetryExecutor = ScheduledExecutorServiceBuilder.of(environment, "cloudflareTurnRetry").threads(1).build();
576-
ScheduledExecutorService messagePollExecutor = ScheduledExecutorServiceBuilder.of(environment, "messagePollExecutor").threads(1).build();
577-
ScheduledExecutorService provisioningWebsocketTimeoutExecutor = ScheduledExecutorServiceBuilder.of(environment, "provisioningWebsocketTimeout").threads(1).build();
579+
ExecutorService googlePlayBillingExecutor = environment.lifecycle()
580+
.virtualExecutorService(name(getClass(), "googlePlayBilling-%d"));
581+
ExecutorService appleAppStoreExecutor = environment.lifecycle()
582+
.virtualExecutorService(name(getClass(), "appleAppStore-%d"));
583+
ExecutorService clientEventExecutor = environment.lifecycle()
584+
.virtualExecutorService(name(getClass(), "clientEvent-%d"));
585+
ExecutorService disconnectionRequestListenerExecutor = environment.lifecycle()
586+
.virtualExecutorService(name(getClass(), "disconnectionRequest-%d"));
587+
588+
ScheduledExecutorService appleAppStoreRetryExecutor = environment.lifecycle()
589+
.scheduledExecutorService(name(getClass(), "appleAppStoreRetry-%d")).threads(1).build();
590+
ScheduledExecutorService subscriptionProcessorRetryExecutor = environment.lifecycle()
591+
.scheduledExecutorService(name(getClass(), "subscriptionProcessorRetry-%d")).threads(1).build();
592+
ScheduledExecutorService cloudflareTurnRetryExecutor = environment.lifecycle()
593+
.scheduledExecutorService(name(getClass(), "cloudflareTurnRetry-%d")).threads(1).build();
594+
ScheduledExecutorService messagePollExecutor = environment.lifecycle()
595+
.scheduledExecutorService(name(getClass(), "messagePollExecutor-%d")).threads(1).build();
596+
ScheduledExecutorService provisioningWebsocketTimeoutExecutor = environment.lifecycle()
597+
.scheduledExecutorService(name(getClass(), "provisioningWebsocketTimeout-%d")).threads(1).build();
578598

579599
final ManagedNioEventLoopGroup dnsResolutionEventLoopGroup = new ManagedNioEventLoopGroup();
580600
final DnsNameResolver cloudflareDnsResolver = new DnsNameResolverBuilder(dnsResolutionEventLoopGroup.next())
@@ -902,7 +922,8 @@ protected void configureServer(final ServerBuilder<?> serverBuilder) {
902922
noiseWebSocketTlsPrivateKey = null;
903923
}
904924

905-
final ExecutorService noiseWebSocketDelegatedTaskExecutor = ExecutorServiceBuilder.of(environment, "noiseWebsocketDelegatedTask")
925+
final ExecutorService noiseWebSocketDelegatedTaskExecutor = environment.lifecycle()
926+
.executorService(name(getClass(), "noiseWebsocketDelegatedTask-%d"))
906927
.minThreads(8)
907928
.maxThreads(8)
908929
.allowCoreThreadTimeOut(false)
@@ -1206,47 +1227,6 @@ private void registerExceptionMappers(Environment environment,
12061227
});
12071228
}
12081229

1209-
private static class ExecutorServiceBuilder extends io.dropwizard.lifecycle.setup.ExecutorServiceBuilder {
1210-
private final String baseName;
1211-
1212-
public ExecutorServiceBuilder(final LifecycleEnvironment environment, final String baseName) {
1213-
super(environment, name(WhisperServerService.class, baseName) + "-%d");
1214-
this.baseName = baseName;
1215-
}
1216-
1217-
@Override
1218-
public ExecutorService build() {
1219-
return ExecutorServiceMetrics.monitor(Metrics.globalRegistry, super.build(), baseName, MetricsUtil.PREFIX);
1220-
}
1221-
1222-
public static ExecutorServiceBuilder of(final Environment environment, final String name) {
1223-
return new ExecutorServiceBuilder(environment.lifecycle(), name);
1224-
}
1225-
}
1226-
1227-
private static class ScheduledExecutorServiceBuilder extends io.dropwizard.lifecycle.setup.ScheduledExecutorServiceBuilder {
1228-
private final String baseName;
1229-
1230-
public ScheduledExecutorServiceBuilder(final LifecycleEnvironment environment, final String baseName) {
1231-
super(environment, name(WhisperServerService.class, baseName) + "-%d", false);
1232-
this.baseName = baseName;
1233-
}
1234-
1235-
@Override
1236-
public ScheduledExecutorService build() {
1237-
return ExecutorServiceMetrics.monitor(Metrics.globalRegistry, super.build(), baseName, MetricsUtil.PREFIX);
1238-
}
1239-
1240-
public static ScheduledExecutorServiceBuilder of(final Environment environment, final String name) {
1241-
return new ScheduledExecutorServiceBuilder(environment.lifecycle(), name);
1242-
}
1243-
}
1244-
1245-
private ExecutorService virtualExecutorService(final Environment environment, final String name) {
1246-
return ExecutorServiceMetrics.monitor(
1247-
Metrics.globalRegistry, environment.lifecycle().virtualExecutorService(name(getClass(), name) + "-%d"), name, MetricsUtil.PREFIX);
1248-
}
1249-
12501230
public static void main(String[] args) throws Exception {
12511231
new WhisperServerService().run(args);
12521232
}

service/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import static com.codahale.metrics.MetricRegistry.name;
88

9+
import com.codahale.metrics.annotation.Timed;
910
import com.google.common.net.HttpHeaders;
1011
import io.dropwizard.auth.Auth;
1112
import io.micrometer.core.instrument.Metrics;
@@ -468,6 +469,7 @@ private void sendIndividualMessage(final Account destination,
468469
}
469470
}
470471

472+
@Timed
471473
@Path("/multi_recipient")
472474
@PUT
473475
@Consumes(MultiRecipientMessageProvider.MEDIA_TYPE)
@@ -754,6 +756,7 @@ private void checkAccessKeys(
754756
}
755757
}
756758

759+
@Timed
757760
@GET
758761
@Produces(MediaType.APPLICATION_JSON)
759762
public CompletableFuture<OutgoingMessageEntityList> getPendingMessages(@Auth AuthenticatedDevice auth,
@@ -832,6 +835,7 @@ private static long estimateMessageListSizeBytes(final OutgoingMessageEntityList
832835
return size;
833836
}
834837

838+
@Timed
835839
@DELETE
836840
@Path("/uuid/{uuid}")
837841
public CompletableFuture<Response> removePendingMessage(@Auth AuthenticatedDevice auth, @PathParam("uuid") UUID uuid) {
@@ -870,6 +874,7 @@ public CompletableFuture<Response> removePendingMessage(@Auth AuthenticatedDevic
870874
.thenApply(Util.ASYNC_EMPTY_RESPONSE);
871875
}
872876

877+
@Timed
873878
@POST
874879
@Consumes(MediaType.APPLICATION_JSON)
875880
@Path("/report/{source}/{messageGuid}")

service/src/main/java/org/whispersystems/textsecuregcm/jetty/JettyHttpConfigurationCustomizer.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
import org.eclipse.jetty.util.component.LifeCycle;
1515
import org.slf4j.Logger;
1616
import org.slf4j.LoggerFactory;
17-
import io.micrometer.core.instrument.Metrics;
18-
import io.micrometer.core.instrument.binder.jetty.JettyConnectionMetrics;
1917

2018
/**
2119
* Uses {@link Container.Listener} to update {@link org.eclipse.jetty.server.HttpConfiguration}
@@ -27,6 +25,7 @@ public class JettyHttpConfigurationCustomizer implements Container.Listener, Lif
2725
@Override
2826
public void beanAdded(final Container parent, final Object child) {
2927
if (child instanceof Connector c) {
28+
3029
for (ConnectionFactory cf : c.getConnectionFactories()) {
3130
final HttpConfiguration httpConfiguration = switch (cf) {
3231
case HTTP2ServerConnectionFactory h2cf -> h2cf.getHttpConfiguration();
@@ -40,8 +39,6 @@ public void beanAdded(final Container parent, final Object child) {
4039
httpConfiguration.setNotifyRemoteAsyncErrors(false);
4140
}
4241
}
43-
44-
c.addBean(new JettyConnectionMetrics(Metrics.globalRegistry));
4542
}
4643
}
4744

service/src/main/java/org/whispersystems/textsecuregcm/push/ReceiptSender.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package org.whispersystems.textsecuregcm.push;
77

8+
import io.micrometer.core.instrument.Metrics;
9+
import io.micrometer.core.instrument.binder.jvm.ExecutorServiceMetrics;
810
import java.util.Map;
911
import java.util.Optional;
1012
import java.util.concurrent.ExecutorService;
@@ -14,6 +16,7 @@
1416
import org.whispersystems.textsecuregcm.entities.MessageProtos.Envelope;
1517
import org.whispersystems.textsecuregcm.identity.AciServiceIdentifier;
1618
import org.whispersystems.textsecuregcm.identity.ServiceIdentifier;
19+
import org.whispersystems.textsecuregcm.metrics.MetricsUtil;
1720
import org.whispersystems.textsecuregcm.metrics.UserAgentTagUtil;
1821
import org.whispersystems.textsecuregcm.storage.AccountsManager;
1922
import org.whispersystems.textsecuregcm.storage.Device;
@@ -30,7 +33,9 @@ public ReceiptSender(final AccountsManager accountManager, final MessageSender m
3033
final ExecutorService executor) {
3134
this.accountManager = accountManager;
3235
this.messageSender = messageSender;
33-
this.executor = executor;
36+
this.executor = ExecutorServiceMetrics.monitor(
37+
Metrics.globalRegistry, executor, MetricsUtil.name(ReceiptSender.class, "executor"), MetricsUtil.PREFIX)
38+
;
3439
}
3540

3641
public void sendReceipt(ServiceIdentifier sourceIdentifier, byte sourceDeviceId, AciServiceIdentifier destinationIdentifier, long messageId) {

0 commit comments

Comments
 (0)