From 63ab0a84a2dbf85a8cf2b6f6b7106defc7d74524 Mon Sep 17 00:00:00 2001 From: Xu Yang Date: Mon, 25 Nov 2024 18:23:38 -0800 Subject: [PATCH 1/6] Update RequestCapturingHandler.java --- .../shared/vertx/RequestCapturingHandler.java | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/uid2/shared/vertx/RequestCapturingHandler.java b/src/main/java/com/uid2/shared/vertx/RequestCapturingHandler.java index 6be82bc1..94e946bb 100644 --- a/src/main/java/com/uid2/shared/vertx/RequestCapturingHandler.java +++ b/src/main/java/com/uid2/shared/vertx/RequestCapturingHandler.java @@ -4,6 +4,8 @@ import com.uid2.shared.auth.IAuthorizable; import com.uid2.shared.jmx.AdminApi; import com.uid2.shared.middleware.AuthMiddleware; +import com.uid2.shared.model.Site; +import com.uid2.shared.store.ISiteStore; import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.Metrics; import io.vertx.core.Handler; @@ -32,11 +34,17 @@ public class RequestCapturingHandler implements Handler { private Queue _capturedRequests = null; private final Map _apiMetricCounters = new HashMap<>(); private final Map _clientAppVersionCounters = new HashMap<>(); + private final ISiteStore siteStore; private static String formatRFC1123DateTime(long time) { return DateTimeFormatter.RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(time).atZone(ZONE_GMT)); } + public RequestCapturingHandler(ISiteStore siteStore) + { + this.siteStore = siteStore; + } + @Override public void handle(RoutingContext context) { if (!AdminApi.instance.getCaptureRequests() && !AdminApi.instance.getPublishApiMetrics()) { @@ -105,7 +113,17 @@ private void capture(RoutingContext context, long timestamp, String remoteClient } final Integer siteId = getSiteId(context); - incrementMetricCounter(apiContact, siteId, host, status, method, path); + + String siteName = "unknown"; + if (siteId != null) { + Site site = siteStore.getSite(siteId); + if (site != null) + { + siteName = site.getName(); + } + } + + incrementMetricCounter(apiContact, siteId, siteName, host, status, method, path); if (request.headers().contains(Const.Http.AppVersionHeader)) { incrementAppVersionCounter(apiContact, request.headers().get(Const.Http.AppVersionHeader)); @@ -196,14 +214,16 @@ private static Integer getSiteId(RoutingContext context) { return null; } - private void incrementMetricCounter(String apiContact, Integer siteId, String host, int status, HttpMethod method, String path) { + private void incrementMetricCounter(String apiContact, Integer siteId, String siteName, + String host, int status, HttpMethod method, String path) { assert apiContact != null; - String key = apiContact + "|" + siteId + "|" + host + "|" + status + "|" + method.name() + "|" + path; + String key = apiContact + "|" + siteId + "|" + siteName + "|" + host + "|" + status + "|" + method.name() + "|" + path; if (!_apiMetricCounters.containsKey(key)) { Counter counter = Counter .builder("uid2.http_requests") .description("counter for how many http requests are processed per each api contact and status code") - .tags("api_contact", apiContact, "site_id", String.valueOf(siteId), "host", host, "status", String.valueOf(status), "method", method.name(), "path", path) + .tags("api_contact", apiContact, "site_id", String.valueOf(siteId), "site_name", siteName, + "host", host, "status", String.valueOf(status), "method", method.name(), "path", path) .register(Metrics.globalRegistry); _apiMetricCounters.put(key, counter); } From 7537bb5f9e31f867daf41dfd412f25d401dae9e6 Mon Sep 17 00:00:00 2001 From: Xu Yang Date: Tue, 26 Nov 2024 15:30:22 -0800 Subject: [PATCH 2/6] update with default handler constructor --- .../shared/vertx/RequestCapturingHandler.java | 8 +++- .../vertx/RequestCapturingHandlerTest.java | 42 ++++++++++++++----- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/uid2/shared/vertx/RequestCapturingHandler.java b/src/main/java/com/uid2/shared/vertx/RequestCapturingHandler.java index 94e946bb..43422d06 100644 --- a/src/main/java/com/uid2/shared/vertx/RequestCapturingHandler.java +++ b/src/main/java/com/uid2/shared/vertx/RequestCapturingHandler.java @@ -34,12 +34,16 @@ public class RequestCapturingHandler implements Handler { private Queue _capturedRequests = null; private final Map _apiMetricCounters = new HashMap<>(); private final Map _clientAppVersionCounters = new HashMap<>(); - private final ISiteStore siteStore; + private ISiteStore siteStore; private static String formatRFC1123DateTime(long time) { return DateTimeFormatter.RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(time).atZone(ZONE_GMT)); } + public RequestCapturingHandler() + { + } + public RequestCapturingHandler(ISiteStore siteStore) { this.siteStore = siteStore; @@ -115,7 +119,7 @@ private void capture(RoutingContext context, long timestamp, String remoteClient final Integer siteId = getSiteId(context); String siteName = "unknown"; - if (siteId != null) { + if (siteId != null && siteStore != null) { Site site = siteStore.getSite(siteId); if (site != null) { diff --git a/src/test/java/com/uid2/shared/vertx/RequestCapturingHandlerTest.java b/src/test/java/com/uid2/shared/vertx/RequestCapturingHandlerTest.java index e274a319..1691b992 100644 --- a/src/test/java/com/uid2/shared/vertx/RequestCapturingHandlerTest.java +++ b/src/test/java/com/uid2/shared/vertx/RequestCapturingHandlerTest.java @@ -4,6 +4,8 @@ import com.uid2.shared.auth.ClientKey; import com.uid2.shared.auth.OperatorKey; import com.uid2.shared.middleware.AuthMiddleware; +import com.uid2.shared.model.Site; +import com.uid2.shared.store.ISiteStore; import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import io.vertx.core.Handler; @@ -14,6 +16,7 @@ import io.vertx.ext.web.client.WebClient; import io.vertx.junit5.VertxExtension; import io.vertx.junit5.VertxTestContext; +import org.assertj.core.condition.AnyOf; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -21,11 +24,17 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.Mock; +import org.mockito.Mockito; import java.time.Instant; +import java.util.HashSet; import java.util.Set; import java.util.stream.Stream; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.when; + @ExtendWith(VertxExtension.class) public class RequestCapturingHandlerTest { private static final int Port = 8080; @@ -33,16 +42,24 @@ public class RequestCapturingHandlerTest { routingContext.response().setStatusCode(200).end(); }; + private ISiteStore siteStore; + @BeforeEach public void before() { Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); Metrics.globalRegistry.add(new SimpleMeterRegistry()); + + Site site100 = new Site(100, "test-100", true); + Site site200 = new Site(200, "test-200", true); + siteStore = Mockito.mock(ISiteStore.class); + when(siteStore.getSite(100)).thenReturn(site100); + when(siteStore.getSite(200)).thenReturn(site200); } @Test public void captureSimplePath(Vertx vertx, VertxTestContext testContext) { Router router = Router.router(vertx); - router.route().handler(new RequestCapturingHandler()); + router.route().handler(new RequestCapturingHandler(siteStore)); router.get("/v1/token/generate").handler(dummyResponseHandler); vertx.createHttpServer().requestHandler(router).listen(Port, testContext.succeeding(id -> { @@ -90,7 +107,7 @@ public void captureSubRouterPath(Vertx vertx, VertxTestContext testContext) { @Test public void captureStaticPath(Vertx vertx, VertxTestContext testContext) { Router router = Router.router(vertx); - router.route().handler(new RequestCapturingHandler()); + router.route().handler(new RequestCapturingHandler(siteStore)); router.get("/static/*").handler(dummyResponseHandler); vertx.createHttpServer().requestHandler(router).listen(Port, testContext.succeeding(id -> { @@ -112,7 +129,7 @@ public void captureStaticPath(Vertx vertx, VertxTestContext testContext) { @Test public void captureUnknownPath(Vertx vertx, VertxTestContext testContext) { Router router = Router.router(vertx); - router.route().handler(new RequestCapturingHandler()); + router.route().handler(new RequestCapturingHandler(siteStore)); vertx.createHttpServer().requestHandler(router).listen(Port, testContext.succeeding(id -> { WebClient client = WebClient.create(vertx); @@ -132,9 +149,10 @@ public void captureUnknownPath(Vertx vertx, VertxTestContext testContext) { @ParameterizedTest @MethodSource("siteIdRoutingContextData") - public void getSiteIdFromRoutingContextData(String key, Object value, String siteId, Vertx vertx, VertxTestContext testContext) { + public void getSiteIdFromRoutingContextData(String key, Object value, String siteId, String siteName, + Vertx vertx, VertxTestContext testContext) { Router router = Router.router(vertx); - router.route().handler(new RequestCapturingHandler()); + router.route().handler(new RequestCapturingHandler(siteStore)); router.get("/test").handler(ctx -> { if (key != null) { ctx.put(key, value); @@ -149,6 +167,7 @@ public void getSiteIdFromRoutingContextData(String key, Object value, String sit double actual = Metrics.globalRegistry .get("uid2.http_requests") .tag("site_id", siteId) + .tag("site_name", siteName) .counter() .count(); Assertions.assertEquals(1, actual); @@ -160,11 +179,14 @@ public void getSiteIdFromRoutingContextData(String key, Object value, String sit private static Stream siteIdRoutingContextData() { // Arguments are: routing context data key, routing context data value, site ID tag. return Stream.of( - Arguments.of(Const.RoutingContextData.SiteId, 100, "100"), - Arguments.of(AuthMiddleware.API_CLIENT_PROP, new ClientKey("keyHash", "keySalt", "secret", "", Instant.MIN, Set.of(), 200, "test-key-id-1"), "200"), - Arguments.of(AuthMiddleware.API_CLIENT_PROP, new OperatorKey("test-keyHash", "test-keySalt", "name", "contact", "protocol", 0, false, "test-key-id-2"), "null"), - Arguments.of(AuthMiddleware.API_CLIENT_PROP, new OperatorKey("test-keyHash", "test-keySalt", "name", "contact", "protocol", 0, false, 300, "test-key-id-3"), "300"), - Arguments.of(null, null, "null") + Arguments.of(Const.RoutingContextData.SiteId, 100, "100", "test-100"), + Arguments.of(AuthMiddleware.API_CLIENT_PROP, new ClientKey("keyHash", "keySalt", + "secret", "", Instant.MIN, Set.of(), 200, "test-key-id-1"), "200", "test-200"), + Arguments.of(AuthMiddleware.API_CLIENT_PROP, new OperatorKey("test-keyHash", "test-keySalt", + "name", "contact", "protocol", 0, false, "test-key-id-2"), "null", "unknown"), + Arguments.of(AuthMiddleware.API_CLIENT_PROP, new OperatorKey("test-keyHash", "test-keySalt", + "name", "contact", "protocol", 0, false, 300, "test-key-id-3"), "300", "unknown"), + Arguments.of(null, null, "null", "unknown") ); } } From 27bcf5cad75f10aa5a8c863a0657cfd982b90f69 Mon Sep 17 00:00:00 2001 From: Xu Yang Date: Tue, 26 Nov 2024 16:27:14 -0800 Subject: [PATCH 3/6] update --- .../java/com/uid2/shared/vertx/RequestCapturingHandlerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/uid2/shared/vertx/RequestCapturingHandlerTest.java b/src/test/java/com/uid2/shared/vertx/RequestCapturingHandlerTest.java index 1691b992..6f0bb6f3 100644 --- a/src/test/java/com/uid2/shared/vertx/RequestCapturingHandlerTest.java +++ b/src/test/java/com/uid2/shared/vertx/RequestCapturingHandlerTest.java @@ -107,7 +107,7 @@ public void captureSubRouterPath(Vertx vertx, VertxTestContext testContext) { @Test public void captureStaticPath(Vertx vertx, VertxTestContext testContext) { Router router = Router.router(vertx); - router.route().handler(new RequestCapturingHandler(siteStore)); + router.route().handler(new RequestCapturingHandler()); router.get("/static/*").handler(dummyResponseHandler); vertx.createHttpServer().requestHandler(router).listen(Port, testContext.succeeding(id -> { From 33513f534b0f92f394869f1e9cb8fb118a91e887 Mon Sep 17 00:00:00 2001 From: Xu Yang Date: Tue, 26 Nov 2024 16:31:54 -0800 Subject: [PATCH 4/6] update --- .../shared/vertx/RequestCapturingHandlerTest.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/uid2/shared/vertx/RequestCapturingHandlerTest.java b/src/test/java/com/uid2/shared/vertx/RequestCapturingHandlerTest.java index 6f0bb6f3..2feda9e8 100644 --- a/src/test/java/com/uid2/shared/vertx/RequestCapturingHandlerTest.java +++ b/src/test/java/com/uid2/shared/vertx/RequestCapturingHandlerTest.java @@ -149,8 +149,7 @@ public void captureUnknownPath(Vertx vertx, VertxTestContext testContext) { @ParameterizedTest @MethodSource("siteIdRoutingContextData") - public void getSiteIdFromRoutingContextData(String key, Object value, String siteId, String siteName, - Vertx vertx, VertxTestContext testContext) { + public void getSiteIdFromRoutingContextData(String key, Object value, String siteId, String siteName, Vertx vertx, VertxTestContext testContext) { Router router = Router.router(vertx); router.route().handler(new RequestCapturingHandler(siteStore)); router.get("/test").handler(ctx -> { @@ -180,12 +179,9 @@ private static Stream siteIdRoutingContextData() { // Arguments are: routing context data key, routing context data value, site ID tag. return Stream.of( Arguments.of(Const.RoutingContextData.SiteId, 100, "100", "test-100"), - Arguments.of(AuthMiddleware.API_CLIENT_PROP, new ClientKey("keyHash", "keySalt", - "secret", "", Instant.MIN, Set.of(), 200, "test-key-id-1"), "200", "test-200"), - Arguments.of(AuthMiddleware.API_CLIENT_PROP, new OperatorKey("test-keyHash", "test-keySalt", - "name", "contact", "protocol", 0, false, "test-key-id-2"), "null", "unknown"), - Arguments.of(AuthMiddleware.API_CLIENT_PROP, new OperatorKey("test-keyHash", "test-keySalt", - "name", "contact", "protocol", 0, false, 300, "test-key-id-3"), "300", "unknown"), + Arguments.of(AuthMiddleware.API_CLIENT_PROP, new ClientKey("keyHash", "keySalt", "secret", "", Instant.MIN, Set.of(), 200, "test-key-id-1"), "200", "test-200"), + Arguments.of(AuthMiddleware.API_CLIENT_PROP, new OperatorKey("test-keyHash", "test-keySalt", "name", "contact", "protocol", 0, false, "test-key-id-2"), "null", "unknown"), + Arguments.of(AuthMiddleware.API_CLIENT_PROP, new OperatorKey("test-keyHash", "test-keySalt", "name", "contact", "protocol", 0, false, 300, "test-key-id-3"), "300", "unknown"), Arguments.of(null, null, "null", "unknown") ); } From 33f66aac4f0e3f5d7c757939af86de16f04445ea Mon Sep 17 00:00:00 2001 From: Xu Yang Date: Tue, 26 Nov 2024 16:34:15 -0800 Subject: [PATCH 5/6] update --- .../java/com/uid2/shared/vertx/RequestCapturingHandler.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/uid2/shared/vertx/RequestCapturingHandler.java b/src/main/java/com/uid2/shared/vertx/RequestCapturingHandler.java index 43422d06..d52f59d5 100644 --- a/src/main/java/com/uid2/shared/vertx/RequestCapturingHandler.java +++ b/src/main/java/com/uid2/shared/vertx/RequestCapturingHandler.java @@ -218,16 +218,14 @@ private static Integer getSiteId(RoutingContext context) { return null; } - private void incrementMetricCounter(String apiContact, Integer siteId, String siteName, - String host, int status, HttpMethod method, String path) { + private void incrementMetricCounter(String apiContact, Integer siteId, String siteName, String host, int status, HttpMethod method, String path) { assert apiContact != null; String key = apiContact + "|" + siteId + "|" + siteName + "|" + host + "|" + status + "|" + method.name() + "|" + path; if (!_apiMetricCounters.containsKey(key)) { Counter counter = Counter .builder("uid2.http_requests") .description("counter for how many http requests are processed per each api contact and status code") - .tags("api_contact", apiContact, "site_id", String.valueOf(siteId), "site_name", siteName, - "host", host, "status", String.valueOf(status), "method", method.name(), "path", path) + .tags("api_contact", apiContact, "site_id", String.valueOf(siteId), "site_name", siteName, "host", host, "status", String.valueOf(status), "method", method.name(), "path", path) .register(Metrics.globalRegistry); _apiMetricCounters.put(key, counter); } From fb57ffbafab6c28270c28aa0b9b096f0ee1018dd Mon Sep 17 00:00:00 2001 From: Release Workflow Date: Wed, 27 Nov 2024 23:40:37 +0000 Subject: [PATCH 6/6] [CI Pipeline] Released Snapshot version: 8.0.7-alpha-169-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 25de16f4..f72ca293 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.uid2 uid2-shared - 8.0.6 + 8.0.7-alpha-169-SNAPSHOT ${project.groupId}:${project.artifactId} Library for all the shared uid2 operations https://github.com/IABTechLab/uid2docs