diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/DynamicConfigurationManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/DynamicConfigurationManager.java index cb22d92ee..12ce99284 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/DynamicConfigurationManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/DynamicConfigurationManager.java @@ -15,6 +15,7 @@ import java.util.concurrent.atomic.AtomicReference; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; +import io.micrometer.core.instrument.Metrics; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,6 +25,8 @@ import software.amazon.awssdk.services.appconfig.AppConfigClient; import software.amazon.awssdk.services.appconfig.model.GetConfigurationRequest; import software.amazon.awssdk.services.appconfig.model.GetConfigurationResponse; +import static org.whispersystems.textsecuregcm.metrics.MetricsUtil.name; + public class DynamicConfigurationManager { private final String application; @@ -46,6 +49,10 @@ public class DynamicConfigurationManager { private static final Validator VALIDATOR = Validation.buildDefaultValidatorFactory().getValidator(); + private static final String ERROR_COUNTER_NAME = name(DynamicConfigurationManager.class, "error"); + private static final String ERROR_TYPE_TAG_NAME = "type"; + private static final String CONFIG_CLASS_TAG_NAME = "configClass"; + private static final Logger logger = LoggerFactory.getLogger(DynamicConfigurationManager.class); public DynamicConfigurationManager(String application, String environment, String configurationName, @@ -106,23 +113,36 @@ public class DynamicConfigurationManager { private Optional retrieveDynamicConfiguration() throws JsonProcessingException { final String previousVersion = lastConfigResult != null ? lastConfigResult.configurationVersion() : null; - lastConfigResult = appConfigClient.getConfiguration(GetConfigurationRequest.builder() - .application(application) - .environment(environment) - .configuration(configurationName) - .clientId(clientId) - .clientConfigurationVersion(previousVersion) - .build()); + try { + lastConfigResult = appConfigClient.getConfiguration(GetConfigurationRequest.builder() + .application(application) + .environment(environment) + .configuration(configurationName) + .clientId(clientId) + .clientConfigurationVersion(previousVersion) + .build()); + } catch (final RuntimeException e) { + Metrics.counter(ERROR_COUNTER_NAME, ERROR_TYPE_TAG_NAME, "fetch").increment(); + throw e; + } final Optional maybeDynamicConfiguration; if (!StringUtils.equals(lastConfigResult.configurationVersion(), previousVersion)) { logger.info("Received new config version: {}", lastConfigResult.configurationVersion()); - maybeDynamicConfiguration = - parseConfiguration( - StandardCharsets.UTF_8.decode(lastConfigResult.content().asByteBuffer().asReadOnlyBuffer()).toString(), - configurationClass); + try { + maybeDynamicConfiguration = + parseConfiguration( + StandardCharsets.UTF_8.decode(lastConfigResult.content().asByteBuffer().asReadOnlyBuffer()).toString(), + configurationClass); + } catch (final JsonProcessingException e) { + Metrics.counter(ERROR_COUNTER_NAME, + ERROR_TYPE_TAG_NAME, "parse", + CONFIG_CLASS_TAG_NAME, configurationClass.getName()).increment(); + + throw e; + } } else { // No change since last version maybeDynamicConfiguration = Optional.empty();