1
1
package de .muenchen .captchaservice .service .captcha ;
2
2
3
3
import de .muenchen .captchaservice .data .SourceAddress ;
4
+ import de .muenchen .captchaservice .repository .CaptchaRequestRepository ;
4
5
import de .muenchen .captchaservice .repository .InvalidatedPayloadRepository ;
5
6
import de .muenchen .captchaservice .service .difficulty .DifficultyService ;
6
7
import edu .umd .cs .findbugs .annotations .SuppressFBWarnings ;
@@ -20,30 +21,37 @@ public class MetricsService {
20
21
private final MeterRegistry meterRegistry ;
21
22
private final DifficultyService difficultyService ;
22
23
private final InvalidatedPayloadRepository invalidatedPayloadRepository ;
24
+ private final CaptchaRequestRepository captchaRequestRepository ;
23
25
24
26
@ SuppressFBWarnings (value = { "EI_EXPOSE_REP2" }, justification = "Dependency Injection" )
25
27
public MetricsService (MeterRegistry meterRegistry , DifficultyService difficultyService ,
26
- InvalidatedPayloadRepository invalidatedPayloadRepository ) {
28
+ InvalidatedPayloadRepository invalidatedPayloadRepository , CaptchaRequestRepository captchaRequestRepository ) {
27
29
this .meterRegistry = meterRegistry ;
28
30
this .difficultyService = difficultyService ;
29
31
this .invalidatedPayloadRepository = invalidatedPayloadRepository ;
32
+ this .captchaRequestRepository = captchaRequestRepository ;
30
33
}
31
34
32
- public void recordChallengeRequest (String siteKey , long difficulty ) {
35
+ public void recordChallengeRequest (String siteKey , long difficulty , SourceAddress sourceAddress ) {
36
+ long sameSourceAddressRequestCount = getSameSourceAddressRequestCount (sourceAddress );
37
+
33
38
Counter .builder ("captcha.challenge.requests" )
34
39
.tag ("site_key" , siteKey )
35
40
.tag ("difficulty" , String .valueOf (difficulty ))
41
+ .tag ("same_source_address_request_count" , String .valueOf (sameSourceAddressRequestCount ))
36
42
.description ("Counter for captcha challenge requests" )
37
43
.register (meterRegistry )
38
44
.increment ();
39
45
}
40
46
41
47
public void recordVerifySuccess (String siteKey , SourceAddress sourceAddress ) {
42
48
final long difficulty = difficultyService .getDifficultyForSourceAddress (siteKey , sourceAddress );
49
+ long sameSourceAddressRequestCount = getSameSourceAddressRequestCount (sourceAddress );
43
50
44
51
Counter .builder ("captcha.verify.success" )
45
52
.tag ("site_key" , siteKey )
46
53
.tag ("difficulty" , String .valueOf (difficulty ))
54
+ .tag ("same_source_address_request_count" , String .valueOf (sameSourceAddressRequestCount ))
47
55
.description ("Counter for captcha verify success requests" )
48
56
.register (meterRegistry )
49
57
.increment ();
@@ -56,16 +64,22 @@ public void recordClientSolveTime(String siteKey, SourceAddress sourceAddress, l
56
64
}
57
65
58
66
final long difficulty = difficultyService .getDifficultyForSourceAddress (siteKey , sourceAddress );
67
+ long sameSourceAddressRequestCount = getSameSourceAddressRequestCount (sourceAddress );
59
68
60
69
DistributionSummary .builder ("captcha.client.solve.time" )
61
70
.tag ("site_key" , siteKey )
62
71
.tag ("difficulty" , String .valueOf (difficulty ))
72
+ .tag ("same_source_address_request_count" , String .valueOf (sameSourceAddressRequestCount ))
63
73
.description ("Summary of the time taken by clients to solve captcha challenges" )
64
74
.baseUnit ("milliseconds" )
65
75
.register (meterRegistry )
66
76
.record (solveTime );
67
77
}
68
78
79
+ private long getSameSourceAddressRequestCount (SourceAddress sourceAddress ) {
80
+ return captchaRequestRepository .countBySourceAddressHashIgnoreCaseAndExpiresAtGreaterThanEqual (sourceAddress .getHash (), Instant .now ());
81
+ }
82
+
69
83
public void initializeInvalidatedPayloadsGauge () {
70
84
Gauge .builder ("captcha.invalidated.payloads" ,
71
85
() -> invalidatedPayloadRepository .countByExpiresAtGreaterThan (Instant .now ()))
0 commit comments