当前位置: 首页 > 知识库问答 >
问题:

使用DropWizard计时器查找代码块的执行时间

融唯
2023-03-14

我讨论了这个问题DropWizard Metrics Meters vs Timer,并理解了定时器的概念。但是,有没有一种方法可以记录每次调用代码块时代码块的执行时间?我不想要这个计时器的平均速率和内容,因为这个方法调用频率不高,但调用时需要相当长的时间。那么,有没有一种方法可以打印每个调用的执行时间?此外,我如何获得以下问题的答案

  1. 如何调查值出现尖峰的原因?
  2. 我如何知道Max time事件何时发生,以便查看日志并查看可能的原因?

任何帮助都将不胜感激。

共有2个答案

桑博远
2023-03-14

不知道有没有办法获取定时器上下文对象,但是我有另外一个想法。你说这个方法不经常被调用。为什么不使用DynamicFeature并打印容器的执行时间?

下面我将向您展示如何实现这一点。我不确定这是否有效,我只是在没有任何测试的情况下对其进行了编码,因此请尝试一下,并在需要时进行更改。如果由于已实现的接口,执行时间筛选器需要拆分为两个单独的类,请相应地进行更改。

第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:创建动态功能

@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动态功能

明越
2023-03-14

为了报告准确的代码块执行时间,可以使用计数器。

它可以保持累积时间值,该值可以通过导数转换为图上的尖峰。以石墨的导数(..)函数为例(注意,这不是“真”导数,只是值差)。

这种方法不适合频繁的事件,不太容易扩展。在高负载的情况下,计时器更适合。

简单的java助手:

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

 类似资料:
  • 问题内容: 我想测量在Python程序中评估一块代码所花费的时间,可能在用户cpu时间,系统cpu时间和经过时间之间进行区分。 我知道该模块,但是我有许多自写函数,在设置过程中传递它们并不是很容易。 我宁愿有一些可以使用的东西: 用户和系统的CPU时间不是必需的(尽管我想测量它们),但是对于过去的时间,我希望能够执行类似的操作,而不是使用复杂的命令或模块。 问题答案: 要获取以秒为单位的经过时间,

  • 本文向大家介绍Flutter倒计时/计时器的实现代码,包括了Flutter倒计时/计时器的实现代码的使用技巧和注意事项,需要的朋友参考一下 在我们实现某些功能时,可能会有倒计时的需求。 比如发送短信验证码,发送成功后可能要求用户一段时间内不能再次发送,这时候我们就需要进行倒计时,时间到了才允许再次操作。 如下图: 为了实现这样场景的需求,我们需要使用 Timer.periodic 。 一、引入Ti

  • 本文向大家介绍Python代码执行时间测量模块timeit用法解析,包括了Python代码执行时间测量模块timeit用法解析的使用技巧和注意事项,需要的朋友参考一下 1.timeit模块 timeit模块可以用来测试一小段python代码的执行速度 class timeit.Timer(stmt = 'pass',setup = 'pass',timer=<timer function>) Ti

  • 在没有任何Java RMI经验的情况下,我有一个天真的问题,但在搜索互联网后仍然不确定答案。 问题: 对我来说,有两种情况: 场景1:从本地启动一个Java程序,在执行过程中,它从存储在远程机器上的类调用一个方法,然后该方法的类将下载到本地机器上,并继续执行。 场景2:从本地启动Java程序,在执行过程中,它从存储在远程机器上的类调用一个方法,然后该方法将在远程机器上执行,结果将发送回本地机器。(

  • 我正在学习DropWizard Metrics库(以前的Coda Hale指标),我不知道什么时候应该使用vs。根据文档: 仪表:仪表测量一组事件发生的速率 以及: 计时器:计时器基本上是一种事件持续时间的直方图和它发生的速率的度量 基于这些定义,我无法区分它们之间的区别。让我困惑的是,计时器的使用方式与我预期的不同。对我来说,计时器就是:计时器;它应该测量开始和停止之间的时间差。但计时器似乎也能

  • 问题内容: 您将如何回答以下问题? Java类的方法包含必须自动执行的代码块。使用适当的伪代码说明如何确保自动执行此代码块 我可以通过制作方法来实现吗.. 然后确保返回get语句: 如果我想增加x的值,我会这样做吗? 问题答案: 答案取决于您对“原子”的定义 我知道以下三个有效定义: 与同步中的原子相同:一次只能有一个线程执行代码; 像ACID中那样是原子的:所有动作/阻止都发生,或没有动作; 原