Skip to content

Commit a044827

Browse files
authored
Merge pull request #44998 from cescoffier/metrics-path-param-test
2 parents c45215c + 7c3c88d commit a044827

18 files changed

+962
-19
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package io.quarkus.micrometer.deployment.binder;
2+
3+
import jakarta.inject.Inject;
4+
import jakarta.inject.Singleton;
5+
import jakarta.ws.rs.GET;
6+
import jakarta.ws.rs.Path;
7+
import jakarta.ws.rs.PathParam;
8+
import jakarta.ws.rs.core.Response;
9+
10+
import org.junit.jupiter.api.Assertions;
11+
import org.junit.jupiter.api.Test;
12+
import org.junit.jupiter.api.extension.RegisterExtension;
13+
14+
import io.micrometer.core.instrument.MeterRegistry;
15+
import io.quarkus.micrometer.test.Util;
16+
import io.quarkus.test.QuarkusUnitTest;
17+
import io.restassured.RestAssured;
18+
19+
public class HttpTagExplosionPreventionTest {
20+
@RegisterExtension
21+
static final QuarkusUnitTest config = new QuarkusUnitTest()
22+
.withConfigurationResource("test-logging.properties")
23+
.overrideConfigKey("quarkus.micrometer.binder-enabled-default", "false")
24+
.overrideConfigKey("quarkus.micrometer.binder.http-client.enabled", "true")
25+
.overrideConfigKey("quarkus.micrometer.binder.http-server.enabled", "true")
26+
.overrideConfigKey("quarkus.micrometer.binder.vertx.enabled", "true")
27+
.overrideConfigKey("pingpong/mp-rest/url", "${test.url}")
28+
.overrideConfigKey("quarkus.redis.devservices.enabled", "false")
29+
.overrideConfigKey("quarkus.micrometer.binder.http-server.suppress4xx-errors", "true")
30+
.withApplicationRoot((jar) -> jar
31+
.addClasses(Util.class,
32+
Resource.class));
33+
34+
@Inject
35+
MeterRegistry registry;
36+
37+
@Test
38+
public void test() throws Exception {
39+
RestAssured.get("/api/hello").then().statusCode(200);
40+
Util.waitForMeters(registry.find("http.server.requests").timers(), 1);
41+
Assertions.assertEquals(1, registry.find("http.server.requests").tag("uri", "/api/hello").timers().size());
42+
43+
RestAssured.get("/api/hello/foo").then().statusCode(200);
44+
Util.waitForMeters(registry.find("http.server.requests").timers(), 2);
45+
Assertions.assertEquals(1, registry.find("http.server.requests").tag("uri", "/api/hello/{message}").timers().size());
46+
47+
RestAssured.delete("/api/hello").then().statusCode(405);
48+
Util.waitForMeters(registry.find("http.server.requests").timers(), 3);
49+
Assertions.assertEquals(1, registry.find("http.server.requests").tag("uri", "UNKNOWN").timers().size());
50+
51+
RestAssured.delete("/api/hello/foo").then().statusCode(405);
52+
RestAssured.delete("/api/hello/bar").then().statusCode(405);
53+
RestAssured.delete("/api/hello/baz").then().statusCode(405);
54+
Util.waitForMeters(registry.find("http.server.requests").timers(), 6);
55+
Assertions.assertEquals(4,
56+
registry.find("http.server.requests").tag("uri", "UNKNOWN").timers().iterator().next().count());
57+
58+
for (int i = 0; i < 10; i++) {
59+
RestAssured.get("/api/failure").then().statusCode(500);
60+
RestAssured.get("/api/failure/bar" + i).then().statusCode(500);
61+
}
62+
Util.waitForMeters(registry.find("http.server.requests").timers(), 6 + 10);
63+
64+
Assertions.assertEquals(2, registry.find("http.server.requests").tag("uri", "UNKNOWN").timers().size()); // 2 different set of tags
65+
Assertions.assertEquals(1, registry.find("http.server.requests").tag("uri", "/api/failure/{message}").timers().size());
66+
}
67+
68+
@Path("/")
69+
@Singleton
70+
public static class Resource {
71+
72+
@GET
73+
@Path("api/hello/{message}")
74+
public String hello(@PathParam("message") String message) {
75+
return message;
76+
}
77+
78+
@GET
79+
@Path("api/hello/")
80+
public String hello() {
81+
return "hello";
82+
}
83+
84+
@GET
85+
@Path("api/failure")
86+
public Response failure() {
87+
return Response.status(500).build();
88+
}
89+
90+
@GET
91+
@Path("api/failure/{message}")
92+
public Response failure(@PathParam("message") String message) {
93+
return Response.status(500).build();
94+
}
95+
96+
}
97+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package io.quarkus.micrometer.deployment.pathparams;
2+
3+
import jakarta.inject.Inject;
4+
import jakarta.inject.Singleton;
5+
import jakarta.ws.rs.GET;
6+
import jakarta.ws.rs.Path;
7+
import jakarta.ws.rs.PathParam;
8+
import jakarta.ws.rs.core.Response;
9+
10+
import org.junit.jupiter.api.Assertions;
11+
import org.junit.jupiter.api.Test;
12+
import org.junit.jupiter.api.extension.RegisterExtension;
13+
14+
import io.micrometer.core.instrument.MeterRegistry;
15+
import io.quarkus.micrometer.test.Util;
16+
import io.quarkus.test.QuarkusUnitTest;
17+
import io.restassured.RestAssured;
18+
19+
public class HttpPathParamLimitWithJaxRs400Test {
20+
@RegisterExtension
21+
static final QuarkusUnitTest config = new QuarkusUnitTest()
22+
.withConfigurationResource("test-logging.properties")
23+
.overrideConfigKey("quarkus.micrometer.binder-enabled-default", "false")
24+
.overrideConfigKey("quarkus.micrometer.binder.http-client.enabled", "true")
25+
.overrideConfigKey("quarkus.micrometer.binder.http-server.enabled", "true")
26+
.overrideConfigKey("quarkus.micrometer.binder.vertx.enabled", "true")
27+
.overrideConfigKey("quarkus.redis.devservices.enabled", "false")
28+
.withApplicationRoot((jar) -> jar
29+
.addClasses(Util.class,
30+
Resource.class));
31+
32+
@Inject
33+
MeterRegistry registry;
34+
35+
public static final int COUNT = 101;
36+
37+
@Test
38+
void testWithResteasy400() throws InterruptedException {
39+
registry.clear();
40+
// Test a JAX-RS endpoint with GET /jaxrs and GET /jaxrs/{message}
41+
// Verify OK response
42+
for (int i = 0; i < COUNT; i++) {
43+
RestAssured.get("/jaxrs").then().statusCode(200);
44+
RestAssured.get("/jaxrs/foo-" + i).then().statusCode(200);
45+
}
46+
47+
// Verify metrics
48+
Util.waitForMeters(registry.find("http.server.requests").timers(), COUNT);
49+
50+
Assertions.assertEquals(COUNT, registry.find("http.server.requests")
51+
.tag("uri", "/jaxrs").timers().iterator().next().count());
52+
Assertions.assertEquals(COUNT, registry.find("http.server.requests")
53+
.tag("uri", "/jaxrs/{message}").timers().iterator().next().count());
54+
55+
// Verify method producing a 400
56+
for (int i = 0; i < COUNT; i++) {
57+
RestAssured.get("/bad").then().statusCode(400);
58+
RestAssured.get("/bad/foo-" + i).then().statusCode(400);
59+
}
60+
61+
Util.waitForMeters(registry.find("http.server.requests").timers(), COUNT * 2);
62+
63+
Assertions.assertEquals(COUNT, registry.find("http.server.requests")
64+
.tag("uri", "/bad").tag("method", "GET").timers().iterator().next().count());
65+
Assertions.assertEquals(4, registry.find("http.server.requests")
66+
.tag("method", "GET").timers().size()); // Pattern recognized
67+
68+
}
69+
70+
@Path("/")
71+
@Singleton
72+
public static class Resource {
73+
74+
@GET
75+
@Path("/jaxrs")
76+
public String jaxrs() {
77+
return "hello";
78+
}
79+
80+
@GET
81+
@Path("/jaxrs/{message}")
82+
public String jaxrsWithPathParam(@PathParam("message") String message) {
83+
return "hello " + message;
84+
}
85+
86+
@GET
87+
@Path("/bad")
88+
public Response bad() {
89+
return Response.status(400).build();
90+
}
91+
92+
@GET
93+
@Path("/bad/{message}")
94+
public Response bad(@PathParam("message") String message) {
95+
return Response.status(400).build();
96+
}
97+
98+
@GET
99+
@Path("/fail")
100+
public Response fail() {
101+
return Response.status(500).build();
102+
}
103+
104+
@GET
105+
@Path("/fail/{message}")
106+
public Response fail(@PathParam("message") String message) {
107+
return Response.status(500).build();
108+
}
109+
110+
}
111+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package io.quarkus.micrometer.deployment.pathparams;
2+
3+
import jakarta.inject.Inject;
4+
import jakarta.inject.Singleton;
5+
import jakarta.ws.rs.GET;
6+
import jakarta.ws.rs.Path;
7+
import jakarta.ws.rs.PathParam;
8+
import jakarta.ws.rs.core.Response;
9+
10+
import org.junit.jupiter.api.Assertions;
11+
import org.junit.jupiter.api.Test;
12+
import org.junit.jupiter.api.extension.RegisterExtension;
13+
14+
import io.micrometer.core.instrument.MeterRegistry;
15+
import io.quarkus.micrometer.test.Util;
16+
import io.quarkus.test.QuarkusUnitTest;
17+
import io.restassured.RestAssured;
18+
19+
public class HttpPathParamLimitWithJaxRs500Test {
20+
@RegisterExtension
21+
static final QuarkusUnitTest config = new QuarkusUnitTest()
22+
.withConfigurationResource("test-logging.properties")
23+
.overrideConfigKey("quarkus.micrometer.binder-enabled-default", "false")
24+
.overrideConfigKey("quarkus.micrometer.binder.http-client.enabled", "true")
25+
.overrideConfigKey("quarkus.micrometer.binder.http-server.enabled", "true")
26+
.overrideConfigKey("quarkus.micrometer.binder.vertx.enabled", "true")
27+
.overrideConfigKey("quarkus.redis.devservices.enabled", "false")
28+
.withApplicationRoot((jar) -> jar
29+
.addClasses(Util.class,
30+
Resource.class));
31+
32+
@Inject
33+
MeterRegistry registry;
34+
35+
public static final int COUNT = 101;
36+
37+
@Test
38+
void testWithResteasy500() throws InterruptedException {
39+
registry.clear();
40+
// Test a JAX-RS endpoint with GET /jaxrs and GET /jaxrs/{message}
41+
// Verify OK response
42+
for (int i = 0; i < COUNT; i++) {
43+
RestAssured.get("/jaxrs").then().statusCode(200);
44+
RestAssured.get("/jaxrs/foo-" + i).then().statusCode(200);
45+
}
46+
47+
// Verify metrics
48+
Util.waitForMeters(registry.find("http.server.requests").timers(), COUNT);
49+
50+
Assertions.assertEquals(COUNT, registry.find("http.server.requests")
51+
.tag("uri", "/jaxrs").timers().iterator().next().count());
52+
Assertions.assertEquals(COUNT, registry.find("http.server.requests")
53+
.tag("uri", "/jaxrs/{message}").timers().iterator().next().count());
54+
55+
// Verify method producing a 400
56+
for (int i = 0; i < COUNT; i++) {
57+
RestAssured.get("/fail").then().statusCode(500);
58+
RestAssured.get("/fail/foo-" + i).then().statusCode(500);
59+
}
60+
61+
Util.waitForMeters(registry.find("http.server.requests").timers(), COUNT * 2);
62+
63+
Assertions.assertEquals(COUNT, registry.find("http.server.requests")
64+
.tag("uri", "/fail").tag("method", "GET").timers().iterator().next().count());
65+
Assertions.assertEquals(4, registry.find("http.server.requests")
66+
.tag("method", "GET").timers().size()); // Pattern recognized
67+
}
68+
69+
@Path("/")
70+
@Singleton
71+
public static class Resource {
72+
73+
@GET
74+
@Path("/jaxrs")
75+
public String jaxrs() {
76+
return "hello";
77+
}
78+
79+
@GET
80+
@Path("/jaxrs/{message}")
81+
public String jaxrsWithPathParam(@PathParam("message") String message) {
82+
return "hello " + message;
83+
}
84+
85+
@GET
86+
@Path("/bad")
87+
public Response bad() {
88+
return Response.status(400).build();
89+
}
90+
91+
@GET
92+
@Path("/bad/{message}")
93+
public Response bad(@PathParam("message") String message) {
94+
return Response.status(400).build();
95+
}
96+
97+
@GET
98+
@Path("/fail")
99+
public Response fail() {
100+
return Response.status(500).build();
101+
}
102+
103+
@GET
104+
@Path("/fail/{message}")
105+
public Response fail(@PathParam("message") String message) {
106+
return Response.status(500).build();
107+
}
108+
109+
}
110+
}

0 commit comments

Comments
 (0)