diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimitChallengeManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimitChallengeManager.java index ccedd4a41..a0e5813b0 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimitChallengeManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimitChallengeManager.java @@ -4,15 +4,19 @@ import com.vdurmont.semver4j.Semver; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import io.micrometer.core.instrument.Metrics; import org.whispersystems.textsecuregcm.controllers.RateLimitExceededException; import org.whispersystems.textsecuregcm.push.NotPushRegisteredException; import org.whispersystems.textsecuregcm.recaptcha.RecaptchaClient; import org.whispersystems.textsecuregcm.storage.Account; import org.whispersystems.textsecuregcm.storage.DynamicConfigurationManager; +import org.whispersystems.textsecuregcm.util.Util; import org.whispersystems.textsecuregcm.util.ua.UnrecognizedUserAgentException; import org.whispersystems.textsecuregcm.util.ua.UserAgent; import org.whispersystems.textsecuregcm.util.ua.UserAgentUtil; +import static com.codahale.metrics.MetricRegistry.name; + public class RateLimitChallengeManager { private final PushChallengeManager pushChallengeManager; @@ -27,6 +31,11 @@ public class RateLimitChallengeManager { public static final String OPTION_RECAPTCHA = "recaptcha"; public static final String OPTION_PUSH_CHALLENGE = "pushChallenge"; + private static final String RECAPTCHA_ATTEMPT_COUNTER_NAME = name(RateLimitChallengeManager.class, "recaptcha", "attempt"); + + private static final String SOURCE_COUNTRY_TAG_NAME = "sourceCountry"; + private static final String SUCCESS_TAG_NAME = "success"; + public RateLimitChallengeManager( final PushChallengeManager pushChallengeManager, final RecaptchaClient recaptchaClient, @@ -61,6 +70,10 @@ public class RateLimitChallengeManager { final boolean challengeSuccess = recaptchaClient.verify(captcha, mostRecentProxyIp); + Metrics.counter(RECAPTCHA_ATTEMPT_COUNTER_NAME, + SOURCE_COUNTRY_TAG_NAME, Util.getCountryCode(account.getNumber()), + SUCCESS_TAG_NAME, String.valueOf(challengeSuccess)).increment(); + if (challengeSuccess) { rateLimiters.getRecaptchaChallengeSuccessLimiter().validate(account.getNumber()); resetRateLimits(account); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/limits/RateLimitChallengeManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/limits/RateLimitChallengeManagerTest.java index 366873083..7202aa780 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/limits/RateLimitChallengeManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/limits/RateLimitChallengeManagerTest.java @@ -87,6 +87,8 @@ class RateLimitChallengeManagerTest { @ValueSource(booleans = {true, false}) void answerRecaptchaChallenge(final boolean successfulChallenge) throws RateLimitExceededException { final Account account = mock(Account.class); + when(account.getNumber()).thenReturn("+18005551234"); + when(recaptchaClient.verify(any(), any())).thenReturn(successfulChallenge); when(rateLimiters.getRecaptchaChallengeAttemptLimiter()).thenReturn(mock(RateLimiter.class));