Как правильно рассчитать профиль API написанного на Java Spring MVC? - PullRequest
0 голосов
/ 08 ноября 2018

Ввод : у меня API, который со временем замедляется, у меня есть доступ к нему извне, как пользователю, и внутренне, как разработчику. Я хочу найти метод для профилирования времени и памяти для каждой конечной точки.

Вывод : Статистика для каждой конечной точки по истечении определенного периода времени в рабочей среде / рабочей среде для создания набора данных для дальнейшей отладки медленных случаев и, возможно, для запуска сообщений / предупреждений, когда они произошли.

Вопрос : Есть ли какой-нибудь хороший монитор, инфраструктура нагрузочного тестирования, который можно легко подключить к приложению Spring MVC, с которого я могу начать?

С тех пор я не нашел хорошего решения до сих пор. Я попытался hibernate.statistics отслеживать время в БД, а также ручное отслеживание времени с помощью класса Apache StopWatch. Это работает, но эти решения не очень хорошо обслуживаемы и имеют свои ограничения.

1 Ответ

0 голосов
/ 08 ноября 2018

Вы можете сделать это, используя Spring AOP. Используйте аспекты для хранения некоторых данных @Before, @After или @Around ваши методы.

Вы можете добавить свою пользовательскую аннотацию:

@Retention(RetentionPolicy.RUNTIME)
public @interface Profiling {
   String value();
}

Создать аспект:

@Aspect
public class ProfilingAspect{
    //for any method with @Profiling, no matter what the return type, name, or arguments are, call this method 
    @Around("execution(@foo.bar.packagename.Profiling * *(..)) && @annotation(profilingAnnotation)")
    public Object logDuration(ProceedingJoinPoint joinPoint, Profiling profilingAnnotation) throws Throwable {

        //capture the start time 
        long startTime = System.currentTimeMillis();

        //execute the method and get the result
        Object result = joinPoint.proceed();

        //capture the end time
        long endTime = System.currentTimeMillis();

        //calculate the duration and save it somewhere
        long duration = endTime - startTime;
        logger.info(profilingAnnotation.value()+": "+duration+"ms"); 

        //return the result to the caller
        return result; 
    }

}

Аннотируйте ваши методы с помощью @Profiling:

@Controller
public class HelloController{
     @RequestMapping("/api/example/hello")
     @Profiling("Hello World") 
     public @ResponseBody String getHelloWorld(){
          try {
              Thread.sleep(1000);
          } catch (InterruptedException e) {
              throw new RuntimeException("Sleep Interrupted", e);
          } 
          return "Hello World";
     } 

}

При вызове метода будет регистрироваться что-то вроде: Hello World: 1007ms

...