Время отклика Spring Boot API

Я разрабатываю Spring Boot API.

Теперь идет часть мониторинга. Я хочу добавить к нему мониторинг. Поэтому я использовал привод, извлекал из него данные (например, gc, память и т. д.) и наносил их на Grafana.

Теперь наступает время отклика API. Датчик привода просто возвращает последнее обращение к API. Итак, как мне рассчитать время отклика каждого API для каждого обращения. Я имею в виду, где я должен разместить

long startTime = System.currentTimeMillis();

и

long endTime = System.currentTimeMillis();
long diff = endTime - startTime;

Я попытался поместить его на контроллер, 1-ю строку контроллера и последнюю строку контроллера, но результат отличается, когда я сравниваю его с Guage.

Как мне правильно его измерить?


person Ankit Bansal    schedule 16.05.2017    source источник
comment
то, что вы ищете, - это гистограмма, Spring boot Acuator не поддерживает гистограмму, но Spring Boot Actuator может работать с библиотекой метрик Dropwizard (metrics.dropwizard.io/3.2.2), который поддерживает гистограммы, проверьте его.   -  person pvpkiran    schedule 16.05.2017
comment
Что мне более любопытно, есть ли способ получить эти данные вручную? Время отклика при каждом обращении к API?   -  person Ankit Bansal    schedule 16.05.2017


Ответы (1)


Может быть, вы можете попробовать получить АОП-совет по методу DispatcherServlet#service?

Непроверенный:

@Aspect
@Component
public class AroundExample {

    @Around("org.springframework.web.servlet.DispatcherServlet.service()")
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
        // start stopwatch
        Object retVal = pjp.proceed();
        // stop stopwatch
        return retVal;
    }

}

Не забудьте добавить стартер aop в свой POM:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

Это дало бы вам довольно точное время вызова всего запроса, включая все такие вещи, как перехватчики Spring, обработчики, контроллеры и т. д.

person Strelok    schedule 16.05.2017
comment
public class XYZ { @Around(execution(* org.springframework.web.servlet.DispatcherServlet.service(..))) public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { // запустить секундомер System.out.println(Before); Объект retVal = pjp.proceed(); // остановить секундомер System.out.println(Me here); вернуть ретВал; } } Этот код выполняется, но ничего не печатает? Что мне не хватает? - person Ankit Bansal; 16.05.2017
comment
Что вы подразумеваете под выполнением, но ничего не печатая? Вы установили точку останова в отладчике? - person Strelok; 16.05.2017
comment
Я имею в виду, что ошибок компиляции нет, но даже после размещения отпечатков ничего не печатается. Я имею в виду, что код компилируется, но ничего не печатает - person Ankit Bansal; 17.05.2017