diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsProperties.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsProperties.java index bcda23c88c65..139ff2fd353c 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsProperties.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsProperties.java @@ -16,6 +16,7 @@ package org.springframework.boot.actuate.autoconfigure.metrics.export.otlp; +import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -53,21 +54,32 @@ public class OtlpMetricsProperties extends StepRegistryProperties { private Map headers; /** - * Histogram type to be preferred when histogram publishing is enabled. + * Default histogram type when histogram publishing is enabled. */ private HistogramFlavor histogramFlavor = HistogramFlavor.EXPLICIT_BUCKET_HISTOGRAM; + /** + * Per meter histogram type to be preferred when histogram publishing is enabled. + */ + private Map histogramFlavorPerMeter = new LinkedHashMap<>(); + /** * Max scale to use for exponential histograms, if configured. */ private int maxScale = 20; /** - * Maximum number of buckets to be used for exponential histograms, if configured. - * This has no effect on explicit bucket histograms. + * Default maximum number of buckets to be used for exponential histograms, if + * configured. This has no effect on explicit bucket histograms. */ private int maxBucketCount = 160; + /** + * Per meter number of max buckets used for exponential histograms, if configured. + * This has no effect on explicit bucket histograms. + */ + private Map maxBucketsPerMeter = new LinkedHashMap<>(); + /** * Time unit for exported metrics. */ @@ -105,6 +117,14 @@ public void setHistogramFlavor(HistogramFlavor histogramFlavor) { this.histogramFlavor = histogramFlavor; } + public Map getHistogramFlavorPerMeter() { + return this.histogramFlavorPerMeter; + } + + public void setHistogramFlavorPerMeter(Map histogramFlavorPerMeter) { + this.histogramFlavorPerMeter = histogramFlavorPerMeter; + } + public int getMaxScale() { return this.maxScale; } @@ -121,6 +141,14 @@ public void setMaxBucketCount(int maxBucketCount) { this.maxBucketCount = maxBucketCount; } + public Map getMaxBucketsPerMeter() { + return this.maxBucketsPerMeter; + } + + public void setMaxBucketsPerMeter(Map maxBucketsPerMeter) { + this.maxBucketsPerMeter = maxBucketsPerMeter; + } + public TimeUnit getBaseTimeUnit() { return this.baseTimeUnit; } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsPropertiesConfigAdapter.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsPropertiesConfigAdapter.java index 8ad40855835f..abb1178f6bb2 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsPropertiesConfigAdapter.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsPropertiesConfigAdapter.java @@ -88,6 +88,16 @@ public HistogramFlavor histogramFlavor() { return get(OtlpMetricsProperties::getHistogramFlavor, OtlpConfig.super::histogramFlavor); } + @Override + public Map histogramFlavorPerMeter() { + return get(OtlpMetricsProperties::getHistogramFlavorPerMeter, OtlpConfig.super::histogramFlavorPerMeter); + } + + @Override + public Map maxBucketsPerMeter() { + return get(OtlpMetricsProperties::getMaxBucketsPerMeter, OtlpConfig.super::maxBucketsPerMeter); + } + @Override public int maxScale() { return get(OtlpMetricsProperties::getMaxScale, OtlpConfig.super::maxScale); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsPropertiesConfigAdapterTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsPropertiesConfigAdapterTests.java index cd067216b177..723202318a43 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsPropertiesConfigAdapterTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsPropertiesConfigAdapterTests.java @@ -110,6 +110,19 @@ void whenPropertiesHistogramFlavorIsSetAdapterHistogramFlavorReturnsIt() { assertThat(createAdapter().histogramFlavor()).isSameAs(HistogramFlavor.BASE2_EXPONENTIAL_BUCKET_HISTOGRAM); } + @Test + void whenPropertiesHistogramFlavorPerMeterIsNotSetAdapterHistogramFlavorReturnsEmptyMap() { + assertThat(createAdapter().histogramFlavorPerMeter()).isEmpty(); + } + + @Test + void whenPropertiesHistogramFlavorPerMeterIsSetAdapterHistogramFlavorPerMeterReturnsIt() { + this.properties + .setHistogramFlavorPerMeter(Map.of("my.histograms", HistogramFlavor.BASE2_EXPONENTIAL_BUCKET_HISTOGRAM)); + assertThat(createAdapter().histogramFlavorPerMeter()).containsEntry("my.histograms", + HistogramFlavor.BASE2_EXPONENTIAL_BUCKET_HISTOGRAM); + } + @Test void whenPropertiesMaxScaleIsNotSetAdapterMaxScaleReturns20() { assertThat(createAdapter().maxScale()).isEqualTo(20); @@ -132,6 +145,17 @@ void whenPropertiesMaxBucketCountIsSetAdapterMaxBucketCountReturnsIt() { assertThat(createAdapter().maxBucketCount()).isEqualTo(6); } + @Test + void whenPropertiesMaxBucketsPerMeterIsNotSetAdapterMaxBucketsPerMeterReturnsEmptyMap() { + assertThat(createAdapter().maxBucketsPerMeter()).isEmpty(); + } + + @Test + void whenPropertiesMaxBucketsPerMeterIsSetAdapterMaxBucketsPerMeterReturnsIt() { + this.properties.setMaxBucketsPerMeter(Map.of("my.histograms", 111)); + assertThat(createAdapter().maxBucketsPerMeter()).containsEntry("my.histograms", 111); + } + @Test void whenPropertiesBaseTimeUnitIsNotSetAdapterBaseTimeUnitReturnsMillis() { assertThat(createAdapter().baseTimeUnit()).isSameAs(TimeUnit.MILLISECONDS); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsPropertiesTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsPropertiesTests.java index d4938491e75b..843c5fd3aa0b 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsPropertiesTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsPropertiesTests.java @@ -37,8 +37,10 @@ void defaultValuesAreConsistent() { assertStepRegistryDefaultValues(properties, config); assertThat(properties.getAggregationTemporality()).isSameAs(config.aggregationTemporality()); assertThat(properties.getHistogramFlavor()).isSameAs(config.histogramFlavor()); + assertThat(properties.getHistogramFlavorPerMeter()).isEqualTo(config.histogramFlavorPerMeter()); assertThat(properties.getMaxScale()).isEqualTo(config.maxScale()); assertThat(properties.getMaxBucketCount()).isEqualTo(config.maxBucketCount()); + assertThat(properties.getMaxBucketsPerMeter()).isEqualTo(config.maxBucketsPerMeter()); assertThat(properties.getBaseTimeUnit()).isSameAs(config.baseTimeUnit()); } diff --git a/spring-boot-project/spring-boot-dependencies/build.gradle b/spring-boot-project/spring-boot-dependencies/build.gradle index 57a733fddd41..8051eca6fd89 100644 --- a/spring-boot-project/spring-boot-dependencies/build.gradle +++ b/spring-boot-project/spring-boot-dependencies/build.gradle @@ -1548,7 +1548,7 @@ bom { releaseNotes("https://github.com/apache/maven-war-plugin/releases/tag/maven-war-plugin-{version}") } } - library("Micrometer", "1.15.0-SNAPSHOT") { + library("Micrometer", "1.15.0-RC1") { considerSnapshots() group("io.micrometer") { modules = [