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