diff --git a/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/HttpServerMetricsTagsContributor.java b/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/HttpServerMetricsTagsContributor.java index 0dec6727f65f9..cdeeaeb62691a 100644 --- a/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/HttpServerMetricsTagsContributor.java +++ b/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/HttpServerMetricsTagsContributor.java @@ -23,5 +23,14 @@ interface Context { HttpServerRequest request(); HttpResponse response(); + + /** + * Gives access to the contextual data that was added while the HTTP request was active. + * This can be found of doing something like {@link io.smallrye.common.vertx.ContextLocals#get(String)}, + * however this method is needed because {@link io.smallrye.common.vertx.ContextLocals#get(String)} won't + * work when {@link HttpServerMetricsTagsContributor#contribute(Context)} is called as the HTTP request has + * already gone away. + */ + T requestContextLocalData(Object key); } } diff --git a/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/binder/vertx/VertxHttpServerMetrics.java b/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/binder/vertx/VertxHttpServerMetrics.java index 15b805583bbd1..ae5e62b648669 100644 --- a/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/binder/vertx/VertxHttpServerMetrics.java +++ b/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/binder/vertx/VertxHttpServerMetrics.java @@ -25,6 +25,7 @@ import io.vertx.core.http.HttpServerOptions; import io.vertx.core.http.HttpServerRequest; import io.vertx.core.http.ServerWebSocket; +import io.vertx.core.http.impl.HttpServerRequestInternal; import io.vertx.core.spi.metrics.HttpServerMetrics; import io.vertx.core.spi.observability.HttpRequest; import io.vertx.core.spi.observability.HttpResponse; @@ -269,5 +270,9 @@ public void disconnected(LongTaskTimer.Sample websocketMetric) { private record DefaultContext(HttpServerRequest request, HttpResponse response) implements HttpServerMetricsTagsContributor.Context { + @Override + public T requestContextLocalData(Object key) { + return ((HttpServerRequestInternal) request).context().getLocal(key); + } } } diff --git a/integration-tests/micrometer-prometheus/src/main/java/io/quarkus/DummyTag.java b/integration-tests/micrometer-prometheus/src/main/java/io/quarkus/ContextLocalTag.java similarity index 50% rename from integration-tests/micrometer-prometheus/src/main/java/io/quarkus/DummyTag.java rename to integration-tests/micrometer-prometheus/src/main/java/io/quarkus/ContextLocalTag.java index 572b68448b25a..035c2dec59af9 100644 --- a/integration-tests/micrometer-prometheus/src/main/java/io/quarkus/DummyTag.java +++ b/integration-tests/micrometer-prometheus/src/main/java/io/quarkus/ContextLocalTag.java @@ -6,10 +6,11 @@ import io.quarkus.micrometer.runtime.HttpServerMetricsTagsContributor; @Singleton -public class DummyTag implements HttpServerMetricsTagsContributor { +public class ContextLocalTag implements HttpServerMetricsTagsContributor { @Override public Tags contribute(Context context) { - return Tags.of("dummy", "value"); + String contextLocalData = context.requestContextLocalData("context-local"); + return Tags.of("dummy", contextLocalData != null ? contextLocalData : "value"); } } diff --git a/integration-tests/micrometer-prometheus/src/main/java/io/quarkus/it/micrometer/prometheus/PathTemplateResource.java b/integration-tests/micrometer-prometheus/src/main/java/io/quarkus/it/micrometer/prometheus/PathTemplateResource.java index f3a7e530884a5..506bbaf057ee5 100644 --- a/integration-tests/micrometer-prometheus/src/main/java/io/quarkus/it/micrometer/prometheus/PathTemplateResource.java +++ b/integration-tests/micrometer-prometheus/src/main/java/io/quarkus/it/micrometer/prometheus/PathTemplateResource.java @@ -4,10 +4,13 @@ import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; +import io.smallrye.common.vertx.ContextLocals; + @Path("template/path/{value}") public class PathTemplateResource { @GET public String get(@PathParam("value") String value) { + ContextLocals.put("context-local", "val-" + value); return "Received: " + value; } } diff --git a/integration-tests/micrometer-prometheus/src/test/java/io/quarkus/it/micrometer/prometheus/PrometheusMetricsRegistryTest.java b/integration-tests/micrometer-prometheus/src/test/java/io/quarkus/it/micrometer/prometheus/PrometheusMetricsRegistryTest.java index 5ee1d84b3927d..021b90ad84dbd 100644 --- a/integration-tests/micrometer-prometheus/src/test/java/io/quarkus/it/micrometer/prometheus/PrometheusMetricsRegistryTest.java +++ b/integration-tests/micrometer-prometheus/src/test/java/io/quarkus/it/micrometer/prometheus/PrometheusMetricsRegistryTest.java @@ -132,14 +132,14 @@ void testPrometheusScrapeEndpointTextPlain() { .body(containsString("status=\"200\",uri=\"/secured/item/{id}\"")) .body(containsString("status=\"401\",uri=\"/secured/item/{id}\"")) .body(containsString("outcome=\"SUCCESS\"")) - .body(containsString("dummy=\"value\"")) + .body(containsString("dummy=")) .body(containsString("foo=\"bar\"")) .body(containsString("foo_response=\"value\"")) .body(containsString("uri=\"/message/match/{id}/{sub}\"")) .body(containsString("uri=\"/message/match/{other}\"")) .body(containsString( - "http_server_requests_seconds_count{dummy=\"value\",env=\"test\",env2=\"test\",foo=\"UNSET\",foo_response=\"UNSET\",method=\"GET\",outcome=\"SUCCESS\",registry=\"prometheus\",status=\"200\",uri=\"/template/path/{value}\"")) + "http_server_requests_seconds_count{dummy=\"val-anything\",env=\"test\",env2=\"test\",foo=\"UNSET\",foo_response=\"UNSET\",method=\"GET\",outcome=\"SUCCESS\",registry=\"prometheus\",status=\"200\",uri=\"/template/path/{value}\"")) .body(containsString( "http_server_requests_seconds_count{dummy=\"value\",env=\"test\",env2=\"test\",foo=\"UNSET\",foo_response=\"UNSET\",method=\"GET\",outcome=\"SUCCESS\",registry=\"prometheus\",status=\"200\",uri=\"/root/{rootParam}/sub/{subParam}\"")) @@ -234,7 +234,7 @@ void testPrometheusScrapeEndpointOpenMetrics() { .body(containsString("uri=\"/message/match/{other}\"")) .body(containsString( - "http_server_requests_seconds_count{dummy=\"value\",env=\"test\",env2=\"test\",foo=\"UNSET\",foo_response=\"UNSET\",method=\"GET\",outcome=\"SUCCESS\",registry=\"prometheus\",status=\"200\",uri=\"/template/path/{value}\"")) + "http_server_requests_seconds_count{dummy=\"val-anything\",env=\"test\",env2=\"test\",foo=\"UNSET\",foo_response=\"UNSET\",method=\"GET\",outcome=\"SUCCESS\",registry=\"prometheus\",status=\"200\",uri=\"/template/path/{value}\"")) // Verify Hibernate Metrics .body(containsString(