diff --git a/captchaservice-backend/src/main/java/de/muenchen/captchaservice/service/metrics/MetricsService.java b/captchaservice-backend/src/main/java/de/muenchen/captchaservice/service/metrics/MetricsService.java index 189f13a9..27a5cf0c 100644 --- a/captchaservice-backend/src/main/java/de/muenchen/captchaservice/service/metrics/MetricsService.java +++ b/captchaservice-backend/src/main/java/de/muenchen/captchaservice/service/metrics/MetricsService.java @@ -33,12 +33,14 @@ public MetricsService(MeterRegistry meterRegistry, DifficultyService difficultyS } public void recordChallengeRequest(String siteKey, long difficulty, SourceAddress sourceAddress) { + final boolean isWhitelisted = difficultyService.isSourceAddressWhitelisted(siteKey, sourceAddress); long sameSourceAddressRequestCount = getSameSourceAddressRequestCount(sourceAddress); Counter.builder("captcha.challenge.requests") .tag("site_key", siteKey) .tag("difficulty", String.valueOf(difficulty)) .tag("same_source_address_request_count", String.valueOf(sameSourceAddressRequestCount)) + .tag("is_whitelisted", String.valueOf(isWhitelisted)) .description("Counter for captcha challenge requests") .register(meterRegistry) .increment(); @@ -46,12 +48,14 @@ public void recordChallengeRequest(String siteKey, long difficulty, SourceAddres public void recordVerifySuccess(String siteKey, SourceAddress sourceAddress) { final long difficulty = difficultyService.getDifficultyForSourceAddress(siteKey, sourceAddress); + final boolean isWhitelisted = difficultyService.isSourceAddressWhitelisted(siteKey, sourceAddress); long sameSourceAddressRequestCount = getSameSourceAddressRequestCount(sourceAddress); Counter.builder("captcha.verify.success") .tag("site_key", siteKey) .tag("difficulty", String.valueOf(difficulty)) .tag("same_source_address_request_count", String.valueOf(sameSourceAddressRequestCount)) + .tag("is_whitelisted", String.valueOf(isWhitelisted)) .description("Counter for captcha verify success requests") .register(meterRegistry) .increment(); @@ -64,12 +68,14 @@ public void recordClientSolveTime(String siteKey, SourceAddress sourceAddress, L } final long difficulty = difficultyService.getDifficultyForSourceAddress(siteKey, sourceAddress); + final boolean isWhitelisted = difficultyService.isSourceAddressWhitelisted(siteKey, sourceAddress); long sameSourceAddressRequestCount = getSameSourceAddressRequestCount(sourceAddress); DistributionSummary.builder("captcha.client.solve.time") .tag("site_key", siteKey) .tag("difficulty", String.valueOf(difficulty)) .tag("same_source_address_request_count", String.valueOf(sameSourceAddressRequestCount)) + .tag("is_whitelisted", String.valueOf(isWhitelisted)) .description("Summary of the time taken by clients to solve captcha challenges") .baseUnit("milliseconds") .register(meterRegistry) diff --git a/captchaservice-backend/src/test/java/de/muenchen/captchaservice/controller/captcha/CaptchaControllerTest.java b/captchaservice-backend/src/test/java/de/muenchen/captchaservice/controller/captcha/CaptchaControllerTest.java index cbfa271e..f6aed4cf 100644 --- a/captchaservice-backend/src/test/java/de/muenchen/captchaservice/controller/captcha/CaptchaControllerTest.java +++ b/captchaservice-backend/src/test/java/de/muenchen/captchaservice/controller/captcha/CaptchaControllerTest.java @@ -55,6 +55,7 @@ class CaptchaControllerTest { private static final String TEST_SITE_SECRET = "test_secret"; private static final String TEST_HMAC_KEY = "secret"; private static final String TEST_CLIENT_ADDRESS = "1.2.3.4"; + private static final String TEST_WHITELISTED_ADDRESS = "10.0.0.0"; private static final ExtendedPayload TEST_PAYLOAD; static { @@ -236,6 +237,28 @@ void postVerify_expired() { } } + @Test + @SneakyThrows + void testChallengeMetricsWhiteListedSourceAddress() { + final PostChallengeRequest challengeRequest = new PostChallengeRequest(TEST_SITE_KEY, TEST_SITE_SECRET, TEST_WHITELISTED_ADDRESS); + final String challengeRequestBody = objectMapper.writeValueAsString(challengeRequest); + + mockMvc.perform( + post("/api/v1/captcha/challenge") + .content(challengeRequestBody) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + + mockMvc.perform( + get("/actuator/metrics/captcha.challenge.requests")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.measurements[0].value", is(1.0))) + .andExpect(jsonPath("$.availableTags[?(@.tag=='difficulty')].values[0]", hasItem("1"))) + .andExpect(jsonPath("$.availableTags[?(@.tag=='site_key')].values[0]", hasItem("test_site"))) + .andExpect(jsonPath("$.availableTags[?(@.tag=='same_source_address_request_count')].values[*]", hasItem("1"))) + .andExpect(jsonPath("$.availableTags[?(@.tag=='is_whitelisted')].values[0]", hasItem("true"))); + } + @Test @SneakyThrows void testChallengeMetricsIncrement() { @@ -256,7 +279,8 @@ void testChallengeMetricsIncrement() { .andExpect(jsonPath("$.measurements[0].value", is((double) i))) .andExpect(jsonPath("$.availableTags[?(@.tag=='difficulty')].values[0]", hasItem("1000"))) .andExpect(jsonPath("$.availableTags[?(@.tag=='site_key')].values[0]", hasItem("test_site"))) - .andExpect(jsonPath("$.availableTags[?(@.tag=='same_source_address_request_count')].values[*]", hasItem(String.valueOf(i)))); + .andExpect(jsonPath("$.availableTags[?(@.tag=='same_source_address_request_count')].values[*]", hasItem(String.valueOf(i)))) + .andExpect(jsonPath("$.availableTags[?(@.tag=='is_whitelisted')].values[0]", hasItem("false"))); } } @@ -287,7 +311,8 @@ void testVerifyMetricsIncrement() { .andExpect(jsonPath("$.measurements[0].value", is((double) i))) .andExpect(jsonPath("$.availableTags[?(@.tag=='difficulty')].values[0]", hasItem("1000"))) .andExpect(jsonPath("$.availableTags[?(@.tag=='site_key')].values[0]", hasItem("test_site"))) - .andExpect(jsonPath("$.availableTags[?(@.tag=='same_source_address_request_count')]").exists()); + .andExpect(jsonPath("$.availableTags[?(@.tag=='same_source_address_request_count')]").exists()) + .andExpect(jsonPath("$.availableTags[?(@.tag=='is_whitelisted')].values[0]", hasItem("false"))); mockMvc.perform(get("/actuator/metrics/captcha.client.solve.time")) .andExpect(status().isOk()) @@ -296,7 +321,8 @@ void testVerifyMetricsIncrement() { .andExpect(jsonPath("$.measurements[?(@.statistic=='MAX')].value", hasItem((double) TEST_PAYLOAD.getTook()))) .andExpect(jsonPath("$.availableTags[?(@.tag=='difficulty')].values[0]", hasItem("1000"))) .andExpect(jsonPath("$.availableTags[?(@.tag=='site_key')].values[0]", hasItem("test_site"))) - .andExpect(jsonPath("$.availableTags[?(@.tag=='same_source_address_request_count')]").exists()); + .andExpect(jsonPath("$.availableTags[?(@.tag=='same_source_address_request_count')]").exists()) + .andExpect(jsonPath("$.availableTags[?(@.tag=='is_whitelisted')].values[0]", hasItem("false"))); databaseTestUtil.clearDatabase(); }