Skip to content

Commit e7ea152

Browse files
committed
Adding service level objectives support to the @timed annotation
1 parent 08bea96 commit e7ea152

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed

micrometer-core/src/main/java/io/micrometer/core/annotation/Timed.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,15 @@
7474
*/
7575
boolean histogram() default false;
7676

77+
/**
78+
* List of service level objectives to calculate client-side for the
79+
* {@link io.micrometer.core.instrument.Timer} in seconds. For example, for a 100ms
80+
* should be passed as {@code 0.1}.
81+
* @return service level objectives to calculate
82+
* @see io.micrometer.core.instrument.Timer.Builder#serviceLevelObjectives(java.time.Duration...)
83+
*/
84+
double[] serviceLevelObjectives() default {};
85+
7786
/**
7887
* Description of the {@link io.micrometer.core.instrument.Timer}.
7988
* @return meter description

micrometer-core/src/main/java/io/micrometer/core/aop/TimedAspect.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,18 @@
2020
import io.micrometer.core.annotation.Incubating;
2121
import io.micrometer.core.annotation.Timed;
2222
import io.micrometer.core.instrument.*;
23+
import io.micrometer.core.instrument.util.TimeUtils;
2324
import org.aspectj.lang.ProceedingJoinPoint;
2425
import org.aspectj.lang.annotation.Around;
2526
import org.aspectj.lang.annotation.Aspect;
2627
import org.aspectj.lang.reflect.MethodSignature;
2728

2829
import java.lang.reflect.Method;
30+
import java.time.Duration;
31+
import java.util.Arrays;
2932
import java.util.Optional;
3033
import java.util.concurrent.CompletionStage;
34+
import java.util.concurrent.TimeUnit;
3135
import java.util.function.Function;
3236
import java.util.function.Predicate;
3337

@@ -254,7 +258,10 @@ private Timer.Builder recordBuilder(ProceedingJoinPoint pjp, Timed timed, String
254258
.tags(EXCEPTION_TAG, exceptionClass)
255259
.tags(tagsBasedOnJoinPoint.apply(pjp))
256260
.publishPercentileHistogram(timed.histogram())
257-
.publishPercentiles(timed.percentiles().length == 0 ? null : timed.percentiles());
261+
.serviceLevelObjectives((Duration[]) Arrays.stream(timed.serviceLevelObjectives())
262+
.mapToObj(s -> Duration.ofNanos((long) TimeUtils.secondsToUnit(s, TimeUnit.NANOSECONDS)))
263+
.toArray());
264+
258265
if (meterTagAnnotationHandler != null) {
259266
meterTagAnnotationHandler.addAnnotatedParameters(builder, pjp);
260267
}

micrometer-core/src/main/java/io/micrometer/core/instrument/Timer.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@
2222
import io.micrometer.core.instrument.distribution.HistogramSupport;
2323
import io.micrometer.core.instrument.distribution.ValueAtPercentile;
2424
import io.micrometer.core.instrument.distribution.pause.PauseDetector;
25+
import io.micrometer.core.instrument.util.TimeUtils;
2526

2627
import java.time.Duration;
28+
import java.util.ArrayList;
2729
import java.util.Arrays;
30+
import java.util.List;
2831
import java.util.concurrent.Callable;
2932
import java.util.concurrent.TimeUnit;
3033
import java.util.function.*;
@@ -100,7 +103,10 @@ static Builder builder(Timed timed, String defaultName) {
100103
return new Builder(timed.value().isEmpty() ? defaultName : timed.value()).tags(timed.extraTags())
101104
.description(timed.description().isEmpty() ? null : timed.description())
102105
.publishPercentileHistogram(timed.histogram())
103-
.publishPercentiles(timed.percentiles().length > 0 ? timed.percentiles() : null);
106+
.publishPercentiles(timed.percentiles().length > 0 ? timed.percentiles() : null)
107+
.serviceLevelObjectives((Duration[]) Arrays.stream(timed.serviceLevelObjectives())
108+
.mapToObj(s -> Duration.ofNanos((long) TimeUtils.secondsToUnit(s, TimeUnit.NANOSECONDS)))
109+
.toArray());
104110
}
105111

106112
/**

0 commit comments

Comments
 (0)