Mam 2 timery:
-
timerIn
(do raportowania czasu przed startem metodyaccept()
) -
timerOut
(do raportowania czasu po wykonaniu mnetodyaccept()
)
@Aspect
@Component
public class SummaryMsgHandlerMetrics {
public static final String TIMER_IN_NAME = "cstream_sse_provider_summary_in";
public static final String TIMER_OUT_NAME = "cstream_sse_provider_summary_out";
private final MeterRegistry meterRegistry;
private final Clock clock;
private final Timer timerIn;
private final Timer timerOut;
private static final double[] PERCENTILES = new double[]{.5, .95, .99};
@Autowired
public SummaryMsgHandlerMetrics(MeterRegistry meterRegistry, Clock clock) {
this.meterRegistry = meterRegistry;
this.clock = clock;
this.timerIn = Timer.builder(TIMER_IN_NAME)
.publishPercentiles(PERCENTILES)
.register(meterRegistry);
this.timerOut = Timer.builder(TIMER_OUT_NAME)
.publishPercentiles(PERCENTILES)
.register(meterRegistry);
}
@Around("execution(* *.SummaryMsgHandler.accept(..))")
public void measureTimeAroundAccept(ProceedingJoinPoint joinPoint) throws Throwable {
long before = clock.millis();
var summaryTrade = (SummaryTrade) joinPoint.getArgs()[0];
joinPoint.proceed();
timerIn.record(before - summaryTrade.getBirthTimestamp(), TimeUnit.MILLISECONDS);
timerOut.record(clock.millis() - summaryTrade.getBirthTimestamp(), TimeUnit.MILLISECONDS);
}
}
Wynik tych timerów jest taki, że mają identyczne czasy co do 1 ms.
Zwróćcie uwagę na 2 ostatnie linie.
Dodałem 100 sekund opóźnienia między raportowaniem timerIn
i timerOut
:
timerIn.record(before - summaryTrade.getBirthTimestamp(), TimeUnit.MILLISECONDS);
TimeUnit.SECONDS.sleep(100);
timerOut.record(clock.millis() - summaryTrade.getBirthTimestamp(), TimeUnit.MILLISECONDS);
czasy podskoczyły, ale są dalej identyczne!
Jvm coś optymalizuje i odpala clock.millis()
tylko raz?