Skip to content

Commit 88c9ae9

Browse files
committed
Merge pull request #45203 from shakuzen
* pr/45203: Polish 'Support Per-meter configuration for OtlpMetricsProperties' Support Per-meter configuration for OtlpMetricsProperties Closes gh-45203
2 parents 8f8a052 + b60cfe9 commit 88c9ae9

File tree

4 files changed

+106
-3
lines changed

4 files changed

+106
-3
lines changed

Diff for: spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsProperties.java

+47-3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.metrics.export.otlp;
1818

19+
import java.util.LinkedHashMap;
1920
import java.util.Map;
2021
import java.util.concurrent.TimeUnit;
2122

@@ -53,7 +54,7 @@ public class OtlpMetricsProperties extends StepRegistryProperties {
5354
private Map<String, String> headers;
5455

5556
/**
56-
* Histogram type to be preferred when histogram publishing is enabled.
57+
* Default histogram type when histogram publishing is enabled.
5758
*/
5859
private HistogramFlavor histogramFlavor = HistogramFlavor.EXPLICIT_BUCKET_HISTOGRAM;
5960

@@ -63,8 +64,8 @@ public class OtlpMetricsProperties extends StepRegistryProperties {
6364
private int maxScale = 20;
6465

6566
/**
66-
* Maximum number of buckets to be used for exponential histograms, if configured.
67-
* This has no effect on explicit bucket histograms.
67+
* Default maximum number of buckets to be used for exponential histograms, if
68+
* configured. This has no effect on explicit bucket histograms.
6869
*/
6970
private int maxBucketCount = 160;
7071

@@ -73,6 +74,11 @@ public class OtlpMetricsProperties extends StepRegistryProperties {
7374
*/
7475
private TimeUnit baseTimeUnit = TimeUnit.MILLISECONDS;
7576

77+
/**
78+
* Per-meter properties that can be used to override defaults.
79+
*/
80+
private Map<String, Meter> meter = new LinkedHashMap<>();
81+
7682
public String getUrl() {
7783
return this.url;
7884
}
@@ -129,4 +135,42 @@ public void setBaseTimeUnit(TimeUnit baseTimeUnit) {
129135
this.baseTimeUnit = baseTimeUnit;
130136
}
131137

138+
public Map<String, Meter> getMeter() {
139+
return this.meter;
140+
}
141+
142+
/**
143+
* Per-meter settings.
144+
*/
145+
public static class Meter {
146+
147+
/**
148+
* Maximum number of buckets to be used for exponential histograms, if configured.
149+
* This has no effect on explicit bucket histograms.
150+
*/
151+
private Integer maxBucketCount;
152+
153+
/**
154+
* Histogram type when histogram publishing is enabled.
155+
*/
156+
private HistogramFlavor histogramFlavor;
157+
158+
public Integer getMaxBucketCount() {
159+
return this.maxBucketCount;
160+
}
161+
162+
public void setMaxBucketCount(Integer maxBucketCount) {
163+
this.maxBucketCount = maxBucketCount;
164+
}
165+
166+
public HistogramFlavor getHistogramFlavor() {
167+
return this.histogramFlavor;
168+
}
169+
170+
public void setHistogramFlavor(HistogramFlavor histogramFlavor) {
171+
this.histogramFlavor = histogramFlavor;
172+
}
173+
174+
}
175+
132176
}

Diff for: spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsPropertiesConfigAdapter.java

+30
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,18 @@
2020
import java.util.LinkedHashMap;
2121
import java.util.Map;
2222
import java.util.concurrent.TimeUnit;
23+
import java.util.function.Function;
2324

2425
import io.micrometer.registry.otlp.AggregationTemporality;
2526
import io.micrometer.registry.otlp.HistogramFlavor;
2627
import io.micrometer.registry.otlp.OtlpConfig;
2728

29+
import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsProperties.Meter;
2830
import org.springframework.boot.actuate.autoconfigure.metrics.export.properties.StepRegistryPropertiesConfigAdapter;
2931
import org.springframework.boot.actuate.autoconfigure.opentelemetry.OpenTelemetryProperties;
3032
import org.springframework.boot.actuate.autoconfigure.opentelemetry.OpenTelemetryResourceAttributes;
3133
import org.springframework.core.env.Environment;
34+
import org.springframework.util.CollectionUtils;
3235

3336
/**
3437
* Adapter to convert {@link OtlpMetricsProperties} to an {@link OtlpConfig}.
@@ -88,6 +91,16 @@ public HistogramFlavor histogramFlavor() {
8891
return get(OtlpMetricsProperties::getHistogramFlavor, OtlpConfig.super::histogramFlavor);
8992
}
9093

94+
@Override
95+
public Map<String, HistogramFlavor> histogramFlavorPerMeter() {
96+
return get(perMeter(Meter::getHistogramFlavor), OtlpConfig.super::histogramFlavorPerMeter);
97+
}
98+
99+
@Override
100+
public Map<String, Integer> maxBucketsPerMeter() {
101+
return get(perMeter(Meter::getMaxBucketCount), OtlpConfig.super::maxBucketsPerMeter);
102+
}
103+
91104
@Override
92105
public int maxScale() {
93106
return get(OtlpMetricsProperties::getMaxScale, OtlpConfig.super::maxScale);
@@ -103,4 +116,21 @@ public TimeUnit baseTimeUnit() {
103116
return get(OtlpMetricsProperties::getBaseTimeUnit, OtlpConfig.super::baseTimeUnit);
104117
}
105118

119+
private <V> Function<OtlpMetricsProperties, Map<String, V>> perMeter(Function<Meter, V> getter) {
120+
return (properties) -> {
121+
if (CollectionUtils.isEmpty(properties.getMeter())) {
122+
return null;
123+
}
124+
Map<String, V> perMeter = new LinkedHashMap<>();
125+
properties.getMeter().forEach((key, meterProperties) -> {
126+
V value = getter.apply(meterProperties);
127+
if (value != null) {
128+
perMeter.put(key, value);
129+
}
130+
});
131+
return (!perMeter.isEmpty()) ? perMeter : null;
132+
};
133+
134+
}
135+
106136
}

Diff for: spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsPropertiesConfigAdapterTests.java

+28
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.junit.jupiter.api.Test;
2626

2727
import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsExportAutoConfiguration.PropertiesOtlpMetricsConnectionDetails;
28+
import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsProperties.Meter;
2829
import org.springframework.boot.actuate.autoconfigure.opentelemetry.OpenTelemetryProperties;
2930
import org.springframework.mock.env.MockEnvironment;
3031

@@ -110,6 +111,20 @@ void whenPropertiesHistogramFlavorIsSetAdapterHistogramFlavorReturnsIt() {
110111
assertThat(createAdapter().histogramFlavor()).isSameAs(HistogramFlavor.BASE2_EXPONENTIAL_BUCKET_HISTOGRAM);
111112
}
112113

114+
@Test
115+
void whenPropertiesHistogramFlavorPerMeterIsNotSetAdapterHistogramFlavorReturnsEmptyMap() {
116+
assertThat(createAdapter().histogramFlavorPerMeter()).isEmpty();
117+
}
118+
119+
@Test
120+
void whenPropertiesHistogramFlavorPerMeterIsSetAdapterHistogramFlavorPerMeterReturnsIt() {
121+
Meter meterProperties = new Meter();
122+
meterProperties.setHistogramFlavor(HistogramFlavor.BASE2_EXPONENTIAL_BUCKET_HISTOGRAM);
123+
this.properties.getMeter().put("my.histograms", meterProperties);
124+
assertThat(createAdapter().histogramFlavorPerMeter()).containsEntry("my.histograms",
125+
HistogramFlavor.BASE2_EXPONENTIAL_BUCKET_HISTOGRAM);
126+
}
127+
113128
@Test
114129
void whenPropertiesMaxScaleIsNotSetAdapterMaxScaleReturns20() {
115130
assertThat(createAdapter().maxScale()).isEqualTo(20);
@@ -132,6 +147,19 @@ void whenPropertiesMaxBucketCountIsSetAdapterMaxBucketCountReturnsIt() {
132147
assertThat(createAdapter().maxBucketCount()).isEqualTo(6);
133148
}
134149

150+
@Test
151+
void whenPropertiesMaxBucketsPerMeterIsNotSetAdapterMaxBucketsPerMeterReturnsEmptyMap() {
152+
assertThat(createAdapter().maxBucketsPerMeter()).isEmpty();
153+
}
154+
155+
@Test
156+
void whenPropertiesMaxBucketsPerMeterIsSetAdapterMaxBucketsPerMeterReturnsIt() {
157+
Meter meterProperties = new Meter();
158+
meterProperties.setMaxBucketCount(111);
159+
this.properties.getMeter().put("my.histograms", meterProperties);
160+
assertThat(createAdapter().maxBucketsPerMeter()).containsEntry("my.histograms", 111);
161+
}
162+
135163
@Test
136164
void whenPropertiesBaseTimeUnitIsNotSetAdapterBaseTimeUnitReturnsMillis() {
137165
assertThat(createAdapter().baseTimeUnit()).isSameAs(TimeUnit.MILLISECONDS);

Diff for: spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsPropertiesTests.java

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ void defaultValuesAreConsistent() {
4040
assertThat(properties.getMaxScale()).isEqualTo(config.maxScale());
4141
assertThat(properties.getMaxBucketCount()).isEqualTo(config.maxBucketCount());
4242
assertThat(properties.getBaseTimeUnit()).isSameAs(config.baseTimeUnit());
43+
assertThat(properties.getMeter()).isEmpty();
4344
}
4445

4546
}

0 commit comments

Comments
 (0)