弹簧启动千分尺timer()如何工作?

时间:2018-08-21 16:15:51

标签: spring-boot spring-boot-actuator micrometer

我是第一次使用弹簧启动指标,并从千分尺开始。我找不到在我的spring-boot应用程序中执行计时器指标的好例子(事实是它的新特性)。我正在使用spring-boot-starter-web:2.0.2.RELEASE依赖项。 但是运行spring-boot服务器并启动jconsole时,我没有看到它显示Metrics(MBeans),因此我还明确地将以下依赖项包括在内:

spring-boot-starter-actuator:2.0.2.RELEASE

还与微米有关:'io.micrometer:micrometer-registry-jmx:latest' 添加执行器后,它确实显示了Metrics文件夹,但是在列表中没有看到我的timer(app.timer)属性。难道我做错了什么?任何建议表示赞赏!

下面的代码段:

MeterRegistry registry = new CompositeMeterRegistry();
long start = System.currentTimeMillis();
Timer timer = registry.timer("app.timer", "type", "ping");
timer.record(System.currentTimeMillis() - start, TimeUnit.MILLISECONDS);

这有效:

Metrics.timer("app.timer").record(()-> {

 didSomeLogic;
 long t = timeOccurred - timeScheduled;
 LOG.info("recorded timer = {}", t);
});

3 个答案:

答案 0 :(得分:2)

请参阅文档中的this part。我将其调整为与您想要的内容更加相似。您只需向Timer AutoConfigured注册MetricRegistry

@Component
public class SampleBean {

    private final Timer timer;

    public SampleBean(MeterRegistry registry) {
        long start = System.currentTimeMillis();
        this.timer = registry.timer("app.timer", "type", "ping");
    }

    public void handleMessage(String message) {
        timer.record(System.currentTimeMillis() - start, TimeUnit.MILLISECONDS);
    }

}

答案 1 :(得分:1)

Spring Boot Micrometer 输出定时器信息的另一种方式,是在要跟踪执行的方法中添加注解io.micrometer.core.annotation.Timed,并添加到ApplicationContext类中,或者添加到任何具有{{1} }}注解,方法如下:

@Configuration

之后,一个有效的例子是:

@Bean
public TimedAspect timedAspect(MeterRegistry registry) {
    return new TimedAspect(registry);
}

另见此答案:https://stackoverflow.com/a/49193908/5538923 .

答案 2 :(得分:0)

可能是。如果您使用的是Spring Boot 2,则只需在任意位置调用Timer即可,无需使用构造函数。

public void methodName(){
    //start
    Stopwatch stopwatch = Stopwatch.createStarted();// Google Guava

    // your job here

    // check time
    Duration duration = Duration.ofMillis(stopwatch.stop().elapsed(TimeUnit.MILLISECONDS));
    long seconds = duration.getSeconds();
    Metrics.timer("metric-name", // metric name
            "tag1", this.getClass().getSimpleName(), // class name
            "tag2", new Exception().getStackTrace()[0].getMethodName()) // method name
            .record(seconds, TimeUnit.SECONDS);
}

或更短

    Stopwatch stopwatch = Stopwatch.createStarted();
    // job here
    Metrics.timer("metric-name",
            "tag1", this.getClass().getSimpleName(), //class
            "tag2", new Exception().getStackTrace()[0].getMethodName()) // method 
            .record(Duration.ofMillis(stopwatch.stop().elapsed(TimeUnit.MILLISECONDS)));