Skip to content

Commit b60cfe9

Browse files
committed
Polish 'Support Per-meter configuration for OtlpMetricsProperties'
See gh-45203
1 parent 6dfc8f9 commit b60cfe9

File tree

5 files changed

+73
-34
lines changed

5 files changed

+73
-34
lines changed

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

+42-26
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,6 @@ public class OtlpMetricsProperties extends StepRegistryProperties {
5858
*/
5959
private HistogramFlavor histogramFlavor = HistogramFlavor.EXPLICIT_BUCKET_HISTOGRAM;
6060

61-
/**
62-
* Per meter histogram type to be preferred when histogram publishing is enabled.
63-
*/
64-
private Map<String, HistogramFlavor> histogramFlavorPerMeter = new LinkedHashMap<>();
65-
6661
/**
6762
* Max scale to use for exponential histograms, if configured.
6863
*/
@@ -75,15 +70,14 @@ public class OtlpMetricsProperties extends StepRegistryProperties {
7570
private int maxBucketCount = 160;
7671

7772
/**
78-
* Per meter number of max buckets used for exponential histograms, if configured.
79-
* This has no effect on explicit bucket histograms.
73+
* Time unit for exported metrics.
8074
*/
81-
private Map<String, Integer> maxBucketsPerMeter = new LinkedHashMap<>();
75+
private TimeUnit baseTimeUnit = TimeUnit.MILLISECONDS;
8276

8377
/**
84-
* Time unit for exported metrics.
78+
* Per-meter properties that can be used to override defaults.
8579
*/
86-
private TimeUnit baseTimeUnit = TimeUnit.MILLISECONDS;
80+
private Map<String, Meter> meter = new LinkedHashMap<>();
8781

8882
public String getUrl() {
8983
return this.url;
@@ -117,14 +111,6 @@ public void setHistogramFlavor(HistogramFlavor histogramFlavor) {
117111
this.histogramFlavor = histogramFlavor;
118112
}
119113

120-
public Map<String, HistogramFlavor> getHistogramFlavorPerMeter() {
121-
return this.histogramFlavorPerMeter;
122-
}
123-
124-
public void setHistogramFlavorPerMeter(Map<String, HistogramFlavor> histogramFlavorPerMeter) {
125-
this.histogramFlavorPerMeter = histogramFlavorPerMeter;
126-
}
127-
128114
public int getMaxScale() {
129115
return this.maxScale;
130116
}
@@ -141,14 +127,6 @@ public void setMaxBucketCount(int maxBucketCount) {
141127
this.maxBucketCount = maxBucketCount;
142128
}
143129

144-
public Map<String, Integer> getMaxBucketsPerMeter() {
145-
return this.maxBucketsPerMeter;
146-
}
147-
148-
public void setMaxBucketsPerMeter(Map<String, Integer> maxBucketsPerMeter) {
149-
this.maxBucketsPerMeter = maxBucketsPerMeter;
150-
}
151-
152130
public TimeUnit getBaseTimeUnit() {
153131
return this.baseTimeUnit;
154132
}
@@ -157,4 +135,42 @@ public void setBaseTimeUnit(TimeUnit baseTimeUnit) {
157135
this.baseTimeUnit = baseTimeUnit;
158136
}
159137

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+
160176
}

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

+22-2
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}.
@@ -90,12 +93,12 @@ public HistogramFlavor histogramFlavor() {
9093

9194
@Override
9295
public Map<String, HistogramFlavor> histogramFlavorPerMeter() {
93-
return get(OtlpMetricsProperties::getHistogramFlavorPerMeter, OtlpConfig.super::histogramFlavorPerMeter);
96+
return get(perMeter(Meter::getHistogramFlavor), OtlpConfig.super::histogramFlavorPerMeter);
9497
}
9598

9699
@Override
97100
public Map<String, Integer> maxBucketsPerMeter() {
98-
return get(OtlpMetricsProperties::getMaxBucketsPerMeter, OtlpConfig.super::maxBucketsPerMeter);
101+
return get(perMeter(Meter::getMaxBucketCount), OtlpConfig.super::maxBucketsPerMeter);
99102
}
100103

101104
@Override
@@ -113,4 +116,21 @@ public TimeUnit baseTimeUnit() {
113116
return get(OtlpMetricsProperties::getBaseTimeUnit, OtlpConfig.super::baseTimeUnit);
114117
}
115118

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+
116136
}

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

+7-3
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

@@ -117,8 +118,9 @@ void whenPropertiesHistogramFlavorPerMeterIsNotSetAdapterHistogramFlavorReturnsE
117118

118119
@Test
119120
void whenPropertiesHistogramFlavorPerMeterIsSetAdapterHistogramFlavorPerMeterReturnsIt() {
120-
this.properties
121-
.setHistogramFlavorPerMeter(Map.of("my.histograms", HistogramFlavor.BASE2_EXPONENTIAL_BUCKET_HISTOGRAM));
121+
Meter meterProperties = new Meter();
122+
meterProperties.setHistogramFlavor(HistogramFlavor.BASE2_EXPONENTIAL_BUCKET_HISTOGRAM);
123+
this.properties.getMeter().put("my.histograms", meterProperties);
122124
assertThat(createAdapter().histogramFlavorPerMeter()).containsEntry("my.histograms",
123125
HistogramFlavor.BASE2_EXPONENTIAL_BUCKET_HISTOGRAM);
124126
}
@@ -152,7 +154,9 @@ void whenPropertiesMaxBucketsPerMeterIsNotSetAdapterMaxBucketsPerMeterReturnsEmp
152154

153155
@Test
154156
void whenPropertiesMaxBucketsPerMeterIsSetAdapterMaxBucketsPerMeterReturnsIt() {
155-
this.properties.setMaxBucketsPerMeter(Map.of("my.histograms", 111));
157+
Meter meterProperties = new Meter();
158+
meterProperties.setMaxBucketCount(111);
159+
this.properties.getMeter().put("my.histograms", meterProperties);
156160
assertThat(createAdapter().maxBucketsPerMeter()).containsEntry("my.histograms", 111);
157161
}
158162

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,10 @@ void defaultValuesAreConsistent() {
3737
assertStepRegistryDefaultValues(properties, config);
3838
assertThat(properties.getAggregationTemporality()).isSameAs(config.aggregationTemporality());
3939
assertThat(properties.getHistogramFlavor()).isSameAs(config.histogramFlavor());
40-
assertThat(properties.getHistogramFlavorPerMeter()).isEqualTo(config.histogramFlavorPerMeter());
4140
assertThat(properties.getMaxScale()).isEqualTo(config.maxScale());
4241
assertThat(properties.getMaxBucketCount()).isEqualTo(config.maxBucketCount());
43-
assertThat(properties.getMaxBucketsPerMeter()).isEqualTo(config.maxBucketsPerMeter());
4442
assertThat(properties.getBaseTimeUnit()).isSameAs(config.baseTimeUnit());
43+
assertThat(properties.getMeter()).isEmpty();
4544
}
4645

4746
}

Diff for: spring-boot-project/spring-boot-dependencies/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -1548,7 +1548,7 @@ bom {
15481548
releaseNotes("https://github.com/apache/maven-war-plugin/releases/tag/maven-war-plugin-{version}")
15491549
}
15501550
}
1551-
library("Micrometer", "1.15.0-RC1") {
1551+
library("Micrometer", "1.15.0-SNAPSHOT") {
15521552
considerSnapshots()
15531553
group("io.micrometer") {
15541554
modules = [

0 commit comments

Comments
 (0)