Skip to content

Commit 77a710b

Browse files
authored
Merge pull request #45744 from geoand/#45717
Add HTTP response to HttpServerMetricsTagsContributor.Context
2 parents 174290c + bd0b5e1 commit 77a710b

File tree

9 files changed

+47
-10
lines changed

9 files changed

+47
-10
lines changed

docs/src/main/asciidoc/telemetry-micrometer.adoc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,9 @@ link:https://micrometer.io/docs/concepts[official documentation].
588588

589589
=== Use `HttpServerMetricsTagsContributor` for server HTTP requests
590590

591-
By providing CDI beans that implement `io.quarkus.micrometer.runtime.HttpServerMetricsTagsContributor`, user code can contribute arbitrary tags based on the details of HTTP request
591+
By providing CDI beans that implement `io.quarkus.micrometer.runtime.HttpServerMetricsTagsContributor`, user code can contribute arbitrary tags based on the details of HTTP request and responses.
592+
593+
CAUTION: When creating tags using this interface, it's important to limit the cardinality of the values, otherwise there is a risk of severely degrading the metrics system's capacity.
592594

593595
=== Use `HttpClientMetricsTagsContributor` for client HTTP requests
594596

extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/HttpClientMetricsTagsContributor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.micrometer.core.instrument.Tags;
44
import io.micrometer.core.instrument.config.MeterFilter;
55
import io.vertx.core.spi.observability.HttpRequest;
6+
import io.vertx.core.spi.observability.HttpResponse;
67

78
/**
89
* Allows code to add additional Micrometer {@link Tags} to the metrics collected for completed HTTP client requests.
@@ -20,5 +21,7 @@ public interface HttpClientMetricsTagsContributor {
2021

2122
interface Context {
2223
HttpRequest request();
24+
25+
HttpResponse response();
2326
}
2427
}

extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/HttpServerMetricsTagsContributor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.micrometer.core.instrument.Tags;
44
import io.micrometer.core.instrument.config.MeterFilter;
55
import io.vertx.core.http.HttpServerRequest;
6+
import io.vertx.core.spi.observability.HttpResponse;
67

78
/**
89
* Allows code to add additional Micrometer {@link Tags} to the metrics collected for completed HTTP server requests.
@@ -20,5 +21,7 @@ public interface HttpServerMetricsTagsContributor {
2021

2122
interface Context {
2223
HttpServerRequest request();
24+
25+
HttpResponse response();
2326
}
2427
}

extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/binder/vertx/VertxHttpClientMetrics.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ public void responseEnd(RequestTracker tracker, long bytesRead) {
172172
.and(HttpCommonTags.status(tracker.response.statusCode()))
173173
.and(HttpCommonTags.outcome(tracker.response.statusCode()));
174174
if (!httpClientMetricsTagsContributors.isEmpty()) {
175-
HttpClientMetricsTagsContributor.Context context = new DefaultContext(tracker.request);
175+
HttpClientMetricsTagsContributor.Context context = new DefaultContext(tracker.request, tracker.response);
176176
for (int i = 0; i < httpClientMetricsTagsContributors.size(); i++) {
177177
try {
178178
Tags additionalTags = httpClientMetricsTagsContributors.get(i).contribute(context);
@@ -254,6 +254,7 @@ public String getNormalizedUriPath(Map<Pattern, String> serverMatchPatterns, Lis
254254
}
255255
}
256256

257-
private record DefaultContext(HttpRequest request) implements HttpClientMetricsTagsContributor.Context {
257+
private record DefaultContext(HttpRequest request,
258+
HttpResponse response) implements HttpClientMetricsTagsContributor.Context {
258259
}
259260
}

extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/binder/vertx/VertxHttpServerMetrics.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ public void responseEnd(HttpRequestMetric requestMetric, HttpResponse response,
205205
VertxMetricsTags.outcome(response),
206206
HttpCommonTags.status(response.statusCode()));
207207
if (!httpServerMetricsTagsContributors.isEmpty()) {
208-
HttpServerMetricsTagsContributor.Context context = new DefaultContext(requestMetric.request());
208+
HttpServerMetricsTagsContributor.Context context = new DefaultContext(requestMetric.request(), response);
209209
for (int i = 0; i < httpServerMetricsTagsContributors.size(); i++) {
210210
try {
211211
Tags additionalTags = httpServerMetricsTagsContributors.get(i).contribute(context);
@@ -258,6 +258,7 @@ public void disconnected(LongTaskTimer.Sample websocketMetric) {
258258
}
259259
}
260260

261-
private record DefaultContext(HttpServerRequest request) implements HttpServerMetricsTagsContributor.Context {
261+
private record DefaultContext(HttpServerRequest request,
262+
HttpResponse response) implements HttpServerMetricsTagsContributor.Context {
262263
}
263264
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.quarkus;
2+
3+
import jakarta.inject.Singleton;
4+
5+
import io.micrometer.core.instrument.Tags;
6+
import io.quarkus.micrometer.runtime.HttpServerMetricsTagsContributor;
7+
8+
@Singleton
9+
public class ResponseHeaderTag implements HttpServerMetricsTagsContributor {
10+
11+
@Override
12+
public Tags contribute(Context context) {
13+
var headerValue = context.response().headers().get("foo-response");
14+
String value = "UNSET";
15+
if ((headerValue != null) && !headerValue.isEmpty()) {
16+
value = headerValue;
17+
}
18+
return Tags.of("foo-response", value);
19+
}
20+
}

integration-tests/micrometer-prometheus/src/main/java/io/quarkus/it/micrometer/prometheus/FruitResource.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import jakarta.ws.rs.GET;
77
import jakarta.ws.rs.Path;
88

9+
import org.jboss.resteasy.reactive.RestResponse;
10+
911
import io.quarkus.hibernate.orm.panache.PanacheQuery;
1012
import io.smallrye.common.annotation.Blocking;
1113

@@ -26,9 +28,13 @@ public void trigger() {
2628

2729
@GET
2830
@Path("all")
29-
public void retrieveAll() {
31+
public RestResponse<Object> retrieveAll() {
3032
PanacheQuery<Fruit> query = Fruit.find(
3133
"select name from Fruit");
3234
List<Fruit> all = query.list();
35+
36+
return RestResponse.ResponseBuilder.noContent()
37+
.header("foo-response", "value")
38+
.build();
3339
}
3440
}

integration-tests/micrometer-prometheus/src/test/java/io/quarkus/it/micrometer/prometheus/ExemplarTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ void testExemplar() {
2424
when().get("/example/prime/7919").then().statusCode(200);
2525

2626
String metricMatch = "http_server_requests_seconds_count{dummy=\"value\",env=\"test\"," +
27-
"env2=\"test\",foo=\"UNSET\",method=\"GET\",outcome=\"SUCCESS\"," +
27+
"env2=\"test\",foo=\"UNSET\",foo_response=\"UNSET\",method=\"GET\",outcome=\"SUCCESS\"," +
2828
"registry=\"prometheus\",status=\"200\",uri=\"/example/prime/{number}\"} 2.0 # {span_id=\"";
2929

3030
await().atMost(5, SECONDS).untilAsserted(() -> {

integration-tests/micrometer-prometheus/src/test/java/io/quarkus/it/micrometer/prometheus/PrometheusMetricsRegistryTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,14 +134,15 @@ void testPrometheusScrapeEndpointTextPlain() {
134134
.body(containsString("outcome=\"SUCCESS\""))
135135
.body(containsString("dummy=\"value\""))
136136
.body(containsString("foo=\"bar\""))
137+
.body(containsString("foo_response=\"value\""))
137138
.body(containsString("uri=\"/message/match/{id}/{sub}\""))
138139
.body(containsString("uri=\"/message/match/{other}\""))
139140

140141
.body(containsString(
141-
"http_server_requests_seconds_count{dummy=\"value\",env=\"test\",env2=\"test\",foo=\"UNSET\",method=\"GET\",outcome=\"SUCCESS\",registry=\"prometheus\",status=\"200\",uri=\"/template/path/{value}\""))
142+
"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}\""))
142143

143144
.body(containsString(
144-
"http_server_requests_seconds_count{dummy=\"value\",env=\"test\",env2=\"test\",foo=\"UNSET\",method=\"GET\",outcome=\"SUCCESS\",registry=\"prometheus\",status=\"200\",uri=\"/root/{rootParam}/sub/{subParam}\""))
145+
"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}\""))
145146

146147
// Verify Hibernate Metrics
147148
.body(containsString(
@@ -233,7 +234,7 @@ void testPrometheusScrapeEndpointOpenMetrics() {
233234
.body(containsString("uri=\"/message/match/{other}\""))
234235

235236
.body(containsString(
236-
"http_server_requests_seconds_count{dummy=\"value\",env=\"test\",env2=\"test\",foo=\"UNSET\",method=\"GET\",outcome=\"SUCCESS\",registry=\"prometheus\",status=\"200\",uri=\"/template/path/{value}\""))
237+
"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}\""))
237238

238239
// Verify Hibernate Metrics
239240
.body(containsString(

0 commit comments

Comments
 (0)