Standardize circuit breaker/retry names

This commit is contained in:
Jon Chambers
2025-08-28 10:17:18 -04:00
committed by Jon Chambers
parent 8060d74899
commit cd957e0347
13 changed files with 42 additions and 15 deletions

View File

@@ -51,7 +51,7 @@ public class DisconnectionRequestManager extends RedisPubSubAdapter<byte[], byte
private final Executor listenerEventExecutor;
private final ScheduledExecutorService retryExecutor;
private static final String RETRY_NAME = DisconnectionRequestManager.class.getSimpleName();
private static final String RETRY_NAME = ResilienceUtil.name(DisconnectionRequestManager.class);
private static final Duration SUBSCRIBE_RETRY_DELAY = Duration.ofSeconds(5);

View File

@@ -219,14 +219,17 @@ public class FaultTolerantHttpClient {
retryConfigBuilder.retryOnException(retryOnException);
}
retry = ResilienceUtil.getRetryRegistry().retry(name, retryConfigBuilder.build());
retry = ResilienceUtil.getRetryRegistry()
.retry(ResilienceUtil.name(FaultTolerantHttpClient.class, name), retryConfigBuilder.build());
} else {
retry = null;
}
final String circuitBreakerName = ResilienceUtil.name(FaultTolerantHttpClient.class, name);
final CircuitBreaker circuitBreaker = circuitBreakerConfigurationName != null
? ResilienceUtil.getCircuitBreakerRegistry().circuitBreaker(name, circuitBreakerConfigurationName)
: ResilienceUtil.getCircuitBreakerRegistry().circuitBreaker(name);
? ResilienceUtil.getCircuitBreakerRegistry().circuitBreaker(circuitBreakerName, circuitBreakerConfigurationName)
: ResilienceUtil.getCircuitBreakerRegistry().circuitBreaker(circuitBreakerName);
return new FaultTolerantHttpClient(httpClients, requestTimeout, retryExecutor, retry, circuitBreaker);
}

View File

@@ -38,7 +38,7 @@ public class DynamicRateLimiter implements RateLimiter {
private final Clock clock;
private static final String RETRY_NAME = DynamicRateLimiter.class.getSimpleName();
private static final String RETRY_NAME = ResilienceUtil.name(DynamicRateLimiter.class);
public DynamicRateLimiter(
final String name,

View File

@@ -41,7 +41,7 @@ public class ProvisioningManager extends RedisPubSubAdapter<byte[], byte[]> 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);

View File

@@ -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 {

View File

@@ -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

View File

@@ -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<String, String> tags = Map.of(
CLUSTER_TAG_NAME, clusterName,
SHARD_ADDRESS_TAG_NAME, shardAddress);

View File

@@ -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<String, String> 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);

View File

@@ -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);

View File

@@ -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");

View File

@@ -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,

View File

@@ -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

View File

@@ -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`