Skip to content

Commit 315c34c

Browse files
committed
make protobuf optional
1 parent f6576ff commit 315c34c

File tree

11 files changed

+121
-58
lines changed

11 files changed

+121
-58
lines changed

prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/CounterTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
import static org.assertj.core.data.Offset.offset;
77

88
import io.prometheus.metrics.core.exemplars.ExemplarSamplerConfigTestUtil;
9-
import io.prometheus.metrics.expositionformats.PrometheusProtobufWriter;
10-
import io.prometheus.metrics.expositionformats.ProtobufUtil;
119
import io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_28_3.Metrics;
10+
import io.prometheus.metrics.expositionformats.internal.PrometheusProtobufWriterImpl;
11+
import io.prometheus.metrics.expositionformats.internal.ProtobufUtil;
1212
import io.prometheus.metrics.model.snapshots.CounterSnapshot;
1313
import io.prometheus.metrics.model.snapshots.Exemplar;
1414
import io.prometheus.metrics.model.snapshots.Label;
@@ -112,7 +112,8 @@ public void testTotalStrippedFromName() {
112112
"my_counter_seconds", "my.counter.seconds"
113113
}) {
114114
Counter counter = Counter.builder().name(name).unit(Unit.SECONDS).build();
115-
Metrics.MetricFamily protobufData = new PrometheusProtobufWriter().convert(counter.collect());
115+
Metrics.MetricFamily protobufData =
116+
new PrometheusProtobufWriterImpl().convert(counter.collect());
116117
assertThat(ProtobufUtil.shortDebugString(protobufData))
117118
.isEqualTo(
118119
"name: \"my_counter_seconds_total\" type: COUNTER metric { counter { value: 0.0 } }");

prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/HistogramTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
import io.prometheus.metrics.core.datapoints.DistributionDataPoint;
99
import io.prometheus.metrics.core.exemplars.ExemplarSamplerConfigTestUtil;
1010
import io.prometheus.metrics.expositionformats.OpenMetricsTextFormatWriter;
11-
import io.prometheus.metrics.expositionformats.PrometheusProtobufWriter;
12-
import io.prometheus.metrics.expositionformats.ProtobufUtil;
1311
import io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_28_3.Metrics;
12+
import io.prometheus.metrics.expositionformats.internal.PrometheusProtobufWriterImpl;
13+
import io.prometheus.metrics.expositionformats.internal.ProtobufUtil;
1414
import io.prometheus.metrics.model.snapshots.ClassicHistogramBucket;
1515
import io.prometheus.metrics.model.snapshots.Exemplar;
1616
import io.prometheus.metrics.model.snapshots.Exemplars;
@@ -89,7 +89,7 @@ private void run() throws NoSuchFieldException, IllegalAccessException {
8989
}
9090
}
9191
Metrics.MetricFamily protobufData =
92-
new PrometheusProtobufWriter().convert(histogram.collect());
92+
new PrometheusProtobufWriterImpl().convert(histogram.collect());
9393
String expectedWithMetadata =
9494
"name: \"test\" type: HISTOGRAM metric { histogram { " + expected + " } }";
9595
assertThat(ProtobufUtil.shortDebugString(protobufData))
@@ -940,7 +940,7 @@ public void testDefaults() throws IOException {
940940
+ "# EOF\n";
941941

942942
// protobuf
943-
Metrics.MetricFamily protobufData = new PrometheusProtobufWriter().convert(snapshot);
943+
Metrics.MetricFamily protobufData = new PrometheusProtobufWriterImpl().convert(snapshot);
944944
assertThat(ProtobufUtil.shortDebugString(protobufData)).isEqualTo(expectedProtobuf);
945945

946946
// text

prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/InfoTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
55

66
import io.prometheus.metrics.expositionformats.OpenMetricsTextFormatWriter;
7-
import io.prometheus.metrics.expositionformats.PrometheusProtobufWriter;
8-
import io.prometheus.metrics.expositionformats.ProtobufUtil;
97
import io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_28_3.Metrics;
8+
import io.prometheus.metrics.expositionformats.internal.PrometheusProtobufWriterImpl;
9+
import io.prometheus.metrics.expositionformats.internal.ProtobufUtil;
1010
import io.prometheus.metrics.model.snapshots.Labels;
1111
import io.prometheus.metrics.model.snapshots.MetricSnapshots;
1212
import io.prometheus.metrics.model.snapshots.Unit;
@@ -27,7 +27,8 @@ public void testInfoStrippedFromName() {
2727
for (String labelName : new String[] {"my.key", "my_key"}) {
2828
Info info = Info.builder().name(name).labelNames(labelName).build();
2929
info.addLabelValues("value");
30-
Metrics.MetricFamily protobufData = new PrometheusProtobufWriter().convert(info.collect());
30+
Metrics.MetricFamily protobufData =
31+
new PrometheusProtobufWriterImpl().convert(info.collect());
3132
assertThat(ProtobufUtil.shortDebugString(protobufData))
3233
.isEqualTo(
3334
"name: \"jvm_runtime_info\" type: GAUGE metric { label { name: \"my_key\" value: \"value\" } gauge { value: 1.0 } }");

prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/PrometheusScrapeHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public PrometheusScrapeHandler(PrometheusProperties config, PrometheusRegistry r
4545
this.registry = registry;
4646
this.nameFilter = makeNameFilter(config.getExporterFilterProperties());
4747
supportedFormats = new ArrayList<>(Arrays.asList("openmetrics", "text"));
48-
if (expositionFormats.getPrometheusProtobufWriter() != null) {
48+
if (expositionFormats.getPrometheusProtobufWriter().isAvailable()) {
4949
supportedFormats.add("prometheus-protobuf");
5050
}
5151
}

prometheus-metrics-exporter-pushgateway/src/main/java/io/prometheus/metrics/exporter/pushgateway/PushGateway.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import io.prometheus.metrics.config.PrometheusProperties;
77
import io.prometheus.metrics.config.PrometheusPropertiesException;
88
import io.prometheus.metrics.expositionformats.ExpositionFormatWriter;
9-
import io.prometheus.metrics.expositionformats.ExpositionFormats;
9+
import io.prometheus.metrics.expositionformats.PrometheusProtobufWriter;
1010
import io.prometheus.metrics.expositionformats.PrometheusTextFormatWriter;
1111
import io.prometheus.metrics.model.registry.Collector;
1212
import io.prometheus.metrics.model.registry.MultiCollector;
@@ -81,14 +81,17 @@ private PushGateway(
8181
this.requestHeaders = Collections.unmodifiableMap(new HashMap<>(requestHeaders));
8282
this.connectionFactory = connectionFactory;
8383
writer = getWriter(format);
84+
if (!writer.isAvailable()) {
85+
throw new RuntimeException(writer.getClass() + " is not available");
86+
}
8487
}
8588

8689
private ExpositionFormatWriter getWriter(Format format) {
8790
if (format == Format.PROMETHEUS_TEXT) {
8891
return new PrometheusTextFormatWriter(false);
8992
} else {
9093
// use reflection to avoid a compile-time dependency on the expositionformats module
91-
return ExpositionFormats.createProtobufWriter();
94+
return new PrometheusProtobufWriter();
9295
}
9396
}
9497

prometheus-metrics-exposition-formats/src/main/java/io/prometheus/metrics/expositionformats/PrometheusProtobufWriter.java renamed to prometheus-metrics-exposition-formats/src/main/java/io/prometheus/metrics/expositionformats/internal/PrometheusProtobufWriterImpl.java

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
package io.prometheus.metrics.expositionformats;
1+
package io.prometheus.metrics.expositionformats.internal;
22

3-
import static io.prometheus.metrics.expositionformats.ProtobufUtil.timestampFromMillis;
3+
import static io.prometheus.metrics.expositionformats.internal.ProtobufUtil.timestampFromMillis;
44

55
import com.google.protobuf.TextFormat;
6+
import io.prometheus.metrics.expositionformats.ExpositionFormatWriter;
67
import io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_28_3.Metrics;
78
import io.prometheus.metrics.model.snapshots.ClassicHistogramBuckets;
89
import io.prometheus.metrics.model.snapshots.CounterSnapshot;
@@ -24,30 +25,16 @@
2425
import java.io.IOException;
2526
import java.io.OutputStream;
2627

27-
/**
28-
* Write the Prometheus protobuf format as defined in <a
29-
* href="https://github.com/prometheus/client_model/tree/master/io/prometheus/client">github.com/prometheus/client_model</a>.
30-
*
31-
* <p>As of today, this is the only exposition format that supports native histograms.
32-
*/
33-
public class PrometheusProtobufWriter implements ExpositionFormatWriter {
34-
35-
public static final String CONTENT_TYPE =
36-
"application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited";
28+
public class PrometheusProtobufWriterImpl implements ExpositionFormatWriter {
3729

3830
@Override
3931
public boolean accepts(String acceptHeader) {
40-
if (acceptHeader == null) {
41-
return false;
42-
} else {
43-
return acceptHeader.contains("application/vnd.google.protobuf")
44-
&& acceptHeader.contains("proto=io.prometheus.client.MetricFamily");
45-
}
32+
throw new IllegalStateException("use PrometheusProtobufWriter instead");
4633
}
4734

4835
@Override
4936
public String getContentType() {
50-
return CONTENT_TYPE;
37+
throw new IllegalStateException("use PrometheusProtobufWriter instead");
5138
}
5239

5340
@Override

prometheus-metrics-exposition-formats/src/main/java/io/prometheus/metrics/expositionformats/ProtobufUtil.java renamed to prometheus-metrics-exposition-formats/src/main/java/io/prometheus/metrics/expositionformats/internal/ProtobufUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.prometheus.metrics.expositionformats;
1+
package io.prometheus.metrics.expositionformats.internal;
22

33
import com.google.protobuf.MessageOrBuilder;
44
import com.google.protobuf.TextFormat;

prometheus-metrics-exposition-formats/src/test/java/io/prometheus/metrics/expositionformats/ExpositionFormatsTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import static org.assertj.core.api.Assertions.assertThat;
44

55
import io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_28_3.Metrics;
6+
import io.prometheus.metrics.expositionformats.internal.PrometheusProtobufWriterImpl;
7+
import io.prometheus.metrics.expositionformats.internal.ProtobufUtil;
68
import io.prometheus.metrics.model.snapshots.ClassicHistogramBuckets;
79
import io.prometheus.metrics.model.snapshots.CounterSnapshot;
810
import io.prometheus.metrics.model.snapshots.CounterSnapshot.CounterDataPointSnapshot;
@@ -2658,7 +2660,7 @@ private void assertPrometheusTextWithoutCreated(String expected, MetricSnapshot
26582660
}
26592661

26602662
private void assertPrometheusProtobuf(String expected, MetricSnapshot snapshot) {
2661-
PrometheusProtobufWriter writer = new PrometheusProtobufWriter();
2663+
PrometheusProtobufWriterImpl writer = new PrometheusProtobufWriterImpl();
26622664
Metrics.MetricFamily protobufData = writer.convert(snapshot);
26632665
String actual = ProtobufUtil.shortDebugString(protobufData);
26642666
assertThat(actual).isEqualTo(expected);

prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/ExpositionFormatWriter.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,11 @@ default String toDebugString(MetricSnapshots metricSnapshots) {
2222
}
2323

2424
String getContentType();
25+
26+
/**
27+
* Returns true if the writer is available. If false, the writer will throw an exception if used.
28+
*/
29+
default boolean isAvailable() {
30+
return true;
31+
}
2532
}

prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/ExpositionFormats.java

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,17 @@
22

33
import io.prometheus.metrics.config.ExporterProperties;
44
import io.prometheus.metrics.config.PrometheusProperties;
5-
import javax.annotation.Nullable;
65

76
public class ExpositionFormats {
87

9-
@Nullable private final ExpositionFormatWriter prometheusProtobufWriter;
10-
private final ExpositionFormatWriter prometheusTextFormatWriter;
11-
private final ExpositionFormatWriter openMetricsTextFormatWriter;
8+
private final PrometheusProtobufWriter prometheusProtobufWriter;
9+
private final PrometheusTextFormatWriter prometheusTextFormatWriter;
10+
private final OpenMetricsTextFormatWriter openMetricsTextFormatWriter;
1211

1312
private ExpositionFormats(
14-
ExpositionFormatWriter prometheusProtobufWriter,
15-
ExpositionFormatWriter prometheusTextFormatWriter,
16-
ExpositionFormatWriter openMetricsTextFormatWriter) {
13+
PrometheusProtobufWriter prometheusProtobufWriter,
14+
PrometheusTextFormatWriter prometheusTextFormatWriter,
15+
OpenMetricsTextFormatWriter openMetricsTextFormatWriter) {
1716
this.prometheusProtobufWriter = prometheusProtobufWriter;
1817
this.prometheusTextFormatWriter = prometheusTextFormatWriter;
1918
this.openMetricsTextFormatWriter = openMetricsTextFormatWriter;
@@ -25,25 +24,12 @@ public static ExpositionFormats init() {
2524

2625
public static ExpositionFormats init(ExporterProperties properties) {
2726
return new ExpositionFormats(
28-
createProtobufWriter(),
27+
new PrometheusProtobufWriter(),
2928
new PrometheusTextFormatWriter(properties.getIncludeCreatedTimestamps()),
3029
new OpenMetricsTextFormatWriter(
3130
properties.getIncludeCreatedTimestamps(), properties.getExemplarsOnAllMetricTypes()));
3231
}
3332

34-
@Nullable
35-
public static ExpositionFormatWriter createProtobufWriter() {
36-
try {
37-
return Class.forName("io.prometheus.metrics.expositionformats.PrometheusProtobufWriter")
38-
.asSubclass(ExpositionFormatWriter.class)
39-
.getDeclaredConstructor()
40-
.newInstance();
41-
} catch (Exception e) {
42-
// not in classpath
43-
return null;
44-
}
45-
}
46-
4733
public ExpositionFormatWriter findWriter(String acceptHeader) {
4834
if (prometheusProtobufWriter.accepts(acceptHeader)) {
4935
return prometheusProtobufWriter;
@@ -54,15 +40,15 @@ public ExpositionFormatWriter findWriter(String acceptHeader) {
5440
return prometheusTextFormatWriter;
5541
}
5642

57-
public ExpositionFormatWriter getPrometheusProtobufWriter() {
43+
public PrometheusProtobufWriter getPrometheusProtobufWriter() {
5844
return prometheusProtobufWriter;
5945
}
6046

61-
public ExpositionFormatWriter getPrometheusTextFormatWriter() {
47+
public PrometheusTextFormatWriter getPrometheusTextFormatWriter() {
6248
return prometheusTextFormatWriter;
6349
}
6450

65-
public ExpositionFormatWriter getOpenMetricsTextFormatWriter() {
51+
public OpenMetricsTextFormatWriter getOpenMetricsTextFormatWriter() {
6652
return openMetricsTextFormatWriter;
6753
}
6854
}

0 commit comments

Comments
 (0)