diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/auth/DisconnectionRequestManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/DisconnectionRequestManager.java index 5675203d5..04e7b0c51 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/auth/DisconnectionRequestManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/auth/DisconnectionRequestManager.java @@ -51,7 +51,7 @@ public class DisconnectionRequestManager extends RedisPubSubAdapter impl private static final String RECEIVE_PROVISIONING_MESSAGE_COUNTER_NAME = name(ProvisioningManager.class, "receiveProvisioningMessage"); - private static final String RETRY_NAME = ProvisioningManager.class.getSimpleName(); + private static final String RETRY_NAME = ResilienceUtil.name(ProvisioningManager.class); private static final Logger logger = LoggerFactory.getLogger(ProvisioningManager.class); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/push/PushNotificationScheduler.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/PushNotificationScheduler.java index 3b9fe88e3..f7ded37bb 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/push/PushNotificationScheduler.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/push/PushNotificationScheduler.java @@ -79,7 +79,7 @@ public class PushNotificationScheduler implements Managed { private final AtomicBoolean running = new AtomicBoolean(false); - private static final String RETRY_NAME = PushNotificationScheduler.class.getSimpleName(); + private static final String RETRY_NAME = ResilienceUtil.name(PushNotificationScheduler.class); class NotificationWorker implements Runnable { diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/redis/FaultTolerantRedisClient.java b/service/src/main/java/org/whispersystems/textsecuregcm/redis/FaultTolerantRedisClient.java index f7a8f0580..6b747d0cb 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/redis/FaultTolerantRedisClient.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/redis/FaultTolerantRedisClient.java @@ -45,7 +45,7 @@ public class FaultTolerantRedisClient { } private static String getCircuitBreakerName(final String name) { - return FaultTolerantRedisClient.class.getSimpleName() + "/" + name; + return ResilienceUtil.name(FaultTolerantRedisClient.class, name); } @VisibleForTesting diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/redis/LettuceShardCircuitBreaker.java b/service/src/main/java/org/whispersystems/textsecuregcm/redis/LettuceShardCircuitBreaker.java index aafefc0aa..1f196d4ca 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/redis/LettuceShardCircuitBreaker.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/redis/LettuceShardCircuitBreaker.java @@ -99,7 +99,9 @@ public class LettuceShardCircuitBreaker implements NettyCustomizer { // In some cases, like the default connection, the remote address includes the DNS hostname, which we want to exclude. shardAddress = StringUtils.substringAfter(remoteAddress.toString(), "/"); - final String circuitBreakerName = "%s-%s/%s".formatted(LettuceShardCircuitBreaker.class.getSimpleName(), clusterName, shardAddress); + final String circuitBreakerName = + ResilienceUtil.name(LettuceShardCircuitBreaker.class, "%s/%s".formatted(clusterName, shardAddress)); + final Map tags = Map.of( CLUSTER_TAG_NAME, clusterName, SHARD_ADDRESS_TAG_NAME, shardAddress); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java index 5a5d0d41b..679b3e3e0 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java @@ -85,10 +85,10 @@ import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClient; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClusterClient; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; import org.whispersystems.textsecuregcm.securevaluerecovery.SecureValueRecoveryClient; -import org.whispersystems.textsecuregcm.util.ResilienceUtil; import org.whispersystems.textsecuregcm.util.ExceptionUtils; import org.whispersystems.textsecuregcm.util.Pair; import org.whispersystems.textsecuregcm.util.RegistrationIdValidator; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; import org.whispersystems.textsecuregcm.util.SystemMapper; import org.whispersystems.textsecuregcm.util.Util; import reactor.core.publisher.Flux; @@ -118,7 +118,7 @@ public class AccountsManager extends RedisPubSubAdapter implemen private static final String TIMESTAMP_BASED_TRANSFER_ARCHIVE_KEY_COUNTER_NAME = name(AccountsManager.class, "timestampRedisKeyCounter"); private static final String REGISTRATION_ID_BASED_TRANSFER_ARCHIVE_KEY_COUNTER_NAME = name(AccountsManager.class,"registrationIdRedisKeyCounter"); - private static final String RETRY_NAME = AccountsManager.class.getSimpleName(); + private static final String RETRY_NAME = ResilienceUtil.name(AccountsManager.class); private static final Duration SUBSCRIBE_RETRY_DELAY = Duration.ofSeconds(5); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java index 1fe5c6b05..569e85f44 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java @@ -152,7 +152,7 @@ public class MessagesCache { private final Counter sharedMrmDataKeyRemovedCounter = Metrics.counter( name(MessagesCache.class, "sharedMrmKeyRemoved")); - static final String RETRY_NAME = MessagesCache.class.getSimpleName(); + static final String RETRY_NAME = ResilienceUtil.name(MessagesCache.class); static final String NEXT_SLOT_TO_PERSIST_KEY = "user_queue_persist_slot"; private static final byte[] LOCK_VALUE = "1".getBytes(StandardCharsets.UTF_8); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/ProfilesManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/ProfilesManager.java index abe852816..e35d868a0 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/ProfilesManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/ProfilesManager.java @@ -42,7 +42,7 @@ public class ProfilesManager { private final String bucket; private final ObjectMapper mapper; - private static final String RETRY_NAME = ProfilesManager.class.getSimpleName(); + private static final String RETRY_NAME = ResilienceUtil.name(ProfilesManager.class); private static final String DELETE_AVATAR_COUNTER_NAME = name(ProfilesManager.class, "deleteAvatar"); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/devicecheck/AppleDeviceCheckManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/devicecheck/AppleDeviceCheckManager.java index c2b8d6b9f..e1d7cbe7a 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/devicecheck/AppleDeviceCheckManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/devicecheck/AppleDeviceCheckManager.java @@ -64,7 +64,7 @@ public class AppleDeviceCheckManager { private final String teamId; private final String bundleId; - private static final String RETRY_NAME = AppleDeviceCheckManager.class.getSimpleName(); + private static final String RETRY_NAME = ResilienceUtil.name(AppleDeviceCheckManager.class); public AppleDeviceCheckManager( AppleDeviceChecks appleDeviceChecks, diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/AppleAppStoreManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/AppleAppStoreManager.java index 5bd07527b..d06325e9e 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/AppleAppStoreManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/AppleAppStoreManager.java @@ -117,7 +117,8 @@ public class AppleAppStoreManager implements SubscriptionPaymentProcessor { retryConfigBuilder.retryOnException(AppleAppStoreManager::shouldRetry); - this.retry = ResilienceUtil.getRetryRegistry().retry("appstore-retry", retryConfigBuilder.build()); + this.retry = ResilienceUtil.getRetryRegistry() + .retry(ResilienceUtil.name(AppleAppStoreManager.class, "appstore-retry"), retryConfigBuilder.build()); } @Override diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/util/ResilienceUtil.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/ResilienceUtil.java index d1b72a629..88bc8f5ac 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/util/ResilienceUtil.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/util/ResilienceUtil.java @@ -84,6 +84,27 @@ public class ResilienceUtil { .build()); } + /// Generates a standardized name for a `CircuitBreaker` or `Retry`. + /// + /// @param clazz the class to which the circuit breaker or retry belongs + /// + /// @return a standardized name for a `CircuitBreaker` or `Retry` + public static String name(final Class clazz) { + return name(clazz, null); + } + + /// Generates a standardized name for a `CircuitBreaker` or `Retry`. + /// + /// @param clazz the class to which the circuit breaker or retry belongs + /// @param name the name of the circuit breaker or retry; may be `null`` + /// + /// @return a standardized name for a `CircuitBreaker` or `Retry` + public static String name(final Class clazz, @Nullable final String name) { + return name != null + ? clazz.getSimpleName() + "/" + name + : clazz.getSimpleName(); + } + /// Returns a `Retry` instance with a default configuration suitable for general Redis operations. /// /// @param name The name of this `Retry`. Calls to this method with the same name will return the same `Retry`