Skip to content

Commit 6a3da41

Browse files
Add keyset metrics
1 parent 5692811 commit 6a3da41

3 files changed

Lines changed: 51 additions & 3 deletions

File tree

.trivyignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,7 @@ CVE-2025-59375 exp:2025-12-15
1010

1111
# UID2-6128
1212
CVE-2025-55163 exp:2025-10-30
13+
14+
CVE-2025-64720 exp: 2026-01-01
15+
16+
CVE-2025-65018 exp: 2026-01-01

src/main/java/com/uid2/operator/model/KeyManager.java

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.uid2.operator.model;
22

3+
import com.uid2.operator.util.Tuple;
34
import com.uid2.operator.vertx.UIDOperatorVerticle;
45
import com.uid2.shared.Const;
56
import com.uid2.shared.auth.Keyset;
67
import com.uid2.shared.model.KeysetKey;
78
import com.uid2.shared.store.IKeysetKeyStore;
89
import com.uid2.shared.store.reader.RotatingKeysetProvider;
10+
import io.micrometer.core.instrument.Counter;
11+
import io.micrometer.core.instrument.Metrics;
912
import org.slf4j.Logger;
1013
import org.slf4j.LoggerFactory;
1114

@@ -17,6 +20,10 @@
1720

1821
public class KeyManager {
1922
private static final Logger LOGGER = LoggerFactory.getLogger(KeyManager.class);
23+
private static final String SITE_KEYSET_STATUS = "site_keyset_found";
24+
private static final String FALLBACK_KEYSET_STATUS = "fallback_keyset_found";
25+
private static final String KEYSET_NOT_FOUND_STATUS = "keyset_not_found";
26+
2027
private final IKeysetKeyStore keysetKeyStore;
2128
private final RotatingKeysetProvider keysetProvider;
2229

@@ -34,12 +41,45 @@ public KeyManagerSnapshot getKeyManagerSnapshot(int siteId) {
3441
this.getDefaultKeysetBySiteId(siteId));
3542
}
3643

37-
public KeysetKey getActiveKeyBySiteIdWithFallback(int siteId, int fallbackSiteId, Instant asOf) {
44+
private void recordSiteKeysetStatusMetrics(int siteId, Boolean keysetFound, Boolean isFallback, Map<Tuple.Tuple2<String, String>, Counter> siteKeysetStatusMetrics) {
45+
String status;
46+
if (!keysetFound) {
47+
status = KEYSET_NOT_FOUND_STATUS;
48+
} else if (isFallback) {
49+
status = FALLBACK_KEYSET_STATUS;
50+
} else {
51+
status = SITE_KEYSET_STATUS;
52+
}
53+
54+
siteKeysetStatusMetrics.computeIfAbsent(
55+
new Tuple.Tuple2<>(String.valueOf(siteId), status),
56+
tuple -> Counter
57+
.builder("uid2_site_keyset_status")
58+
.description("counts site keyset status by site ID")
59+
.tags(
60+
"site_id", tuple.getItem1(),
61+
"status", tuple.getItem1()
62+
)
63+
.register(Metrics.globalRegistry)
64+
).increment();
65+
}
66+
67+
public KeysetKey getActiveKeyBySiteIdWithFallback(int siteId, int fallbackSiteId, Instant asOf, Map<Tuple.Tuple2<String, String>, Counter> siteKeysetStatusMetrics) {
68+
boolean isFallback = false;
69+
3870
KeysetKey key = getActiveKeyBySiteId(siteId, asOf);
39-
if (key == null) key = getActiveKeyBySiteId(fallbackSiteId, asOf);
71+
4072
if (key == null) {
73+
isFallback = true;
74+
key = getActiveKeyBySiteId(fallbackSiteId, asOf);
75+
}
76+
77+
if (key == null) {
78+
recordSiteKeysetStatusMetrics(siteId, false, null, siteKeysetStatusMetrics);
4179
throw new NoActiveKeyException(String.format("Cannot get active key in default keyset with SITE ID %d or %d.", siteId, fallbackSiteId));
4280
}
81+
82+
recordSiteKeysetStatusMetrics(siteId, true, isFallback, siteKeysetStatusMetrics);
4383
return key;
4484
}
4585

src/main/java/com/uid2/operator/service/EncryptedTokenEncoder.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.uid2.operator.service;
22

33
import com.uid2.operator.model.*;
4+
import com.uid2.operator.util.Tuple;
45
import com.uid2.operator.vertx.ClientInputValidationException;
56
import com.uid2.shared.Const.Data;
67
import com.uid2.shared.encryption.AesCbc;
@@ -14,17 +15,20 @@
1415

1516
import java.time.Instant;
1617
import java.util.Base64;
18+
import java.util.HashMap;
19+
import java.util.Map;
1720

1821
public class EncryptedTokenEncoder implements ITokenEncoder {
1922
private final KeyManager keyManager;
23+
private final Map<Tuple.Tuple2<String, String>, Counter> siteKeysetStatusMetrics = new HashMap<>();
2024

2125
public EncryptedTokenEncoder(KeyManager keyManager) {
2226
this.keyManager = keyManager;
2327
}
2428

2529
public byte[] encode(AdvertisingToken t, Instant asOf) {
2630
final KeysetKey masterKey = this.keyManager.getMasterKey(asOf);
27-
final KeysetKey siteEncryptionKey = this.keyManager.getActiveKeyBySiteIdWithFallback(t.publisherIdentity.siteId, Data.AdvertisingTokenSiteId, asOf);
31+
final KeysetKey siteEncryptionKey = this.keyManager.getActiveKeyBySiteIdWithFallback(t.publisherIdentity.siteId, Data.AdvertisingTokenSiteId, asOf, siteKeysetStatusMetrics);
2832

2933
return t.version == TokenVersion.V2
3034
? encodeV2(t, masterKey, siteEncryptionKey)

0 commit comments

Comments
 (0)