Найдите время выполнения блока кода с помощью таймеров DropWizard

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

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

Любая помощь приветствуется.


person AnOldSoul    schedule 26.08.2016    source источник


Ответы (2)


Чтобы сообщить точное время выполнения блока кода, можно использовать счетчик. .

Он может сохранять кумулятивное значение времени, которое можно преобразовать в пики на графике, взяв производную. См. функцию Graphite derivative(..). в качестве примера (будьте осторожны, это не «настоящая» производная, а просто разница значений).

Однако этот подход не подходит для частых событий, не очень масштабируется. В случае высокой нагрузки лучше подходят Таймеры.

Простой java-помощник:

    timed(String metricName, Runnable body) {
        Counter counter = metricsRegistry.counter(metricName);
        long t = System.currentTimeMillis();
        try {
            body.run();
        finally {
            counter.inc(System.currentTimeMillis() - t);
        }
    }

person Iurii Ant    schedule 19.01.2019

Я не знаю, есть ли способ получить объект контекста таймера, но у меня есть другая идея. Вы сказали, что этот метод вызывается не так часто. Почему бы не использовать 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 с фильтрами

person hiaclibe    schedule 29.08.2016
comment
Я не знаю, почему ваш ответ был отклонен; но ваш послужил для меня идеальным шаблоном, когда я не хотел использовать сложный замер Dropwizard. - person Madhur Bhaiya; 14.05.2020