Spring-boot micrometer timer() 是如何工作的?
Spring-boot micrometer timer() how does it work?
我刚开始使用 spring-boot metrics 并开始使用 micrometer。我找不到在我的 spring-boot 应用程序中执行计时器指标的好例子(事实上它是新的)。我正在使用 spring-boot-starter-web:2.0.2.RELEASE 依赖项。
但是 运行 spring-启动服务器并启动 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);
});
请参阅文档的 this part。我将其调整为与您想要的更相似。您只需使用 AutoConfigured
MetricRegistry
:
注册您的 Timer
@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);
}
}
这可能是。如果您使用 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());
}
另一种使用Spring Boot Micrometer输出定时器信息的方法,是在要跟踪执行的方法中添加注释io.micrometer.core.annotation.Timed
,并在ApplicationContext中添加class,或者在任何具有 @Configuration
注释的 class 中,使用以下方法:
@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);
}
另请参阅此答案: .
我刚开始使用 spring-boot metrics 并开始使用 micrometer。我找不到在我的 spring-boot 应用程序中执行计时器指标的好例子(事实上它是新的)。我正在使用 spring-boot-starter-web:2.0.2.RELEASE 依赖项。 但是 运行 spring-启动服务器并启动 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);
});
请参阅文档的 this part。我将其调整为与您想要的更相似。您只需使用 AutoConfigured
MetricRegistry
:
Timer
@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);
}
}
这可能是。如果您使用 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());
}
另一种使用Spring Boot Micrometer输出定时器信息的方法,是在要跟踪执行的方法中添加注释io.micrometer.core.annotation.Timed
,并在ApplicationContext中添加class,或者在任何具有 @Configuration
注释的 class 中,使用以下方法:
@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);
}
另请参阅此答案: