大数跨境
0
0

强大!SpringBoot通过这3个注解监测Controller接口

强大!SpringBoot通过这3个注解监测Controller接口 Spring全家桶实战案例
2024-07-13
0
导读:SpringBoot通过这3个注解统计Controller接口

环境: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:    web:      base-path: /ac      exposure:        include: '*'

为了简单,这里暴露所有的接口。要使用上面的几个注解,还需要添加如下配置

management:  observations:    annotations:      enabled: true

开启后,Spring Boot会自动为我们配置几个切面类(底层实现通过AOP完成)。

2.2 @Timed注解

该注解会统计方法调用的执行耗时情况,包括什么类,哪个方法等信息。

定义如下接口

@Timed("MeterDemoController.pp")@GetMapping("/pp")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:大耗时时长。

获取更多的信息,方法参数

要想获取请求的参数信息,我们需要提供如下的组件

@Beanpublic 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() ;      }    } ;  }) ;}

测试接口

@Timed("MeterDemoController.tag")@GetMapping("/tag")public Object tag(@MeterTag(key = "MeterDemoController#tag.name", expression = "#name") String name) {  return "@MeterTag Annotation" ;}

这里通过@MeterTag注解标准方法参数,key定义了显示时的名称,expression支持SpEL表达式,这里是获取当前参数name的值。

请求测试接口

查看监测结果

不同的参数生成不同的监测结果。

2.3 @Counted注解

该注解用来统计方法调用成功与失败情况。

@Counted("MeterDemoController.cc")@GetMapping("/{id}")public Long get(@PathVariable("id") Long id) {  if (id % 2 == 0) {    throw new RuntimeException("参数错误") ;  }  return id ;}

当参数是偶数是,抛出异常。

分别通过/67和/68访问上面的接口

分别统计出成功/失败的次数。

2.4 控制统计的方法

如果你需要控制只针对某些有特定标识的方法或类进行统计,那么你需要自定义TimedAspect和CountedAspect切面。如下配置示例:

@Beanpublic 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等)

Spring强大的FactoryBean还能这样用,涨知识

管理SpringBoot项目的3个强大的功能是否用过?

SpringBoot自带Controller接口监控,赶紧用起来

强大!基于SpringBoot实现AOP的动态热插拔功能

SpringBoot这2个接口非常实用,你们都用来做什么?

基于SpringBoot通过3种方式轻松搞定敏感字段加密处理

SpringBoot优雅定制接口参数格式转换

必须掌握SpringBoot强大的日志功能

SpringBoot整合RSocket实时数据通信

面试官:说说@Configuration与@Component有什么区别?

SpringBoot参数验证@Validated和@Valid分清楚了吗?这些验证细节你知道吗?

SpringBoot整合Flink CDC,实时追踪数据变动,无缝同步至Redis

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读195
粉丝0
内容832