Spring Boot Actuator使用

Spring Boot Actuator 是一个非常强大的模块,它为 Spring Boot 应用程序提供了生产级别的监控和管理功能。以下是对 Spring Boot Actuator 的详细解析:

1. **什么是 Actuator**:
- Spring Boot Actuator 是一个扩展模块,用于增强 Spring Boot 应用程序的管理和监控能力。它提供了一系列的 "endpoint"(端点),这些端点暴露了应用程序的各种信息和操作,如健康检查、审计、指标收集、HTTP 跟踪等。

2. **启用 Actuator**:
- 在 Spring Boot 应用中启用 Actuator 非常简单,只需要在项目的 `pom.xml` 或者 `build.gradle` 文件中添加 `spring-boot-starter-actuator` 依赖即可。

<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-actuator</artifactId>  
</dependency>

 

3. **配置 Actuator**:
- Actuator 的配置主要在 `application.yml` 或 `application.properties` 文件中进行。通过 `management` 命名空间下的选项可以控制 Actuator 端点的行为,包括是否启用、公开以及通过何种方式(如 HTTP 或 JMX)访问。

在 Spring Boot 2.x 中为了安全期间,Actuator 只开放了两个端点 /actuator/health 和 /actuator/info。可以在配置文件中设置打开。

可以打开所有的监控点

management:
  endpoints:
    web:
      exposure:
        include: "*"

“*”号代表启用所有的监控端点,可以单独启用,例如,healthinfometrics

4. **端点(Endpoints)**:
- Actuator 提供了许多内置的端点,每个端点都提供了特定的信息或操作。一些常见的端点包括:
- `/health`: 提供应用程序的基本健康状态信息。
- `/info`: 提供关于应用程序的元数据信息,如版本号、构建日期等。
- `/metrics`: 提供各种度量指标,如内存使用情况、CPU 使用率等。
- `/trace`: 提供最近的 HTTP 请求跟踪信息。
- `/dump`: (仅在 Web 环境下可用)提供线程 dump 信息。
- `/shutdown`: (默认禁用)允许通过 HTTP 关闭应用程序。

 

5. **安全性考虑**:
- 由于 Actuator 端点可能暴露敏感信息,因此需要对它们进行适当的安全控制。可以通过配置 Spring Security 或其他安全机制来限制对端点的访问。

6. **定制和扩展**:
- Actuator 允许开发者自定义端点或者扩展内置端点的功能。可以通过实现 `Endpoint` 接口或者使用 `@Endpoint`、`@ReadOperation`、`@WriteOperation` 等注解来创建自定义端点。

7. **与技术无关性**:
- 在 Spring Boot 2.x 中,Actuator 变得更加与技术无关,这意味着它能够更好地适应不同的环境和技术栈。

8. **Service Mesh 支持**:
- 在 Service Mesh 架构中,Actuator 的功能同样重要,因为它可以帮助监控和管理运行在分布式环境中的微服务。

总的来说,Spring Boot Actuator 是一个强大而灵活的工具,它极大地增强了 Spring Boot 应用程序的可观测性和可管理性,是生产环境中不可或缺的一部分。通过合理配置和使用 Actuator,开发者可以更好地监控和调试应用程序,及时发现并解决问题,从而提高系统的稳定性和可靠性。

浏览器打开链接http://localhost:8080/actuator/

可以看到所有支持的连接,默认只有

/actuator
/actuator/health
/actuator/health/{component}
/actuator/health/{component}/{instance}
/actuator/info

使用场景:

Actuator 几乎监控了应用涉及的方方面面,我们重点讲述一些经常在项目中常用的命令。

health

health 主要用来检查应用的运行状态,这是我们使用最高频的一个监控点。通常使用此接口提醒我们应用实例的运行状态,以及应用不”健康“的原因,比如数据库连接、磁盘空间不够等。

默认情况下 health 的状态是开放的,添加依赖后启动项目,访问:http://localhost:8080/actuator/health即可看到应用的状态。

{
    "status" : "UP"
}

举个例子,如果你的应用使用 Redis,RedisHealthindicator 将被当作检查的一部分;如果使用 MongoDB,那么MongoHealthIndicator 将被当作检查的一部分。

可以在配置文件中关闭特定的健康检查指标,比如关闭 redis 的健康检查:

management:
  health:
    redise:
      enabled: false

shutdown

开启接口优雅关闭 Spring Boot 应用,要使用这个功能首先需要在配置文件中开启:

management:
  endpoint:
    shutdown:
      enabled: true

metrics 端点

metrics 是一个非常重要的监控端点,其监控内容覆盖了 JVM 内存、堆、类加载、处理器和 tomcat 容器等一些重要指标:

http://localhost:11360/actuator/metrics

 可以看到这里面包含了非常多的指标,任意访问一个指标就可以查看对应的指标信息:

http://localhost:11360/actuator/metrics/hikaricp.connections.acquire

 

除了使用 metrics 端点默认的这些统计指标外,我们还可以实现自定义统计指标。Metrics 提供 4 种基本的度量类型:Gauge、Counter、Timer、Summary。下面分别进行介绍。

1,Gauge(计量器)

Gauge(计量器)是最简单的度量类型,只有一个简单的返回值,他用来记录一些对象或者事物的瞬时值。

(1)假设我们在一个 Contoller 使用一个类型为 Gauge 的计数器来记录一个数值:

@RestControllerpublic class HelloController { @GetMapping("/hello") public void hello() { Metrics.gauge("user.test.gauge", 3); }}

(2)通过 /actuator/metrics 接口可以看到我们自定义的这个指标:

(3)假设我们访问了 /hello 接口后,再次通过 /actuator/metrics/user.test.gauge 这个自定义度量的消息信息,显示如下:

2,Counter(计数器)

Counter(计数器)简单理解就是一种只增不减的计数器。它通常用于记录服务的请求数量、完成的任务数量、错误的发生数量等等。

(1)为方便使用首先我们自定义一个计数器服务:

@Servicepublic class MyCounterService { static final Counter userCounter = Metrics.counter("user.counter.total", "services", "demo"); public void processCollectResult() { userCounter.increment(1D); }}

(2)然后增加一个 controller,触发这个服务:

@RestControllerpublic class HelloController { @Autowired MyCounterService myCounterService; @GetMapping("/hello") public void hello() { myCounterService.processCollectResult(); }}

(3)通过 /actuator/metrics 接口可以看到我们自定义的这个指标:

(4)假设我们访问了 3 次 /hello 接口,再次通过 /actuator/metrics/user.counter.total 这个自定义度量的消息信息,显示如下:

3,Timer(计时器)

Timer(计时器)可以同时测量一个特定的代码逻辑块的调用(执行)速度和它的时间分布。

简单来说,就是在调用结束的时间点记录整个调用块执行的总时间,适用于测量短时间执行的事件的耗时分布,例如消息队列消息的消费速率。

(1)假设我们在一个 Contoller 使用 Timer 来记录某个方法的执行时长:

注意:在实际生产环境中,可以通过 spring-aop 把记录方法耗时的逻辑抽象到一个切面中,这样就能减少不必要的冗余的模板代码。

@RestControllerpublic class HelloController { private Timer timer = Metrics.timer("user.test.timer","timer", "timersample"); @GetMapping("/hello") public void hello() { // 执行createOrder方法并记录执行时间 timer.record(() -> createOrder()); } //模拟方法耗时 private void createOrder() { try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { } }}

(2)假设我们访问了 3 次 /hello 接口,再次通过 /actuator/metrics/user.test.timer 这个自定义度量的消息信息,显示如下:

4,Summary(摘要)

Summary(摘要)用于跟踪事件的分布。它类似于一个计时器,但更一般的情况是,它的大小并不一定是一段时间的测量值。

在 micrometer 中,对应的类是 DistributionSummary,它的用法有点像 Timer,但是记录的值是需要直接指定,而不是通过测量一个任务的执行时间。

(1)假设我们在一个 Contoller 使用 Summary 来连续记录三次值:

@RestControllerpublic class HelloController { private DistributionSummary summary = Metrics.summary("user.test.summary","summary", "summarysample"); @GetMapping("/hello") public void hello() { summary.record(2D); summary.record(3D); summary.record(4D); }}

(2)假设我们访问 /hello 接口后,再次通过 /actuator/metrics/user.test.summary 这个自定义度量的消息信息,显示如下:

/loggers 端点

  • 查看日志等级

/loggers

 端点暴露了我们程序内部配置的所有logger的信息。我们访问

/actuator/loggers

可以看到:

你也可以通过下述方式访问单独一个logger:

http://localhost:8080/actuator/loggers/{name}

比如我现在访问

root

 logger,

http://localhost:8080/actuator/loggers/root:

{ "configuredLevel": "INFO", "effectiveLevel": "INFO"}
  • 改变运行时日志等级

/loggers

端点能够动态修改你的日志等级。

比如,我们可以通过以下几种方式来修改

root

 logger的日志等级。我们只需要发起一个URL 为

http://localhost:8080/actuator/loggers/root

POST

请求,POST报文如下:

{ "configuredLevel": "DEBUG"}

1、使用工具修改:

 

2、使用浏览器修改:

先在chrome浏览器中,按F12打开console(控制台);然后执行以下脚本(url参数根据自己需求进行修改),回车执行。

fetch(new Request('http://localhost:8080/masl/actuator/loggers/ROOT',{method:'POST',headers: {'Content-Type': 'application/json;charset=UTF-8'},body:"{"configuredLevel": "DEBUG"}"})).then((resp)=>{console.log(resp)})

3、使用shell脚本修改:

curl -X "POST" "http://localhost:8080/masl/actuator/loggers/ROOT" -H "Content-Type: application/json;charset=UTF-8" -d '{"configuredLevel": "DEBUG"}'

仔细想想,这个功能是不是非常有用。还可以只修改某个类的日志级别(把上面的ROOT替换成类的全路径,如:com.zat.asl.MaslApplication)

如果在生产环境中,你想要你的应用输出一些Debug信息以便于你诊断一些异常情况,你只需要按照上述方式就可以修改,而不需要重启应用。

参考:https://www.shangyexinzhi.com/article/8551753.html

Spring Boot Monitor做监控页面

<dependency>
    <groupId>cn.pomit</groupId>
    <artifactId>spring-boot-monitor</artifactId>
    <version>0.0.1</version>
</dependency>

Spring Boot Monitor是一个对Spring boot admin监控工具做修改并适配单机的监控工具,完美继承了Spring boot admin的风格,直接使用actuator的指标进行显示。

前面maven依赖中,已经说明依赖spring-boot-monitor,这时,无需其他配置.

访问http://127.0.0.1:8080/monitor, 自动跳转到Spring Boot Monitor的监控页面。

可以对Spring boot的各项指标一目了然,还可以进行简单的操作。

当然,如果Spring boot actuator的指标被限制了,它也拿不到相应的指标了,因为它是直接请求actuator接口的。

参考:https://blog.csdn.net/qq_45635347/article/details/131443687

 

posted @   刘百会  阅读(222)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示