Skip to content

Commit f91f86a

Browse files
authored
Polish OTLP registry changes (#3153)
1 parent fa73543 commit f91f86a

File tree

6 files changed

+51
-28
lines changed

6 files changed

+51
-28
lines changed

implementations/micrometer-registry-otlp/src/main/java/io/micrometer/registry/otlp/OtlpConfig.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424

2525
/**
2626
* Config for {@link OtlpMeterRegistry}.
27+
*
28+
* @author Tommy Ludwig
29+
* @since 1.9.0
2730
*/
2831
public interface OtlpConfig extends PushRegistryConfig {
2932

implementations/micrometer-registry-otlp/src/main/java/io/micrometer/registry/otlp/OtlpCounter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class OtlpCounter extends CumulativeCounter implements StartTimeAwareMeter {
2828
this.startTimeNanos = TimeUnit.MILLISECONDS.toNanos(clock.wallTime());
2929
}
3030

31+
@Override
3132
public long getStartTimeNanos() {
3233
return this.startTimeNanos;
3334
}

implementations/micrometer-registry-otlp/src/main/java/io/micrometer/registry/otlp/OtlpFunctionCounter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class OtlpFunctionCounter<T> extends CumulativeFunctionCounter<T> implements Sta
3030
this.startTimeNanos = TimeUnit.MILLISECONDS.toNanos(clock.wallTime());
3131
}
3232

33+
@Override
3334
public long getStartTimeNanos() {
3435
return this.startTimeNanos;
3536
}

implementations/micrometer-registry-otlp/src/main/java/io/micrometer/registry/otlp/OtlpMeterRegistry.java

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
* Publishes meters in OTLP (OpenTelemetry Protocol) format.
5151
* HTTP with Protobuf encoding is the only option currently supported.
5252
*
53+
* @author Tommy Ludwig
5354
* @since 1.9.0
5455
*/
5556
public class OtlpMeterRegistry extends PushMeterRegistry {
@@ -219,14 +220,36 @@ Metric writeHistogramSupport(HistogramSupport histogramSupport) {
219220
Metric.Builder metricBuilder = getMetricBuilder(histogramSupport.getId());
220221
boolean isTimeBased = histogramSupport instanceof Timer || histogramSupport instanceof LongTaskTimer;
221222
HistogramSnapshot histogramSnapshot = histogramSupport.takeSnapshot();
223+
224+
Iterable<? extends KeyValue> tags = getTagsForId(histogramSupport.getId());
225+
long startTimeNanos = ((StartTimeAwareMeter) histogramSupport).getStartTimeNanos();
222226
long wallTimeNanos = TimeUnit.MILLISECONDS.toNanos(this.clock.wallTime());
227+
double total = isTimeBased ? histogramSnapshot.total(getBaseTimeUnit()) : histogramSnapshot.total();
228+
long count = histogramSnapshot.count();
229+
230+
// if percentiles configured, use summary
231+
if (histogramSnapshot.percentileValues().length != 0) {
232+
SummaryDataPoint.Builder summaryData = SummaryDataPoint.newBuilder()
233+
.addAllAttributes(tags)
234+
.setStartTimeUnixNano(startTimeNanos)
235+
.setTimeUnixNano(wallTimeNanos)
236+
.setSum(total)
237+
.setCount(count);
238+
for (ValueAtPercentile percentile : histogramSnapshot.percentileValues()) {
239+
summaryData.addQuantileValues(SummaryDataPoint.ValueAtQuantile.newBuilder()
240+
.setQuantile(percentile.percentile())
241+
.setValue(TimeUtils.convert(percentile.value(), TimeUnit.NANOSECONDS, getBaseTimeUnit())));
242+
}
243+
metricBuilder.setSummary(Summary.newBuilder().addDataPoints(summaryData));
244+
return metricBuilder.build();
245+
}
223246

224247
HistogramDataPoint.Builder histogramDataPoint = HistogramDataPoint.newBuilder()
225-
.addAllAttributes(getTagsForId(histogramSupport.getId()))
226-
.setStartTimeUnixNano(((StartTimeAwareMeter) histogramSupport).getStartTimeNanos())
248+
.addAllAttributes(tags)
249+
.setStartTimeUnixNano(startTimeNanos)
227250
.setTimeUnixNano(wallTimeNanos)
228-
.setSum(isTimeBased ? histogramSnapshot.total(getBaseTimeUnit()) : histogramSnapshot.total())
229-
.setCount(histogramSnapshot.count());
251+
.setSum(total)
252+
.setCount(count);
230253

231254
// if histogram enabled, add histogram buckets
232255
if (histogramSnapshot.histogramCounts().length != 0) {
@@ -240,22 +263,6 @@ Metric writeHistogramSupport(HistogramSupport histogramSupport) {
240263
return metricBuilder.build();
241264
}
242265

243-
// if percentiles configured, use summary
244-
if (histogramSnapshot.percentileValues().length != 0) {
245-
SummaryDataPoint.Builder summaryData = SummaryDataPoint.newBuilder()
246-
.addAllAttributes(getTagsForId(histogramSupport.getId()))
247-
.setTimeUnixNano(wallTimeNanos)
248-
.setSum(isTimeBased ? histogramSnapshot.total(getBaseTimeUnit()) : histogramSnapshot.total())
249-
.setCount(histogramSnapshot.count());
250-
for (ValueAtPercentile percentile : histogramSnapshot.percentileValues()) {
251-
summaryData.addQuantileValues(SummaryDataPoint.ValueAtQuantile.newBuilder()
252-
.setQuantile(percentile.percentile())
253-
.setValue(TimeUtils.convert(percentile.value(), TimeUnit.NANOSECONDS, getBaseTimeUnit())));
254-
}
255-
metricBuilder.setSummary(Summary.newBuilder().addDataPoints(summaryData));
256-
return metricBuilder.build();
257-
}
258-
259266
return metricBuilder.setHistogram(Histogram.newBuilder()
260267
.setAggregationTemporality(AggregationTemporality.AGGREGATION_TEMPORALITY_CUMULATIVE)
261268
.addDataPoints(histogramDataPoint)).build();
@@ -288,22 +295,23 @@ private Metric.Builder getMetricBuilder(Meter.Id id) {
288295

289296
private Iterable<? extends KeyValue> getTagsForId(Meter.Id id) {
290297
return id.getTags().stream()
291-
.map(tag -> KeyValue.newBuilder()
292-
.setKey(tag.getKey())
293-
.setValue(AnyValue.newBuilder().setStringValue(tag.getValue()).build())
294-
.build())
298+
.map(tag -> createKeyValue(tag.getKey(), tag.getValue()))
295299
.collect(Collectors.toList());
296300
}
297301

302+
private KeyValue createKeyValue(String key, String value) {
303+
return KeyValue.newBuilder().setKey(key).setValue(AnyValue.newBuilder().setStringValue(value)).build();
304+
}
305+
298306
private Iterable<KeyValue> getResourceAttributes() {
299307
List<KeyValue> attributes = new ArrayList<>();
300308
// TODO How to expose configuration of the service.name
301-
attributes.add(KeyValue.newBuilder().setKey("service.name").setValue(AnyValue.newBuilder().setStringValue("unknown_service")).build());
302-
attributes.add(KeyValue.newBuilder().setKey("telemetry.sdk.name").setValue(AnyValue.newBuilder().setStringValue("io.micrometer")).build());
303-
attributes.add(KeyValue.newBuilder().setKey("telemetry.sdk.language").setValue(AnyValue.newBuilder().setStringValue("java")).build());
309+
attributes.add(createKeyValue("service.name", "unknown_service"));
310+
attributes.add(createKeyValue("telemetry.sdk.name", "io.micrometer"));
311+
attributes.add(createKeyValue("telemetry.sdk.language", "java"));
304312
String micrometerCoreVersion = MeterRegistry.class.getPackage().getImplementationVersion();
305313
if (micrometerCoreVersion != null) {
306-
attributes.add(KeyValue.newBuilder().setKey("telemetry.sdk.version").setValue(AnyValue.newBuilder().setStringValue(MeterRegistry.class.getPackage().getImplementationVersion())).build());
314+
attributes.add(createKeyValue("telemetry.sdk.version", micrometerCoreVersion));
307315
}
308316
return attributes;
309317
}

implementations/micrometer-registry-otlp/src/test/java/io/micrometer/registry/otlp/OtlpMeterRegistryTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ void timerWithPercentiles() {
298298
"unit: \"milliseconds\"\n" +
299299
"summary {\n" +
300300
" data_points {\n" +
301+
" start_time_unix_nano: 1000000\n" +
301302
" time_unix_nano: 1000000\n" +
302303
" count: 3\n" +
303304
" sum: 198.0\n" +

micrometer-core/src/main/java/io/micrometer/core/instrument/distribution/TimeWindowFixedBoundaryHistogram.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,15 @@ public TimeWindowFixedBoundaryHistogram(Clock clock, DistributionStatisticConfig
4242
this(clock, config, supportsAggregablePercentiles, true);
4343
}
4444

45+
/**
46+
* Create a {@code TimeWindowFixedBoundaryHistogram} instance.
47+
*
48+
* @param clock clock
49+
* @param config distribution statistic configuration
50+
* @param supportsAggregablePercentiles whether it supports aggregable percentiles
51+
* @param cumulativeBucketCounts whether it uses cumulative bucket counts
52+
* @since 1.9.0
53+
*/
4554
public TimeWindowFixedBoundaryHistogram(Clock clock, DistributionStatisticConfig config, boolean supportsAggregablePercentiles,
4655
boolean cumulativeBucketCounts) {
4756
super(clock, config, FixedBoundaryHistogram.class, supportsAggregablePercentiles);

0 commit comments

Comments
 (0)