Skip to content

Commit 81e1357

Browse files
authored
Merge pull request #50083 from geoand/#50057
Allow compression of metrics
2 parents 5252a7f + 4aec8be commit 81e1357

File tree

3 files changed

+58
-5
lines changed

3 files changed

+58
-5
lines changed

extensions/micrometer/deployment/src/test/java/io/quarkus/micrometer/deployment/export/PrometheusEnabledTest.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package io.quarkus.micrometer.deployment.export;
22

3+
import static io.restassured.RestAssured.*;
4+
import static org.hamcrest.Matchers.is;
5+
36
import java.util.Set;
47

58
import jakarta.inject.Inject;
@@ -12,7 +15,6 @@
1215
import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
1316
import io.micrometer.prometheus.PrometheusMeterRegistry;
1417
import io.quarkus.test.QuarkusUnitTest;
15-
import io.restassured.RestAssured;
1618

1719
public class PrometheusEnabledTest {
1820
@RegisterExtension
@@ -23,6 +25,7 @@ public class PrometheusEnabledTest {
2325
.overrideConfigKey("quarkus.micrometer.export.prometheus.enabled", "true")
2426
.overrideConfigKey("quarkus.micrometer.registry-enabled-default", "false")
2527
.overrideConfigKey("quarkus.redis.devservices.enabled", "false")
28+
.overrideConfigKey("quarkus.http.enable-compression", "true")
2629
.withEmptyApplication();
2730

2831
@Inject
@@ -49,16 +52,22 @@ public void testMeterRegistryPresent() {
4952
@Test
5053
public void metricsEndpoint() {
5154
// RestAssured prepends /app for us
52-
RestAssured.given()
55+
given()
5356
.accept("application/json")
5457
.get("/q/metrics")
5558
.then()
5659
.log().all()
5760
.statusCode(406);
5861

59-
RestAssured.given()
62+
given()
6063
.get("/q/metrics")
6164
.then()
6265
.statusCode(200);
66+
67+
given().header("Accept-Encoding", "gzip")
68+
.get("/q/metrics")
69+
.then()
70+
.statusCode(200)
71+
.header("content-encoding", is("gzip"));
6372
}
6473
}

extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/export/PrometheusRecorder.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.prometheus.client.exporter.common.TextFormat;
66
import io.quarkus.micrometer.runtime.export.handlers.PrometheusHandler;
77
import io.quarkus.runtime.annotations.Recorder;
8+
import io.quarkus.vertx.http.runtime.VertxHttpBuildTimeConfig;
89
import io.vertx.core.Handler;
910
import io.vertx.core.http.HttpHeaders;
1011
import io.vertx.ext.web.Route;
@@ -14,9 +15,16 @@
1415
public class PrometheusRecorder {
1516
PrometheusHandler handler;
1617

17-
public PrometheusHandler getHandler() {
18+
private final VertxHttpBuildTimeConfig vertxHttpBuildTimeConfig;
19+
20+
public PrometheusRecorder(VertxHttpBuildTimeConfig vertxHttpBuildTimeConfig) {
21+
this.vertxHttpBuildTimeConfig = vertxHttpBuildTimeConfig;
22+
}
23+
24+
public Handler<RoutingContext> getHandler() {
1825
if (handler == null) {
19-
handler = new PrometheusHandler();
26+
handler = new PrometheusHandler(vertxHttpBuildTimeConfig.enableCompression(),
27+
vertxHttpBuildTimeConfig.compressMediaTypes());
2028
}
2129

2230
return handler;

extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/export/handlers/PrometheusHandler.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package io.quarkus.micrometer.runtime.export.handlers;
22

3+
import java.util.Collections;
4+
import java.util.List;
5+
import java.util.Optional;
6+
import java.util.Set;
7+
38
import jakarta.enterprise.inject.Default;
49
import jakarta.enterprise.inject.Instance;
510
import jakarta.enterprise.inject.spi.CDI;
@@ -10,24 +15,55 @@
1015
import io.prometheus.client.exporter.common.TextFormat;
1116
import io.quarkus.arc.Arc;
1217
import io.quarkus.arc.ManagedContext;
18+
import io.quarkus.vertx.http.runtime.HttpCompressionHandler;
19+
import io.vertx.core.AsyncResult;
1320
import io.vertx.core.Handler;
1421
import io.vertx.core.buffer.Buffer;
1522
import io.vertx.core.http.HttpServerResponse;
1623
import io.vertx.ext.web.RoutingContext;
1724

1825
public class PrometheusHandler implements Handler<RoutingContext> {
1926
private static final Logger log = Logger.getLogger(PrometheusHandler.class);
27+
private final boolean enableCompression;
28+
private final Set<String> compressMediaTypes;
2029

2130
private PrometheusMeterRegistry registry;
2231

2332
private boolean setup = false;
2433

34+
public PrometheusHandler(boolean enableCompression, Optional<List<String>> compressMediaTypes) {
35+
this.enableCompression = enableCompression;
36+
this.compressMediaTypes = determineCompressMediaTypes(compressMediaTypes);
37+
}
38+
39+
private Set<String> determineCompressMediaTypes(Optional<List<String>> maybeCompressMediaTypes) {
40+
if (maybeCompressMediaTypes.isPresent()) {
41+
List<String> compressMediaTypes = maybeCompressMediaTypes.get();
42+
if (compressMediaTypes.contains("text/plain")) {
43+
return Set.of("text/plain", "application/openmetrics-text");
44+
}
45+
}
46+
return Collections.emptySet();
47+
}
48+
2549
@Override
2650
public void handle(RoutingContext routingContext) {
2751
if (!setup) {
2852
setup();
2953
}
3054

55+
if (enableCompression) {
56+
routingContext.addEndHandler(new Handler<>() {
57+
58+
@Override
59+
public void handle(AsyncResult<Void> result) {
60+
if (result.succeeded()) {
61+
HttpCompressionHandler.compressIfNeeded(routingContext, compressMediaTypes);
62+
}
63+
}
64+
});
65+
}
66+
3167
HttpServerResponse response = routingContext.response();
3268
if (registry == null) {
3369
response.setStatusCode(500)

0 commit comments

Comments
 (0)