Skip to content

Commit 03a58b5

Browse files
committed
Integrate metrics and add ExtendedPayload
1 parent c8bae60 commit 03a58b5

File tree

6 files changed

+65
-5
lines changed

6 files changed

+65
-5
lines changed

captchaservice-backend/runLocal.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
#!/bin/bash
2-
docker compose up -d
32
mvn clean spring-boot:run -Dspring-boot.run.jvmArguments="-Dspring.profiles.active=local"
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package de.muenchen.captchaservice.configuration.metrics;
2+
3+
import io.micrometer.core.instrument.Counter;
4+
import io.micrometer.core.instrument.MeterRegistry;
5+
import org.springframework.context.annotation.Bean;
6+
import org.springframework.context.annotation.Configuration;
7+
8+
@Configuration
9+
public class MetricsConfig {
10+
11+
@Bean
12+
public Counter challengeRequestCounter(MeterRegistry meterRegistry) {
13+
return meterRegistry.counter("captcha.controller.challenge.requests");
14+
}
15+
16+
@Bean
17+
public Counter verifyRequestCounter(MeterRegistry meterRegistry) {
18+
return meterRegistry.counter("captcha.controller.verify.requests");
19+
}
20+
}

captchaservice-backend/src/main/java/de/muenchen/captchaservice/controller/captcha/CaptchaController.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import de.muenchen.captchaservice.service.captcha.CaptchaService;
1010
import de.muenchen.captchaservice.service.siteauth.SiteAuthService;
1111
import de.muenchen.captchaservice.service.sourceaddress.SourceAddressService;
12+
import io.micrometer.core.instrument.Counter;
1213
import jakarta.validation.Valid;
1314
import lombok.RequiredArgsConstructor;
1415
import lombok.SneakyThrows;
@@ -26,6 +27,8 @@ public class CaptchaController {
2627
private final CaptchaService captchaService;
2728
private final SiteAuthService siteAuthService;
2829
private final SourceAddressService sourceAddressService;
30+
private final Counter challengeRequestCounter;
31+
private final Counter verifyRequestCounter;
2932

3033
@PostMapping("/challenge")
3134
@SneakyThrows
@@ -34,6 +37,7 @@ public PostChallengeResponse postChallenge(@Valid @RequestBody final PostChallen
3437
throw new UnauthorizedException("Wrong credentials.");
3538
}
3639

40+
challengeRequestCounter.increment();
3741
final SourceAddress sourceAddress = sourceAddressService.parse(request.getSiteKey(), request.getClientAddress());
3842
final Altcha.Challenge challenge = captchaService.createChallenge(request.getSiteKey(), sourceAddress);
3943
return new PostChallengeResponse(challenge);
@@ -45,6 +49,7 @@ public PostVerifyResponse postVerify(@Valid @RequestBody final PostVerifyRequest
4549
throw new UnauthorizedException("Wrong credentials.");
4650
}
4751

52+
verifyRequestCounter.increment();
4853
final boolean isValid = captchaService.verify(request.getSiteKey(), request.getPayload());
4954
return new PostVerifyResponse(isValid);
5055
}

captchaservice-backend/src/main/java/de/muenchen/captchaservice/controller/captcha/request/PostVerifyRequest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
import lombok.AllArgsConstructor;
66
import lombok.Data;
77
import lombok.NoArgsConstructor;
8-
import org.altcha.altcha.Altcha;
8+
9+
import de.muenchen.captchaservice.data.ExtendedPayload;
910

1011
@Data
1112
@NoArgsConstructor
@@ -21,6 +22,6 @@ public class PostVerifyRequest {
2122
private String siteSecret;
2223

2324
@NotNull
24-
private Altcha.Payload payload;
25+
private ExtendedPayload payload;
2526

2627
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package de.muenchen.captchaservice.data;
2+
3+
import org.altcha.altcha.Altcha;
4+
5+
public class ExtendedPayload extends Altcha.Payload {
6+
7+
private Long took;
8+
9+
public Long getTook() {
10+
return took;
11+
}
12+
13+
public void setTook(Long took) {
14+
this.took = took;
15+
}
16+
17+
}

captchaservice-backend/src/main/java/de/muenchen/captchaservice/service/captcha/CaptchaService.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22

33
import de.muenchen.captchaservice.configuration.captcha.CaptchaProperties;
44
import de.muenchen.captchaservice.configuration.captcha.CaptchaSite;
5+
import de.muenchen.captchaservice.data.ExtendedPayload;
56
import de.muenchen.captchaservice.data.SourceAddress;
67
import de.muenchen.captchaservice.entity.InvalidatedPayload;
78
import de.muenchen.captchaservice.repository.InvalidatedPayloadRepository;
89
import de.muenchen.captchaservice.service.difficulty.DifficultyService;
910
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
11+
import io.micrometer.core.instrument.MeterRegistry;
12+
import io.micrometer.core.instrument.Counter;
13+
import io.micrometer.core.instrument.DistributionSummary;
1014
import lombok.extern.slf4j.Slf4j;
1115
import org.altcha.altcha.Altcha;
1216
import org.apache.commons.codec.digest.DigestUtils;
@@ -21,16 +25,25 @@ public class CaptchaService {
2125
private final CaptchaProperties captchaProperties;
2226
private final InvalidatedPayloadRepository invalidatedPayloadRepository;
2327
private final DifficultyService difficultyService;
28+
private final Counter challengeCounter;
29+
private final Counter verifySuccessCounter;
30+
private final DistributionSummary tookTimeSummary;
2431

2532
@SuppressFBWarnings(value = { "EI_EXPOSE_REP2" }, justification = "Dependency Injection")
2633
public CaptchaService(final CaptchaProperties captchaProperties, final DifficultyService difficultyService,
27-
final InvalidatedPayloadRepository invalidatedPayloadRepository) {
34+
final InvalidatedPayloadRepository invalidatedPayloadRepository, MeterRegistry meterRegistry) {
2835
this.captchaProperties = captchaProperties;
2936
this.invalidatedPayloadRepository = invalidatedPayloadRepository;
3037
this.difficultyService = difficultyService;
38+
39+
// Initialize metrics
40+
this.challengeCounter = meterRegistry.counter("captcha.challenge.requests");
41+
this.verifySuccessCounter = meterRegistry.counter("captcha.verify.success");
42+
this.tookTimeSummary = meterRegistry.summary("captcha.verify.took.time");
3143
}
3244

3345
public Altcha.Challenge createChallenge(final String siteKey, final SourceAddress sourceAddress) {
46+
challengeCounter.increment();
3447
final long difficulty = difficultyService.getDifficultyForSourceAddress(siteKey, sourceAddress);
3548
difficultyService.registerRequest(siteKey, sourceAddress);
3649
final Altcha.ChallengeOptions options = new Altcha.ChallengeOptions();
@@ -46,13 +59,18 @@ public Altcha.Challenge createChallenge(final String siteKey, final SourceAddres
4659
return null;
4760
}
4861

49-
public boolean verify(final String siteKey, final Altcha.Payload payload) {
62+
public boolean verify(final String siteKey, final ExtendedPayload payload) {
5063
if (isPayloadInvalidated(siteKey, payload)) {
5164
return false;
5265
}
5366
try {
67+
if (payload.getTook() != null) {
68+
tookTimeSummary.record(payload.getTook());
69+
}
70+
5471
final boolean isValid = Altcha.verifySolution(payload, captchaProperties.hmacKey(), true);
5572
if (isValid) {
73+
verifySuccessCounter.increment();
5674
invalidatePayload(payload);
5775
}
5876
return isValid;

0 commit comments

Comments
 (0)