Polish "Improve Micrometer histogram properties support"
Closes gh-14139pull/14744/merge
parent
c1c79ab1c2
commit
0ff1b25f52
@ -0,0 +1,104 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012-2018 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.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.springframework.boot.actuate.autoconfigure.metrics;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import io.micrometer.core.instrument.Meter.Type;
|
||||||
|
|
||||||
|
import org.springframework.boot.convert.DurationStyle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A meter value that is used when configuring micrometer. Can be a String representation
|
||||||
|
* of either a {@link Long} (applicable to timers and distribution summaries) or a
|
||||||
|
* {@link Duration} (applicable to only timers).
|
||||||
|
*
|
||||||
|
* @author Phillip Webb
|
||||||
|
*/
|
||||||
|
final class MeterValue {
|
||||||
|
|
||||||
|
private final Object value;
|
||||||
|
|
||||||
|
MeterValue(long value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
MeterValue(Duration value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the underlying value of the SLA in form suitable to apply to the given meter
|
||||||
|
* type.
|
||||||
|
* @param meterType the meter type
|
||||||
|
* @return the value or {@code null} if the value cannot be applied
|
||||||
|
*/
|
||||||
|
public Long getValue(Type meterType) {
|
||||||
|
if (meterType == Type.DISTRIBUTION_SUMMARY) {
|
||||||
|
return getDistributionSummaryValue();
|
||||||
|
}
|
||||||
|
if (meterType == Type.TIMER) {
|
||||||
|
return getTimerValue();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Long getDistributionSummaryValue() {
|
||||||
|
if (this.value instanceof Long) {
|
||||||
|
return (Long) this.value;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Long getTimerValue() {
|
||||||
|
if (this.value instanceof Long) {
|
||||||
|
return TimeUnit.MILLISECONDS.toNanos((long) this.value);
|
||||||
|
}
|
||||||
|
if (this.value instanceof Duration) {
|
||||||
|
return ((Duration) this.value).toNanos();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a new {@link MeterValue} instance for the given String value. The value may
|
||||||
|
* contain a simple number, or a {@link DurationStyle duration style string}.
|
||||||
|
* @param value the source value
|
||||||
|
* @return a {@link MeterValue} instance
|
||||||
|
*/
|
||||||
|
public static MeterValue valueOf(String value) {
|
||||||
|
if (isNumber(value)) {
|
||||||
|
return new MeterValue(Long.parseLong(value));
|
||||||
|
}
|
||||||
|
return new MeterValue(DurationStyle.detectAndParse(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a new {@link MeterValue} instance for the given long value.
|
||||||
|
* @param value the source value
|
||||||
|
* @return a {@link MeterValue} instance
|
||||||
|
*/
|
||||||
|
public static MeterValue valueOf(long value) {
|
||||||
|
return new MeterValue(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isNumber(String value) {
|
||||||
|
return value.chars().allMatch(Character::isDigit);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012-2018 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.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.springframework.boot.actuate.autoconfigure.metrics;
|
||||||
|
|
||||||
|
import io.micrometer.core.instrument.Meter.Type;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.springframework.boot.context.properties.bind.Bindable;
|
||||||
|
import org.springframework.boot.context.properties.bind.Binder;
|
||||||
|
import org.springframework.boot.test.util.TestPropertyValues;
|
||||||
|
import org.springframework.mock.env.MockEnvironment;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for {@link MeterValue}.
|
||||||
|
*
|
||||||
|
* @author Phillip Webb
|
||||||
|
*/
|
||||||
|
public class MeterValueTests {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getValueForDistributionSummaryWhenFromLongShouldReturnLongValue() {
|
||||||
|
MeterValue meterValue = MeterValue.valueOf(123L);
|
||||||
|
assertThat(meterValue.getValue(Type.DISTRIBUTION_SUMMARY)).isEqualTo(123);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getValueForDistributionSummaryWhenFromNumberStringShouldReturnLongValue() {
|
||||||
|
MeterValue meterValue = MeterValue.valueOf("123");
|
||||||
|
assertThat(meterValue.getValue(Type.DISTRIBUTION_SUMMARY)).isEqualTo(123);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getValueForDistributionSummaryWhenFromDurationStringShouldReturnNull() {
|
||||||
|
MeterValue meterValue = MeterValue.valueOf("123ms");
|
||||||
|
assertThat(meterValue.getValue(Type.DISTRIBUTION_SUMMARY)).isNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getValueForTimerWhenFromLongShouldReturnMsToNanosValue() {
|
||||||
|
MeterValue meterValue = MeterValue.valueOf(123L);
|
||||||
|
assertThat(meterValue.getValue(Type.TIMER)).isEqualTo(123000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getValueForTimerWhenFromNumberStringShouldMsToNanosValue() {
|
||||||
|
MeterValue meterValue = MeterValue.valueOf("123");
|
||||||
|
assertThat(meterValue.getValue(Type.TIMER)).isEqualTo(123000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getValueForTimerWhenFromDurationStringShouldReturnDurationNanos() {
|
||||||
|
MeterValue meterValue = MeterValue.valueOf("123ms");
|
||||||
|
assertThat(meterValue.getValue(Type.TIMER)).isEqualTo(123000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getValueForOthersShouldReturnNull() {
|
||||||
|
MeterValue meterValue = MeterValue.valueOf("123");
|
||||||
|
assertThat(meterValue.getValue(Type.COUNTER)).isNull();
|
||||||
|
assertThat(meterValue.getValue(Type.GAUGE)).isNull();
|
||||||
|
assertThat(meterValue.getValue(Type.LONG_TASK_TIMER)).isNull();
|
||||||
|
assertThat(meterValue.getValue(Type.OTHER)).isNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void valueOfShouldWorkInBinder() {
|
||||||
|
MockEnvironment environment = new MockEnvironment();
|
||||||
|
TestPropertyValues.of("duration=10ms", "long=20").applyTo(environment);
|
||||||
|
assertThat(Binder.get(environment).bind("duration", Bindable.of(MeterValue.class))
|
||||||
|
.get().getValue(Type.TIMER)).isEqualTo(10000000);
|
||||||
|
assertThat(Binder.get(environment).bind("long", Bindable.of(MeterValue.class))
|
||||||
|
.get().getValue(Type.TIMER)).isEqualTo(20000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue