Skip to content

Commit 26ee346

Browse files
committed
Polish 'Support OpenMetrics text format with Prometheus'
Closes gh-25564
1 parent 11b4a19 commit 26ee346

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/export/prometheus/PrometheusScrapeEndpoint.java

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,12 @@
2424

2525
import io.prometheus.client.Collector.MetricFamilySamples;
2626
import io.prometheus.client.CollectorRegistry;
27-
import io.prometheus.client.exporter.common.TextFormat;
2827

2928
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
3029
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
3130
import org.springframework.boot.actuate.endpoint.web.WebEndpointResponse;
3231
import org.springframework.boot.actuate.endpoint.web.annotation.WebEndpoint;
3332
import org.springframework.lang.Nullable;
34-
import org.springframework.util.MimeType;
3533

3634
/**
3735
* {@link Endpoint @Endpoint} that outputs metrics in a format that can be scraped by the
@@ -50,30 +48,19 @@ public PrometheusScrapeEndpoint(CollectorRegistry collectorRegistry) {
5048
this.collectorRegistry = collectorRegistry;
5149
}
5250

53-
@ReadOperation(produces = { TextFormat.CONTENT_TYPE_004, TextFormat.CONTENT_TYPE_OPENMETRICS_100 })
54-
public WebEndpointResponse<String> scrape(ProducibleTextFormat producibleTextFormat,
55-
@Nullable Set<String> includedNames) {
51+
@ReadOperation(producesFrom = TextOutputFormat.class)
52+
public WebEndpointResponse<String> scrape(TextOutputFormat format, @Nullable Set<String> includedNames) {
5653
try {
5754
Writer writer = new StringWriter();
5855
Enumeration<MetricFamilySamples> samples = (includedNames != null)
5956
? this.collectorRegistry.filteredMetricFamilySamples(includedNames)
6057
: this.collectorRegistry.metricFamilySamples();
61-
MimeType contentType = producibleTextFormat.getMimeType();
62-
if (producibleTextFormat == ProducibleTextFormat.CONTENT_TYPE_004) {
63-
TextFormat.write004(writer, samples);
64-
}
65-
else if (producibleTextFormat == ProducibleTextFormat.CONTENT_TYPE_OPENMETRICS_100) {
66-
TextFormat.writeOpenMetrics100(writer, samples);
67-
}
68-
else {
69-
throw new RuntimeException("Unsupported text format '" + producibleTextFormat.getMimeType() + "'");
70-
}
71-
return new WebEndpointResponse<>(writer.toString(), contentType);
58+
format.write(writer, samples);
59+
return new WebEndpointResponse<>(writer.toString(), format);
7260
}
7361
catch (IOException ex) {
74-
// This actually never happens since StringWriter::write() doesn't throw any
75-
// IOException
76-
throw new RuntimeException("Writing metrics failed", ex);
62+
// This actually never happens since StringWriter doesn't throw an IOException
63+
throw new IllegalStateException("Writing metrics failed", ex);
7764
}
7865
}
7966

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,39 +16,60 @@
1616

1717
package org.springframework.boot.actuate.metrics.export.prometheus;
1818

19+
import java.io.IOException;
20+
import java.io.Writer;
21+
import java.util.Enumeration;
22+
23+
import io.prometheus.client.Collector.MetricFamilySamples;
1924
import io.prometheus.client.exporter.common.TextFormat;
2025

21-
import org.springframework.boot.actuate.endpoint.http.Producible;
26+
import org.springframework.boot.actuate.endpoint.annotation.Producible;
2227
import org.springframework.util.MimeType;
2328
import org.springframework.util.MimeTypeUtils;
2429

2530
/**
26-
* A {@link Producible} for Prometheus's {@link TextFormat}.
31+
* A {@link Producible} enum for supported Prometheus {@link TextFormat}.
2732
*
2833
* @author Andy Wilkinson
2934
* @since 2.5.0
3035
*/
31-
public enum ProducibleTextFormat implements Producible<ProducibleTextFormat> {
36+
public enum TextOutputFormat implements Producible<TextOutputFormat> {
3237

3338
/**
3439
* Openmetrics text version 1.0.0.
3540
*/
36-
CONTENT_TYPE_OPENMETRICS_100(TextFormat.CONTENT_TYPE_OPENMETRICS_100),
41+
CONTENT_TYPE_OPENMETRICS_100(TextFormat.CONTENT_TYPE_OPENMETRICS_100) {
42+
43+
@Override
44+
void write(Writer writer, Enumeration<MetricFamilySamples> samples) throws IOException {
45+
TextFormat.writeOpenMetrics100(writer, samples);
46+
}
47+
48+
},
3749

3850
/**
3951
* Prometheus text version 0.0.4.
4052
*/
41-
CONTENT_TYPE_004(TextFormat.CONTENT_TYPE_004);
53+
CONTENT_TYPE_004(TextFormat.CONTENT_TYPE_004) {
54+
55+
@Override
56+
void write(Writer writer, Enumeration<MetricFamilySamples> samples) throws IOException {
57+
TextFormat.write004(writer, samples);
58+
}
59+
60+
};
4261

4362
private final MimeType mimeType;
4463

45-
ProducibleTextFormat(String mimeType) {
64+
TextOutputFormat(String mimeType) {
4665
this.mimeType = MimeTypeUtils.parseMimeType(mimeType);
4766
}
4867

4968
@Override
50-
public MimeType getMimeType() {
69+
public MimeType getProducedMimeType() {
5170
return this.mimeType;
5271
}
5372

73+
abstract void write(Writer writer, Enumeration<MetricFamilySamples> samples) throws IOException;
74+
5475
}

0 commit comments

Comments
 (0)