Как измерить методы обслуживания с помощью spring boot 2 и микрометра
Я начал свой первый проект на Spring Boot 2 (RC1). Благодаря уже хорошей документации это не было трудно из Spring Boot 1.x.
теперь, я хочу, чтобы интегрировать метрику я stumbeling. Насколько я смог найти в настоящее время, есть только документация для метрик, поставляемых по умолчанию. Но я также хотел бы измерить время выполнения уровня обслуживания, а также время, используемое в dynamodb.редактировать Я ищу решение используя микрометр, библиотека используемая в новой библиотеке привода поставленной с весн-ботинком 2.
есть ли руководство о том, как это должно быть сделано? От этой Я читал, что пока нет простого решения на основе аннотаций для произвольных весенних бобов. Мог бы.o. дайте мне пример / ссылку на документацию о том, как можно измерить метод, подобный приведенному ниже?
@Service
@Timed
public class MyService {
public void doSomething() {
...;
}
}
2 ответов
вот небольшой образец, который должен заставить вас идти. Есть больше вариантов для Timer.record()
которые здесь не показаны. (Также: впрыска поля только используемая для краткости.)
Вам не нужно помещать имя вызываемых методов в тег. Вы также можете сделать его частью самого имени метрики. Просто хотел показать, на что ты способен.
обновление 2018-03-12: по состоянию на Micrometer 1.0.0
a TimedAspect
был введен, так что вы также можете использовать @Timed
Примечание. Сейчас вам нужно зарегистрироваться the Bean
себя. (Вы должны быть осторожны, хотя, когда у вас есть заказ @Timed
аннотации к вашим ресурсам Spring-MVC или Jersey.) Это уже упоминалось Михал Степан в последующем ответ.
package io.github.mweirauch.micrometered.eval;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import io.micrometer.core.annotation.Timed;
import io.micrometer.core.aop.TimedAspect;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import io.micrometer.core.instrument.Timer.Sample;
@Configuration
@EnableAspectJAutoProxy
public class TimingStuff {
@Service
static class MyService {
@Autowired
private MeterRegistry registry;
public void helloManual() {
// you can keep a ref to this; ok to call multiple times, though
Timer timer = Timer.builder("myservice").tag("method", "manual").register(registry);
// manually do the timing calculation
long start = System.nanoTime();
doSomething();
timer.record(System.nanoTime() - start, TimeUnit.NANOSECONDS);
}
public void helloSupplier() {
Timer timer = Timer.builder("myservice").tag("method", "supplier").register(registry);
// execution of the method is timed internally
timer.record(() -> doSomething());
}
public void helloSample() {
Timer timer = Timer.builder("myservice").tag("method", "sample").register(registry);
// records time taken between Sample creation and registering the
// stop() with the given Timer
Sample sample = Timer.start(registry);
doSomething();
sample.stop(timer);
}
// TimedAspect adds "class" and "method" tags
@Timed(value = "myservice.aspect")
public void helloAspect() {
doSomething();
}
private void doSomething() {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
//
}
}
}
@Autowired
private MyService myService;
@Bean
TimedAspect timedAspect(MeterRegistry registry) {
return new TimedAspect(registry);
}
@Scheduled(fixedRate = 1000)
public void postConstruct() {
myService.helloManual();
myService.helloSupplier();
myService.helloSample();
myService.helloAspect();
}
}
в случае, если вы идете на Прометея, вы бы в конечном итоге с чем-то вроде этого:
# HELP myservice_seconds
# TYPE myservice_seconds summary
myservice_seconds_count{application="micrometered",method="manual",} 4.0
myservice_seconds_sum{application="micrometered",method="manual",} 0.200378014
myservice_seconds_max{application="micrometered",method="manual",} 0.050115291
myservice_seconds_count{application="micrometered",method="supplier",} 4.0
myservice_seconds_sum{application="micrometered",method="supplier",} 0.200393455
myservice_seconds_max{application="micrometered",method="supplier",} 0.05011635
myservice_seconds_count{application="micrometered",method="sample",} 4.0
myservice_seconds_sum{application="micrometered",method="sample",} 0.200527005
myservice_seconds_max{application="micrometered",method="sample",} 0.050250191
# HELP myservice_aspect_seconds
# TYPE myservice_aspect_seconds summary
myservice_aspect_seconds_count{application="micrometered",class="io.github.mweirauch.micrometered.eval.TimingStuff$MyService",method="helloAspect",} 4.0
myservice_aspect_seconds_sum{application="micrometered",class="io.github.mweirauch.micrometered.eval.TimingStuff$MyService",method="helloAspect",} 0.201824272
myservice_aspect_seconds_max{application="micrometered",class="io.github.mweirauch.micrometered.eval.TimingStuff$MyService",method="helloAspect",} 0.051014296
@io.micrometer.core.annotation.Timed
аннотация, кажется, не в порядке для пользовательских вызовов из-за уменьшения области, при этом упоминается в ссылке в вашем вопросе.
вам нужно вручную настроить аспект:
@Configuration
@EnableAspectJAutoProxy
public class AutoTimingConfiguration {
@Bean
public TimedAspect timedAspect(MeterRegistry registry) {
return new TimedAspect(registry);
}
}
этот метод пути, как это:
@Timed("GET_CARS")
public List<Car> getCars(){
return Lists.newArrayList();
}
в результате GET_CARS
метрика в /actuator/metrics
(по умолчанию) конечной точки.