2016-08-26 11 views
1

Я прошел через этот вопрос DropWizard Metrics Meters vs Timers и понял концепцию таймеров. Но есть ли способ, чтобы я мог записывать время выполнения блока кода, каждый раз, когда он вызывается? Мне не нужна средняя скорость и материал этого таймера, так как этот метод не называется так часто, но занимает много времени при вызове. Так есть способ, которым я могу распечатать время выполнения каждого вызова? Также как я могу получить ответы на следующие вопросы:Найти время выполнения блока кода с помощью таймеров DropWizard

  1. Как я могу выяснить причину появления всплесков значений?
  2. Как узнать, когда произошло событие Max time, чтобы я мог просматривать журналы и видеть возможные причины?

Любая помощь будет очень признательна.

ответ

0

Я не знаю, есть ли способ получить объект контекста таймера, но у меня есть другая идея. Вы сказали, что этот метод называется не так часто. Почему бы не использовать DynamicFeature и не распечатать время выполнения контейнера?

Ниже я покажу вам, как это можно реализовать. Я не уверен, что это работает, я просто закодировал его без какого-либо теста, поэтому, пожалуйста, попробуйте его и при необходимости измените. Если для ExecutionTimeFilter требуется разделение на два отдельных класса из-за реализованных интерфейсов, измените его соответствующим образом.

Шаг 1: Создание фильтра

@Provider 
public class ExecutionTimeFilter implements ContainerRequestFilter, ContainerResponseFilter { 
    public static final String EXECUTION_TIME_HEADER = "X-Execution-Time" 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     requestContext.getHeaders().add(EXECUTION_TIME_HEADER, ZonedDateTime.now().toString()); 
    } 

     @Override 
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { 
     ZonedDateTime executionStartHeader = ZonedDateTime.parse(requestContext.getHeaderString(EXECUTION_TIME_HEADER)); 
     Duration executionTime = Duration.between(executionStartHeader, ZonedDateTime.now()); 
     //you can also print some url informations or whatever you need; check out the informations from both mehtod params 
     System.out.println("The execution time was:" + executionTime); 
    } 
} 

Шаг 2: Создание DynamicFeature

@Provider 
public class ExecutionTimeFeature implements DynamicFeature { 
    @Override 
    public void configure(ResourceInfo resourceInfo, FeatureContext context) { 
     if (resourceInfo.getResourceMethod().getAnnotation(ExecutionTime.class) != null) { 
      context.register(ExecutionTimeFilter.class); 
     } 
    } 
} 

Шаг 3: Создание аннотаций

@Target({ ElementType.METHOD }) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ExecutionTime { 
} 

Шаг 4: Авторство ваш ресурс

@GET 
@ExecutionTime 
public String getExcpensiveCalculation(@QueryParam("number") @DefaultValue("1") IntegerParam number) { 
    return getCalculation(number); 
} 

Шаг 5: Регистрация Характеристика

environment.jersey().register(ExecutionTimeFeature.class); 

Ссылки: Dropwizard Dynamic Feature with Filters