Skip to content

Commit d4afe3d

Browse files
committed
fix: align protobuf debug formatting with text format order
Signed-off-by: Arnab Nandy <arnab_nandy7@yahoo.com>
1 parent be2fad2 commit d4afe3d

4 files changed

Lines changed: 151 additions & 47 deletions

File tree

pom.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,9 @@
440440
<excludes>
441441
<exclude>io.prometheus.metrics.expositionformats.generated</exclude>
442442
<exclude>io.prometheus.metrics.shaded</exclude>
443+
<exclude>
444+
io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter#OpenTelemetryExporter(io.prometheus.metrics.shaded.io_opentelemetry_*.sdk.metrics.export.MetricReader)
445+
</exclude>
443446
</excludes>
444447
<breakBuildOnModifications>false</breakBuildOnModifications>
445448
<breakBuildOnBinaryIncompatibleModifications>

prometheus-metrics-exposition-formats/src/main/java/io/prometheus/metrics/expositionformats/internal/PrometheusProtobufDebugFormat.java

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,14 @@ private static void appendMetric(StringBuilder result, String indent, Metrics.Me
5858
"untyped",
5959
() -> appendUntyped(result, indent + INDENT, metric.getUntyped()));
6060
}
61+
appendScalar(result, indent, "timestamp_ms", metric.hasTimestampMs(), metric.getTimestampMs());
6162
if (metric.hasHistogram()) {
6263
appendMessage(
6364
result,
6465
indent,
6566
"histogram",
6667
() -> appendHistogram(result, indent + INDENT, metric.getHistogram()));
6768
}
68-
appendScalar(result, indent, "timestamp_ms", metric.hasTimestampMs(), metric.getTimestampMs());
6969
}
7070

7171
private static void appendLabel(StringBuilder result, String indent, Metrics.LabelPair label) {
@@ -124,22 +124,16 @@ private static void appendHistogram(
124124
StringBuilder result, String indent, Metrics.Histogram histogram) {
125125
appendScalar(
126126
result, indent, "sample_count", histogram.hasSampleCount(), histogram.getSampleCount());
127-
appendScalar(
128-
result,
129-
indent,
130-
"sample_count_float",
131-
histogram.hasSampleCountFloat(),
132-
histogram.getSampleCountFloat());
133127
appendScalar(result, indent, "sample_sum", histogram.hasSampleSum(), histogram.getSampleSum());
134128
for (Metrics.Bucket bucket : histogram.getBucketList()) {
135129
appendMessage(result, indent, "bucket", () -> appendBucket(result, indent + INDENT, bucket));
136130
}
137-
appendTimestamp(
131+
appendScalar(
138132
result,
139133
indent,
140-
"created_timestamp",
141-
histogram.hasCreatedTimestamp(),
142-
histogram.getCreatedTimestamp());
134+
"sample_count_float",
135+
histogram.hasSampleCountFloat(),
136+
histogram.getSampleCountFloat());
143137
appendScalar(result, indent, "schema", histogram.hasSchema(), histogram.getSchema());
144138
appendScalar(
145139
result,
@@ -156,10 +150,7 @@ private static void appendHistogram(
156150
histogram.getZeroCountFloat());
157151
for (Metrics.BucketSpan span : histogram.getNegativeSpanList()) {
158152
appendMessage(
159-
result,
160-
indent,
161-
"negative_span",
162-
() -> appendBucketSpan(result, indent + INDENT, span));
153+
result, indent, "negative_span", () -> appendBucketSpan(result, indent + INDENT, span));
163154
}
164155
for (int i = 0; i < histogram.getNegativeDeltaCount(); i++) {
165156
appendScalar(result, indent, "negative_delta", histogram.getNegativeDelta(i));
@@ -169,23 +160,23 @@ private static void appendHistogram(
169160
}
170161
for (Metrics.BucketSpan span : histogram.getPositiveSpanList()) {
171162
appendMessage(
172-
result,
173-
indent,
174-
"positive_span",
175-
() -> appendBucketSpan(result, indent + INDENT, span));
163+
result, indent, "positive_span", () -> appendBucketSpan(result, indent + INDENT, span));
176164
}
177165
for (int i = 0; i < histogram.getPositiveDeltaCount(); i++) {
178166
appendScalar(result, indent, "positive_delta", histogram.getPositiveDelta(i));
179167
}
180168
for (int i = 0; i < histogram.getPositiveCountCount(); i++) {
181169
appendScalar(result, indent, "positive_count", histogram.getPositiveCount(i));
182170
}
171+
appendTimestamp(
172+
result,
173+
indent,
174+
"created_timestamp",
175+
histogram.hasCreatedTimestamp(),
176+
histogram.getCreatedTimestamp());
183177
for (Metrics.Exemplar exemplar : histogram.getExemplarsList()) {
184178
appendMessage(
185-
result,
186-
indent,
187-
"exemplars",
188-
() -> appendExemplar(result, indent + INDENT, exemplar));
179+
result, indent, "exemplars", () -> appendExemplar(result, indent + INDENT, exemplar));
189180
}
190181
}
191182

@@ -196,12 +187,6 @@ private static void appendBucket(StringBuilder result, String indent, Metrics.Bu
196187
"cumulative_count",
197188
bucket.hasCumulativeCount(),
198189
bucket.getCumulativeCount());
199-
appendScalar(
200-
result,
201-
indent,
202-
"cumulative_count_float",
203-
bucket.hasCumulativeCountFloat(),
204-
bucket.getCumulativeCountFloat());
205190
appendScalar(result, indent, "upper_bound", bucket.hasUpperBound(), bucket.getUpperBound());
206191
if (bucket.hasExemplar()) {
207192
appendMessage(
@@ -210,6 +195,12 @@ private static void appendBucket(StringBuilder result, String indent, Metrics.Bu
210195
"exemplar",
211196
() -> appendExemplar(result, indent + INDENT, bucket.getExemplar()));
212197
}
198+
appendScalar(
199+
result,
200+
indent,
201+
"cumulative_count_float",
202+
bucket.hasCumulativeCountFloat(),
203+
bucket.getCumulativeCountFloat());
213204
}
214205

215206
private static void appendBucketSpan(

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

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static org.assertj.core.api.Assertions.assertThat;
44

5+
import com.google.protobuf.TextFormat;
56
import io.prometheus.metrics.config.EscapingScheme;
67
import io.prometheus.metrics.expositionformats.generated.Metrics;
78
import io.prometheus.metrics.expositionformats.internal.PrometheusProtobufWriterImpl;
@@ -42,26 +43,11 @@ void testNativeHistogramDebugString() {
4243
.build();
4344

4445
PrometheusProtobufWriterImpl writer = new PrometheusProtobufWriterImpl();
46+
Metrics.MetricFamily protobufData =
47+
writer.convert(histogram, EscapingScheme.UNDERSCORE_ESCAPING);
4548

4649
assertThat(
4750
writer.toDebugString(MetricSnapshots.of(histogram), EscapingScheme.UNDERSCORE_ESCAPING))
48-
.isEqualTo(
49-
"name: \"request_latency_seconds\"\n"
50-
+ "help: \"request latency\"\n"
51-
+ "type: HISTOGRAM\n"
52-
+ "metric {\n"
53-
+ " histogram {\n"
54-
+ " sample_count: 1\n"
55-
+ " sample_sum: 0.123\n"
56-
+ " schema: 5\n"
57-
+ " zero_threshold: 2.938735877055719E-39\n"
58-
+ " zero_count: 0\n"
59-
+ " positive_span {\n"
60-
+ " offset: -96\n"
61-
+ " length: 1\n"
62-
+ " }\n"
63-
+ " positive_delta: 1\n"
64-
+ " }\n"
65-
+ "}\n");
51+
.isEqualTo(TextFormat.printer().printToString(protobufData));
6652
}
6753
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package io.prometheus.metrics.expositionformats.internal;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import com.google.protobuf.TextFormat;
6+
import com.google.protobuf.Timestamp;
7+
import io.prometheus.metrics.expositionformats.generated.Metrics;
8+
import org.junit.jupiter.api.Test;
9+
10+
@SuppressWarnings("NonCanonicalType")
11+
class PrometheusProtobufDebugFormatTest {
12+
13+
@Test
14+
void testHistogramFieldsAreEmittedInProtobufFieldNumberOrder() throws Exception {
15+
Metrics.MetricFamily metricFamily =
16+
Metrics.MetricFamily.newBuilder()
17+
.setName("request_latency_seconds")
18+
.setHelp("request latency")
19+
.setType(Metrics.MetricType.HISTOGRAM)
20+
.addMetric(
21+
Metrics.Metric.newBuilder()
22+
.setTimestampMs(123)
23+
.setHistogram(
24+
Metrics.Histogram.newBuilder()
25+
.setSampleCountFloat(3.0)
26+
.setSampleSum(4.0)
27+
.addBucket(
28+
Metrics.Bucket.newBuilder()
29+
.setCumulativeCount(1)
30+
.setUpperBound(2.0)
31+
.setCumulativeCountFloat(1.0))
32+
.setSchema(5)
33+
.setZeroThreshold(2.938735877055719E-39)
34+
.setZeroCount(0)
35+
.addPositiveSpan(
36+
Metrics.BucketSpan.newBuilder().setOffset(-96).setLength(1))
37+
.addPositiveDelta(1)
38+
.setCreatedTimestamp(
39+
Timestamp.newBuilder().setSeconds(1000).setNanos(123000000))))
40+
.build();
41+
42+
assertThat(PrometheusProtobufDebugFormat.toDebugString(metricFamily))
43+
.isEqualTo(TextFormat.printer().printToString(metricFamily));
44+
}
45+
46+
@Test
47+
void testAllMetricTypesMatchProtobufTextFormat() throws Exception {
48+
Metrics.MetricFamily metricFamily =
49+
Metrics.MetricFamily.newBuilder()
50+
.setName("test_metric")
51+
.setHelp("test metric")
52+
.setType(Metrics.MetricType.UNTYPED)
53+
.setUnit("seconds")
54+
.addMetric(
55+
Metrics.Metric.newBuilder()
56+
.addLabel(label("path", "/Björn"))
57+
.setGauge(Metrics.Gauge.newBuilder().setValue(2.0)))
58+
.addMetric(
59+
Metrics.Metric.newBuilder()
60+
.setCounter(
61+
Metrics.Counter.newBuilder()
62+
.setValue(3.0)
63+
.setExemplar(exemplar())
64+
.setCreatedTimestamp(timestamp())))
65+
.addMetric(
66+
Metrics.Metric.newBuilder()
67+
.setSummary(
68+
Metrics.Summary.newBuilder()
69+
.setSampleCount(7)
70+
.setSampleSum(8.0)
71+
.addQuantile(
72+
Metrics.Quantile.newBuilder().setQuantile(0.99).setValue(42.0))
73+
.setCreatedTimestamp(timestamp())))
74+
.addMetric(
75+
Metrics.Metric.newBuilder().setUntyped(Metrics.Untyped.newBuilder().setValue(1.5)))
76+
.addMetric(
77+
Metrics.Metric.newBuilder()
78+
.setHistogram(
79+
Metrics.Histogram.newBuilder()
80+
.setSampleCount(3)
81+
.setSampleSum(4.0)
82+
.addBucket(
83+
Metrics.Bucket.newBuilder()
84+
.setCumulativeCount(1)
85+
.setUpperBound(2.0)
86+
.setExemplar(exemplar())
87+
.setCumulativeCountFloat(1.0))
88+
.setSampleCountFloat(3.0)
89+
.setSchema(5)
90+
.setZeroThreshold(2.938735877055719E-39)
91+
.setZeroCount(0)
92+
.setZeroCountFloat(0.0)
93+
.addNegativeSpan(
94+
Metrics.BucketSpan.newBuilder().setOffset(-96).setLength(1))
95+
.addNegativeDelta(1)
96+
.addNegativeCount(1.0)
97+
.addPositiveSpan(
98+
Metrics.BucketSpan.newBuilder().setOffset(96).setLength(1))
99+
.addPositiveDelta(1)
100+
.addPositiveCount(1.0)
101+
.setCreatedTimestamp(timestamp())
102+
.addExemplars(exemplar())))
103+
.build();
104+
105+
assertThat(PrometheusProtobufDebugFormat.toDebugString(metricFamily))
106+
.isEqualTo(TextFormat.printer().printToString(metricFamily));
107+
}
108+
109+
private static Metrics.LabelPair label(String name, String value) {
110+
return Metrics.LabelPair.newBuilder().setName(name).setValue(value).build();
111+
}
112+
113+
private static Metrics.Exemplar exemplar() {
114+
return Metrics.Exemplar.newBuilder()
115+
.addLabel(label("trace_id", "abc"))
116+
.setValue(1.0)
117+
.setTimestamp(timestamp())
118+
.build();
119+
}
120+
121+
private static Timestamp timestamp() {
122+
return Timestamp.newBuilder().setSeconds(1000).setNanos(123000000).build();
123+
}
124+
}

0 commit comments

Comments
 (0)