Skip to content

Commit d915248

Browse files
authored
Xuy UI d2 2578 add site name to metrics (#351)
* Add site name to metrics, add default handler constructor and mark as deprecated
1 parent 3a7056c commit d915248

File tree

2 files changed

+55
-14
lines changed

2 files changed

+55
-14
lines changed

src/main/java/com/uid2/shared/vertx/RequestCapturingHandler.java

+27-4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.uid2.shared.auth.IAuthorizable;
55
import com.uid2.shared.jmx.AdminApi;
66
import com.uid2.shared.middleware.AuthMiddleware;
7+
import com.uid2.shared.model.Site;
8+
import com.uid2.shared.store.ISiteStore;
79
import io.micrometer.core.instrument.Counter;
810
import io.micrometer.core.instrument.Metrics;
911
import io.vertx.core.Handler;
@@ -32,11 +34,22 @@ public class RequestCapturingHandler implements Handler<RoutingContext> {
3234
private Queue<String> _capturedRequests = null;
3335
private final Map<String, Counter> _apiMetricCounters = new HashMap<>();
3436
private final Map<String, Counter> _clientAppVersionCounters = new HashMap<>();
37+
private ISiteStore siteStore;
3538

3639
private static String formatRFC1123DateTime(long time) {
3740
return DateTimeFormatter.RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(time).atZone(ZONE_GMT));
3841
}
3942

43+
@Deprecated
44+
public RequestCapturingHandler()
45+
{
46+
}
47+
48+
public RequestCapturingHandler(ISiteStore siteStore)
49+
{
50+
this.siteStore = siteStore;
51+
}
52+
4053
@Override
4154
public void handle(RoutingContext context) {
4255
if (!AdminApi.instance.getCaptureRequests() && !AdminApi.instance.getPublishApiMetrics()) {
@@ -105,7 +118,17 @@ private void capture(RoutingContext context, long timestamp, String remoteClient
105118
}
106119

107120
final Integer siteId = getSiteId(context);
108-
incrementMetricCounter(apiContact, siteId, host, status, method, path);
121+
122+
String siteName = "unknown";
123+
if (siteId != null && siteStore != null) {
124+
Site site = siteStore.getSite(siteId);
125+
if (site != null)
126+
{
127+
siteName = site.getName();
128+
}
129+
}
130+
131+
incrementMetricCounter(apiContact, siteId, siteName, host, status, method, path);
109132

110133
if (request.headers().contains(Const.Http.AppVersionHeader)) {
111134
incrementAppVersionCounter(apiContact, request.headers().get(Const.Http.AppVersionHeader));
@@ -196,14 +219,14 @@ private static Integer getSiteId(RoutingContext context) {
196219
return null;
197220
}
198221

199-
private void incrementMetricCounter(String apiContact, Integer siteId, String host, int status, HttpMethod method, String path) {
222+
private void incrementMetricCounter(String apiContact, Integer siteId, String siteName, String host, int status, HttpMethod method, String path) {
200223
assert apiContact != null;
201-
String key = apiContact + "|" + siteId + "|" + host + "|" + status + "|" + method.name() + "|" + path;
224+
String key = apiContact + "|" + siteId + "|" + siteName + "|" + host + "|" + status + "|" + method.name() + "|" + path;
202225
if (!_apiMetricCounters.containsKey(key)) {
203226
Counter counter = Counter
204227
.builder("uid2.http_requests")
205228
.description("counter for how many http requests are processed per each api contact and status code")
206-
.tags("api_contact", apiContact, "site_id", String.valueOf(siteId), "host", host, "status", String.valueOf(status), "method", method.name(), "path", path)
229+
.tags("api_contact", apiContact, "site_id", String.valueOf(siteId), "site_name", siteName, "host", host, "status", String.valueOf(status), "method", method.name(), "path", path)
207230
.register(Metrics.globalRegistry);
208231
_apiMetricCounters.put(key, counter);
209232
}

src/test/java/com/uid2/shared/vertx/RequestCapturingHandlerTest.java

+28-10
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.uid2.shared.auth.ClientKey;
55
import com.uid2.shared.auth.OperatorKey;
66
import com.uid2.shared.middleware.AuthMiddleware;
7+
import com.uid2.shared.model.Site;
8+
import com.uid2.shared.store.ISiteStore;
79
import io.micrometer.core.instrument.Metrics;
810
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
911
import io.vertx.core.Handler;
@@ -14,35 +16,50 @@
1416
import io.vertx.ext.web.client.WebClient;
1517
import io.vertx.junit5.VertxExtension;
1618
import io.vertx.junit5.VertxTestContext;
19+
import org.assertj.core.condition.AnyOf;
1720
import org.junit.jupiter.api.Assertions;
1821
import org.junit.jupiter.api.BeforeEach;
1922
import org.junit.jupiter.api.Test;
2023
import org.junit.jupiter.api.extension.ExtendWith;
2124
import org.junit.jupiter.params.ParameterizedTest;
2225
import org.junit.jupiter.params.provider.Arguments;
2326
import org.junit.jupiter.params.provider.MethodSource;
27+
import org.mockito.Mock;
28+
import org.mockito.Mockito;
2429

2530
import java.time.Instant;
31+
import java.util.HashSet;
2632
import java.util.Set;
2733
import java.util.stream.Stream;
2834

35+
import static org.mockito.ArgumentMatchers.anyInt;
36+
import static org.mockito.Mockito.when;
37+
2938
@ExtendWith(VertxExtension.class)
3039
public class RequestCapturingHandlerTest {
3140
private static final int Port = 8080;
3241
private static final Handler<RoutingContext> dummyResponseHandler = routingContext -> {
3342
routingContext.response().setStatusCode(200).end();
3443
};
3544

45+
private ISiteStore siteStore;
46+
3647
@BeforeEach
3748
public void before() {
3849
Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove);
3950
Metrics.globalRegistry.add(new SimpleMeterRegistry());
51+
52+
Site site100 = new Site(100, "test-100", true);
53+
Site site200 = new Site(200, "test-200", true);
54+
siteStore = Mockito.mock(ISiteStore.class);
55+
when(siteStore.getSite(100)).thenReturn(site100);
56+
when(siteStore.getSite(200)).thenReturn(site200);
4057
}
4158

4259
@Test
4360
public void captureSimplePath(Vertx vertx, VertxTestContext testContext) {
4461
Router router = Router.router(vertx);
45-
router.route().handler(new RequestCapturingHandler());
62+
router.route().handler(new RequestCapturingHandler(siteStore));
4663
router.get("/v1/token/generate").handler(dummyResponseHandler);
4764

4865
vertx.createHttpServer().requestHandler(router).listen(Port, testContext.succeeding(id -> {
@@ -112,7 +129,7 @@ public void captureStaticPath(Vertx vertx, VertxTestContext testContext) {
112129
@Test
113130
public void captureUnknownPath(Vertx vertx, VertxTestContext testContext) {
114131
Router router = Router.router(vertx);
115-
router.route().handler(new RequestCapturingHandler());
132+
router.route().handler(new RequestCapturingHandler(siteStore));
116133

117134
vertx.createHttpServer().requestHandler(router).listen(Port, testContext.succeeding(id -> {
118135
WebClient client = WebClient.create(vertx);
@@ -132,9 +149,9 @@ public void captureUnknownPath(Vertx vertx, VertxTestContext testContext) {
132149

133150
@ParameterizedTest
134151
@MethodSource("siteIdRoutingContextData")
135-
public void getSiteIdFromRoutingContextData(String key, Object value, String siteId, Vertx vertx, VertxTestContext testContext) {
152+
public void getSiteIdFromRoutingContextData(String key, Object value, String siteId, String siteName, Vertx vertx, VertxTestContext testContext) {
136153
Router router = Router.router(vertx);
137-
router.route().handler(new RequestCapturingHandler());
154+
router.route().handler(new RequestCapturingHandler(siteStore));
138155
router.get("/test").handler(ctx -> {
139156
if (key != null) {
140157
ctx.put(key, value);
@@ -149,6 +166,7 @@ public void getSiteIdFromRoutingContextData(String key, Object value, String sit
149166
double actual = Metrics.globalRegistry
150167
.get("uid2.http_requests")
151168
.tag("site_id", siteId)
169+
.tag("site_name", siteName)
152170
.counter()
153171
.count();
154172
Assertions.assertEquals(1, actual);
@@ -158,13 +176,13 @@ public void getSiteIdFromRoutingContextData(String key, Object value, String sit
158176
}
159177

160178
private static Stream<Arguments> siteIdRoutingContextData() {
161-
// Arguments are: routing context data key, routing context data value, site ID tag.
179+
// Arguments are: routing context data key, routing context data value, site ID tag, site Name
162180
return Stream.of(
163-
Arguments.of(Const.RoutingContextData.SiteId, 100, "100"),
164-
Arguments.of(AuthMiddleware.API_CLIENT_PROP, new ClientKey("keyHash", "keySalt", "secret", "", Instant.MIN, Set.of(), 200, "test-key-id-1"), "200"),
165-
Arguments.of(AuthMiddleware.API_CLIENT_PROP, new OperatorKey("test-keyHash", "test-keySalt", "name", "contact", "protocol", 0, false, "test-key-id-2"), "null"),
166-
Arguments.of(AuthMiddleware.API_CLIENT_PROP, new OperatorKey("test-keyHash", "test-keySalt", "name", "contact", "protocol", 0, false, 300, "test-key-id-3"), "300"),
167-
Arguments.of(null, null, "null")
181+
Arguments.of(Const.RoutingContextData.SiteId, 100, "100", "test-100"),
182+
Arguments.of(AuthMiddleware.API_CLIENT_PROP, new ClientKey("keyHash", "keySalt", "secret", "", Instant.MIN, Set.of(), 200, "test-key-id-1"), "200", "test-200"),
183+
Arguments.of(AuthMiddleware.API_CLIENT_PROP, new OperatorKey("test-keyHash", "test-keySalt", "name", "contact", "protocol", 0, false, "test-key-id-2"), "null", "unknown"),
184+
Arguments.of(AuthMiddleware.API_CLIENT_PROP, new OperatorKey("test-keyHash", "test-keySalt", "name", "contact", "protocol", 0, false, 300, "test-key-id-3"), "300", "unknown"),
185+
Arguments.of(null, null, "null", "unknown")
168186
);
169187
}
170188
}

0 commit comments

Comments
 (0)