diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsProperties.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsProperties.java index f3ac7fb53f..61583ff424 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsProperties.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsProperties.java @@ -30,7 +30,6 @@ import org.springframework.boot.context.properties.NestedConfigurationProperty; * @author Jon Schneider * @author Alexander Abramov * @author Tadaya Tsuyukubo - * @author Leo Li * @since 2.0.0 */ @ConfigurationProperties("management.metrics") @@ -299,16 +298,16 @@ public class MetricsProperties { private final Map maximumExpectedValue = new LinkedHashMap<>(); /** - * Specific statistic's expiry for meter IDs starting-with the specified name. - * Values should be a Duration value, the key `all` can also be used to configure - * all meters. + * Maximum amount of time that samples for meter IDs starting with the specified + * name are accumulated to decaying distribution statistics before they are reset + * and rotated. The longest match wins, the key `all` can also be used to + * configure all meters. */ private final Map expiry = new LinkedHashMap<>(); /** - * Specific statistic's bufferLength for meter IDs starting-with the specified - * name. Samples are accumulated to statistics in ring buffers, and bufferLength - * is the number to keep in the ring buffer, the key `all` can also be used to + * Number of histograms for meter IDs starting with the specified name to keep in + * the ring buffer. The longest match wins, the key `all` can also be used to * configure all meters. */ private final Map bufferLength = new LinkedHashMap<>(); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/PropertiesMeterFilter.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/PropertiesMeterFilter.java index 528352404d..88e7d8dece 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/PropertiesMeterFilter.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/PropertiesMeterFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,7 +42,6 @@ import org.springframework.util.StringUtils; * @author Stephane Nicoll * @author Artsiom Yudovin * @author Alexander Abramov - * @author Leo Li * @since 2.0.0 */ public class PropertiesMeterFilter implements MeterFilter { @@ -84,15 +83,14 @@ public class PropertiesMeterFilter implements MeterFilter { return DistributionStatisticConfig.builder() .percentilesHistogram(lookupWithFallbackToAll(distribution.getPercentilesHistogram(), id, null)) .percentiles(lookupWithFallbackToAll(distribution.getPercentiles(), id, null)) - .expiry(lookupWithFallbackToAll(distribution.getExpiry(), id, null)) - .bufferLength(lookupWithFallbackToAll(distribution.getBufferLength(), id, null)) .serviceLevelObjectives( convertServiceLevelObjectives(id.getType(), lookup(distribution.getSlo(), id, null))) .minimumExpectedValue( convertMeterValue(id.getType(), lookup(distribution.getMinimumExpectedValue(), id, null))) .maximumExpectedValue( convertMeterValue(id.getType(), lookup(distribution.getMaximumExpectedValue(), id, null))) - .build().merge(config); + .expiry(lookupWithFallbackToAll(distribution.getExpiry(), id, null)) + .bufferLength(lookupWithFallbackToAll(distribution.getBufferLength(), id, null)).build().merge(config); } private double[] convertServiceLevelObjectives(Meter.Type meterType, ServiceLevelObjectiveBoundary[] slo) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/PropertiesMeterFilterTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/PropertiesMeterFilterTests.java index 0e375e29eb..b8a748b966 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/PropertiesMeterFilterTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/PropertiesMeterFilterTests.java @@ -309,7 +309,7 @@ class PropertiesMeterFilterTests { @Test void configureWhenHasBufferLengthShouldSetBufferLengthToValue() { PropertiesMeterFilter filter = new PropertiesMeterFilter( - createProperties("distribution.bufferLength[spring.boot]=3")); + createProperties("distribution.buffer-length.spring.boot=3")); assertThat( filter.configure(createMeterId("spring.boot"), DistributionStatisticConfig.DEFAULT).getBufferLength()) .isEqualTo(3); @@ -318,7 +318,7 @@ class PropertiesMeterFilterTests { @Test void configureWhenHasHigherBufferLengthShouldSetBufferLengthToValue() { PropertiesMeterFilter filter = new PropertiesMeterFilter( - createProperties("distribution.bufferLength.spring=3")); + createProperties("distribution.buffer-length.spring=3")); assertThat( filter.configure(createMeterId("spring.boot"), DistributionStatisticConfig.DEFAULT).getBufferLength()) .isEqualTo(3); @@ -327,7 +327,7 @@ class PropertiesMeterFilterTests { @Test void configureWhenHasHigherBufferLengthAndLowerShouldSetBufferLengthToHigher() { PropertiesMeterFilter filter = new PropertiesMeterFilter( - createProperties("distribution.bufferLength.spring=2", "distribution.bufferLength[spring.boot]=3")); + createProperties("distribution.buffer-length.spring=2", "distribution.buffer-length.spring.boot=3")); assertThat( filter.configure(createMeterId("spring.boot"), DistributionStatisticConfig.DEFAULT).getBufferLength()) .isEqualTo(3); @@ -335,7 +335,7 @@ class PropertiesMeterFilterTests { @Test void configureWhenAllBufferLengthSetShouldSetBufferLengthToValue() { - PropertiesMeterFilter filter = new PropertiesMeterFilter(createProperties("distribution.bufferLength.all=3")); + PropertiesMeterFilter filter = new PropertiesMeterFilter(createProperties("distribution.buffer-length.all=3")); assertThat( filter.configure(createMeterId("spring.boot"), DistributionStatisticConfig.DEFAULT).getBufferLength()) .isEqualTo(3); diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/actuator/metrics.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/actuator/metrics.adoc index a9e6da0e3a..bac1fbd914 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/actuator/metrics.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/actuator/metrics.adoc @@ -1153,6 +1153,10 @@ The following properties allow per-meter customization: | configprop:management.metrics.distribution.percentiles[] | Publish percentile values computed in your application +| configprop:management.metrics.distribution.expiry[], configprop:management.metrics.distribution.buffer-length[] +| Give greater weight to recent samples by accumulating them in ring buffers which rotate after a configurable expiry, with a +configurable buffer length. + | configprop:management.metrics.distribution.slo[] | Publish a cumulative histogram with buckets defined by your service-level objectives. |===