应用系统在开发完成以后,就投入实际生产中运营。在软件运行时,整个软件一个黑盒,如何在整个生命周期中准确的知道应用程序运行的健康状况,服务使用状态?我们需要对应用程序进行监控,从而了解应用的运行状态,并根据情况决定是否需要对其运行状态进行调整。
Spring Boot提供了Spring-Boot-Start-Actuator 自动配置模块用于支持 SpringBoot 应用的监控。Spring Boot Actuator模块提供了生产级别的功能,比如健康检查、审计、指标收集、HTTP跟踪等,帮助我们监控和管理Spring Boot应用程序。
这个模块是一个采集应用内部信息暴露给外部的模块,上述的功能都可以通过HTTP和JMX访问。因为是暴露内部信息的特性,Actuator也可以和一些外部的应用监控程序结合(Graphite、Prometheus、Zabbix、cAdvisor、Riemann等)更友好的提供仪表板、图形图表、分析与预警。可帮助你通过一个统一友好的界面,监视和管理你的应用程序。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
需要在application配置文件中,配置具体的Actuator应用;
Spring boot 2.6以后的版本需要手动开启info配置,因为info默认值是false
server:
port: 8080 #服务端口
info:
application:
name: "@project.name@" #从pom.xml中获取
description: "@project.description@"
version: "@project.version@"
management:
server:
port: 8501 #指定监听端口,不能指定则与server端口一致。
endpoints: #启动所有监控
web:
exposure:
include: '*'
info: # spring-boot 2.6以后info默认值为false.需手动开启
env:
enabled: true
spring-boot-starter-actuator 自动配置模块默认提供了很多 endpoint,虽然自动配置模块名为 spring-boot-starter-actuator,但实际上这些 endpoint 可以按照“监”和“控”划分为两类:
序号 | 名称 | 说明 |
---|---|---|
1 | autoconfig | 这个 endpoint 会为我们提供一份 SpringBoot 的自动配置报告,告诉我们哪些自动配置模块生效了,以及哪些没有生效,原因是什么。 |
2 | beans | 给出当前应用的容器中所有 bean 的信息。 |
3 | configprops | 对现有容器中的 ConfigurationProperties 提供的信息进行“消毒”处理后给出汇总信息。 |
4 | info | 提供当前 SpringBoot 应用的任意信息,我们可以通过 Environment 或者 application.properties 等形式提供以 info. 为前缀的任何配置项,然后 info 这个 endpoint 就会将这些配置项的值作为信息的一部分展示出来。 |
5 | health | 针对当前 SpringBoot 应用的健康检查用的 endpoint。 |
6 | env | 关于当前 SpringBoot 应用对应的 Environment 信息。 |
7 | metrics | 当前 SprinBoot 应用的 metrics 信息。 |
8 | trace | 当前 SpringBoot 应用的 trace 信息。 |
9 | mapping | 如果是基于 SpringMVC 的 Web 应用,mapping 这个 endpoint 将给出 @RequestMapping 相关信息。 |
默认情况下,除了 shutdown 这个 endpoint(因为比较危险,如果没有安全防护,谁都可以访问它,然后关闭应用),其他 endpoints 都是默认启用的。
生产环境下,如果没有启用安全防护(比如没有依赖 spring-boot-starter-security),那么,建议遵循 Deny By Default 原则,将所有的 endpoints 都关掉,然后根据具体情况单独启用某些 endpoint:
endpoints:
enabled: true
falseendpoints:
info:
enabled: true
endpoints:
health:
enabled: true
所有配置项以 endpoints. 为前缀,然后根据 endpoint 名称划分具体配置项。大部分 endpoints 都是开箱即用,但依然有些 endpoint 提供给我们进一步扩展的权利,比如健康状态检查相关的 endpoint(health endpoint)。
应用的健康状态检查是很普遍的监控需求,SpringBoot 也预先通过 org.springframework.boot.actuate.autoconfigure.HealthIndicatorAutoConfiguration 为我们提供了一些常见服务的监控检查支持,比如:
如果这些默认提供的健康检查支持依然无法满足我们的需要,SpringBoot 还允许我们提供更多的 HealthIndicator 实现,只要将这些 HealthIndicator 实现类注册到 IoC 容器,SpringBoot 会自动发现并使用它们。
HTTP方法 | 路径 | 描述 | 授权 |
---|---|---|---|
GET | /autoconfig | 查看自动配置的使用情况 | true |
GET | /configprops | 查看配置属性,包括默认配置 | true |
GET | /beans | 查看bean及其关系列表 | true |
GET | /dump | 打印线程栈 | true |
GET | /env/{name} | 查看具体变量值 | true |
GET | /health | 查看应用健康指标 | true |
GET | /info | 查看应用信息(需要自己在application.properties)里头添加信息, | false |
GET | /mappings | 查看所有url映射 | true |
GET | /metrics | 报告各种应用程序度量信息,比如内存用量和HTTP请求计数 | true |
GET | /metrics/{name} | 报告指定名称的应用程序度量值 | true |
GET | /shutdown | 关闭应用程序,要求endpoints.shutdown.enabled设置为true | true |
GET | /trace | 提供基本的HTTP请求跟踪信息(时间戳、HTTP头等) | true |
endpoints 属于 spring-boot-starter-actuator 提供的主要功能之一,除此之外,spring-boot-starter-actuator 还提供了更多针对应用监控的支持和实现方案。
spring-boot-starter-actuator 提供了基于 CRaSH 的远程 Shell(Remote Shell)支持,这是一把双刃剑,不建议在生产环境使用,因为提供给自己便利的同时,也为黑客朋友们提供了便利。如果实在要用,请加强安全认证和防护。
不过,这里我们还是会为大家分析一下 spring-boot-starter-actuator 是如何提供针对 CRaSH 的支持的。
spring-boot-starter-actuator 提供了 org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration 自动配置类,该类会在 org.crsh.plugin.PluginLifeCycle 出现在 classpath 中的时候生效。
所以,只要将 CRaSH 作为依赖加入应用的 classpath 依赖就可以了,最简单直接的做法是让需要启用 CRaSH 的 SpringBoot 应用依赖 spring-boot-starter-remote-shell 自动配置模块,spring-boot-starter-remote-shell 的主要功效就是提供了针对 CRaSH 的各项依赖。
SpringBoot 提供了一套自己的针对系统指标的度量框架,基本上,我们只需关注 org.springframework.boot.actuate.endpoint.PublicMetrics 即可,它可以理解为提供一组 Metric 的集合,我们既可以通过 PublicMetrics 来汇总和管理 Metric,也可以通过 MetricRepository 来存储和管理 Metric。
一旦使用了 spring-boot-starter-actuator,只要当前 SpringBoot 应用的 ApplicationContext 中存在任何 PublicMetrics 实例,EndpointAutoConfiguration 就会将这些 PublicMetrics 采集汇总到一起,然后通过 MetricsEndpoint 将它们开放出去。
spring-boot-starter-actuator 提供的 org.springframework.boot.actuate.autoconfigure.PublicMetricsAutoConfiguration 默认会把一个 SystemPublicMetrics 开放出来,用于提供系统各项指标的度量和状态采集,另外一个就是会把当前 SpringBoot 应用的 ApplicationContext 的 org.springframework.boot.actuate.metrics.repository.MetricRepository 实例中的所有 Metric 汇总并开放出去。
默认如果用户没有给出任何自定义的 MetricRepository,spring-boot-starter-actuator 会提供一个 InMemoryMetricRepository 实现,如果我们将 Dropwizard 的 Metrics 类库作为依赖加入 classpath,那么,Dropwizard Metrics 的 MetricRegistry 中所有的度量指标项也会通过 PublicMetrics 的形式开发暴露出来。
虽然 SpringBoot 提供的 metrics 框架也能帮助我们完成系统和应用指标的度量,但笔者更倾向于使用 Dropwizard 这种特定场景下比较完善的方案,从 metrics 的类型,到外围系统的集成,Dropwizard metrics 都更加成熟和完备。
SpringBoot 的 Auditing 和 Trace 支持都遵循数据/事件+Repository 的设计。从设计上来说是很简单清晰的,也有很好的统一性,但实际应用过程中,我们依然会更加倾向于特定场景的方案选型。
我们可能只是通过打印日志时候的 Logger 名称来区分并记录 Audit 事件,然后通过日志采集通道汇总分析就可以了,而不用非要实现一个 LogFileBasedAuditEventRepository 或者 ElasticSearchBasedAuditEventRepository 之类的实现,对于 Trace 来说也是同样道理,我们可能直接使用完备的 APM 方案而不是单一或者少量 Trace 事件的记录。
Spring Boot Actuator 是 Spring Boot 的一个重要特性,它提供了丰富的端点,可以用于监控和管理应用程序。在本文中,我们介绍了 Actuator 的基本使用方法,包括端点的配置、使用、安全性和扩展。希望本文可以帮助读者更好地使用 Spring Boot Actuator 监控和管理应用程序。