环境:SpringBoot3.2.5
1. 简介
首先,你要知道什么是可观测性?可观察性是指从外部观察运行系统的内部状态的能力。它由三个支柱组成:日志记录、指标和跟踪。对于指标和跟踪,Spring Boot 使用 Micrometer Observation。
可观测性是确保系统稳定运行与高效维护的关键。在Spring Boot应用中,Micrometer作为观测工具,不仅支持丰富的指标收集(如CPU使用率、内存占用、请求响应时间等),还通过跟踪功能追踪请求路径,帮助开发者深入理解系统行为。这些能力结合日志记录,共同构成了强大的可观测性体系,加速故障排查与性能优化过程。
从Spring Boot 3.2.0开始可以通过@Timed, @Counted, @MeterTag 注解来完成接口的监测功能。接下来我们将详细的介绍这几个注解的使用。
2. 实战案例
2.1 环境准备
首先要引入相关的依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- 开启prometheus接口,通过该接口可以查看各项指标 --><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></dependency>
配置文件
management:endpoints::: /acexposure:include: '*'
为了简单,这里暴露所有的接口。要使用上面的几个注解,还需要添加如下配置
management:observations:annotations:enabled: true
开启后,Spring Boot会自动为我们配置几个切面类(底层实现通过AOP完成)。
2.2 @Timed注解
该注解会统计方法调用的执行耗时情况,包括什么类,哪个方法等信息。
定义如下接口
public Object pp() {try {TimeUnit.MILLISECONDS.sleep(new Random().nextInt(500)) ;} catch (InterruptedException e) {}return "MeterDemoController pp" ;}
访问上面接口

接下来通过/prometheus Actuator接口查看

这里就详细的统计出了接口调用的详细信息,属于哪个Class,哪个Method是否有异常。
MeterDemoController_pp_seconds_count:调用次数。
MeterDemoController_pp_seconds_sum:总计耗时(总次数时间合计)。
MeterDemoController_pp_seconds_max:最大耗时时长。
获取更多的信息,方法参数
要想获取请求的参数信息,我们需要提供如下的组件
public MeterTagAnnotationHandler meterTagAnnotationHandler() {return new MeterTagAnnotationHandler(valueResolverClass -> {return new ValueResolver() {public String resolve(Object parameter) {System.out.printf("parameter: %s%n", parameter) ;return parameter.toString() ;}} ;}, valueExpressionResolverClass -> {return new ValueExpressionResolver() {public String resolve(String expression, Object parameter) {System.out.printf("expression: %s, parameter: %s%n", expression, parameter) ;return parameter.toString() ;}} ;}) ;}
测试接口
public Object tag( String name) {return "@MeterTag Annotation" ;}
这里通过@MeterTag注解标准方法参数,key定义了显示时的名称,expression支持SpEL表达式,这里是获取当前参数name的值。
请求测试接口

查看监测结果

不同的参数生成不同的监测结果。
2.3 @Counted注解
该注解用来统计方法调用成功与失败情况。
public Long get( Long id) {if (id % 2 == 0) {throw new RuntimeException("参数错误") ;}return id ;}
当参数是偶数是,抛出异常。
分别通过/67和/68访问上面的接口

分别统计出成功/失败的次数。
2.4 控制统计的方法
如果你需要控制只针对某些有特定标识的方法或类进行统计,那么你需要自定义TimedAspect和CountedAspect切面。如下配置示例:
public CountedAspect countedAspect(MeterRegistry meterRegistry) {return new CountedAspect(meterRegistry, this::skipNonControllers);}private boolean skipNonControllers(ProceedingJoinPoint pjp) {Class<?> targetClass = pjp.getTarget().getClass();return AnnotationUtils.findAnnotation(targetClass, Controller.class) == null ;}
以上配置后, 如果类上没有Controller注解将不会进行监测。
以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏
推荐文章
SpringBoot强大的分布式锁组件Lock4j,支持多种实现
强大!实时监控SpringBoot运行时状态及应用运行时信息(数据库, Redis,MQ等)
SpringBoot自带Controller接口监控,赶紧用起来
基于SpringBoot通过3种方式轻松搞定敏感字段加密处理
面试官:说说@Configuration与@Component有什么区别?
SpringBoot参数验证@Validated和@Valid分清楚了吗?这些验证细节你知道吗?
SpringBoot整合Flink CDC,实时追踪数据变动,无缝同步至Redis



