7

我不熟悉使用 spring-boot 指标并从千分尺开始。我找不到在我的 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 文件夹,但我没有在列表中看到我的计时器(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);
});
4

3 回答 3

7

请参阅文档的这一部分。我对其进行了调整,使其与您想要的更相似。你只需要注册你TimerAutoConfigured 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);
    }

}
于 2018-08-21T16:32:05.770 回答
5

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

public void methodName(){
    //start
    Stopwatch stopwatch = Stopwatch.createStarted();// Google Guava
    
    // your job here
         
    // check time
    Metrics.timer("metric-name",
            "tag1", this.getClass().getSimpleName(), //class
            "tag2", new Exception().getStackTrace()[0].getMethodName()) // method 
            .record(stopwatch.stop().elapsed());
}
于 2020-01-15T10:30:05.000 回答
3

Spring Boot Micrometer 输出计时器信息的另一种方法是在io.micrometer.core.annotation.Timed要跟踪执行的方法中添加注解,并在 ApplicationContext 类中,或在任何具有@Configuration注解的类中添加以下方法:

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

之后,一个工作示例将是:

@PostMapping(value = "/save", produces = "application/json")
@Timed(description = "Time spent saving results")
public ResponseEntity<Integer> saveResults(@CookieValue(name = "JSESSIONID") String sessionId) {
    return new ResponseEntity<>(importer.saveResults(sessionId), HttpStatus.OK);
}

另请参阅此答案:https ://stackoverflow.com/a/49193908/5538923 。

于 2021-04-02T21:14:46.880 回答