一、什么是 Spring Boot Actuator
Spring Boot Actuator 模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP 跟踪等,帮助我们监控和管理Spring Boot 应用。这个模块是一个采集应用内部信息暴露给外部的模块,上述的功能都可以通过HTTP 和 JMX 访问。
因为暴露内部信息的特性,Actuator 也可以和一些外部的应用监控系统整合(Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等)。这些监控系统提供了出色的仪表板,图形,分析和警报,可帮助你通过一个统一友好的界面,监视和管理你的应用程序。
Actuator使用Micrometer与这些外部应用程序监视系统集成。这样一来,只需很少的配置即可轻松集成外部的监控系统。
Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,应用程序只需要使用 Micrometer 的通用 API 来收集性能指标即可。
Micrometer 会负责完成与不同监控系统的适配工作。这就使得切换监控系统变得很容易。
对比 Slf4j 之于 Java Logger 中的定位。
二、快速开始,创建一个Spring Boot Actuator Demo
我们先创建一个demo应用。
Spring Boot 基础就不介绍了,推荐下这个实战教程:https://github.com/javastacks/spring-boot-best-practice
你可以通过Spring Boot CLI 创建:
1 | spring init -d=web,actuator -n=actuator-demo actuator-demo |
或者通过Spring Initializr 创建:
对应的maven依赖:
1 | <dependencies> |
对应的Gradle 依赖:
1 | dependencies { |
三、Endpoints 介绍
Spring Boot 提供了所谓的 endpoints (下文翻译为端点)给外部来与应用程序进行访问和交互。
打比方来说,/health
端点 提供了关于应用健康情况的一些基础信息。metrics
端点提供了一些有用的应用程序指标(JVM 内存使用、系统CPU使用等)。
这些 Actuator 模块本来就有的端点我们称之为原生端点。根据端点的作用的话,我们大概可以分为三大类:
- 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与Spring Boot应用密切相关的配置类信息。
- 度量指标类:获取应用程序运行过程中用于监控的度量指标,比如:内存信息、线程池信息、HTTP请求统计等。
- 操作控制类:提供了对应用的关闭等操作类功能。
需要注意的就是:
- 每一个端点都可以通过配置来单独禁用或者启动
- 不同于Actuator 1.x,Actuator 2.x 的大多数端点默认被禁掉。Actuator 2.x 中的默认端点增加了
/actuator
前缀。默认暴露的两个端点为/actuator/health
和/actuator/info
四、端点暴露配置
我们可以通过以下配置,来配置通过JMX 和 HTTP 暴露的端点。
Property | Default |
---|---|
management.endpoints.jmx.exposure.exclude |
|
management.endpoints.jmx.exposure.include |
* |
management.endpoints.web.exposure.exclude |
|
management.endpoints.web.exposure.include |
info, healt |
可以打开所有的监控点
1 | management.endpoints.web.exposure.include=* |
也可以选择打开部分,”*” 代表暴露所有的端点,如果指定多个端点,用”,”分开
1 | management.endpoints.web.exposure.exclude=beans,trace #除去beans可以少很多无用信息 |
Actuator 默认所有的监控点路径都在/actuator/*
,当然如果有需要这个路径也支持定制。
1 | management.endpoints.web.base-path=/minitor |
设置完重启后,再次访问地址就会变成/minitor/*
。
现在我们按照如下配置:
1 | # "*" 代表暴露所有的端点 如果指定多个端点,用","分开 |
启动DEMO程序,访问http://localhost:8080/actuator
,查看暴露出来的端点:
上面这样显示是因为chrome 浏览器安装了 JSON-handle 插件,实际上就是返回一大段json
1 | 示例: |
五、重要端点解析
5.1 /health
端点
/health
端点会聚合你程序的健康指标,来检查程序的健康情况。端点公开的应用健康信息取决于:
1 | management.endpoint.health.show-details=always |
该属性可以使用以下值之一进行配置:
Name | Description |
---|---|
never |
不展示详细信息,up或者down的状态,默认配置 |
when-authorized |
详细信息将会展示给通过认证的用户。授权的角色可以通过management.endpoint.health.roles 配置 |
always |
对所有用户暴露详细信息 |
按照上述配置,配置成always
之后,我们启动项目,访问http://localhost:8080/actuator/health
端口,可以看到这样的信息:
是不是感觉好像健康信息有点少?先别急,那是因为我们创建的是一个最基础的Demo项目,没有依赖很多的组件。
/health
端点有很多自动配置的健康指示器:如redis、rabbitmq、db等组件。当你的项目有依赖对应组件的时候,这些健康指示器就会被自动装配,继而采集对应的信息。如上面的 diskSpace 节点信息就是DiskSpaceHealthIndicator
在起作用。
另一个项目的/health
端点信息
当如上的组件有一个状态异常,应用服务的整体状态即为down。我们也可以通过配置禁用某个组件的健康监测。
1 | management.health.mongo.enabled: false |
或者禁用所有自动配置的健康指示器:
1 | management.health.defaults.enabled: false |
⭐自定义 Health Indicator
当然你也可以自定义一个Health Indicator,只需要实现HealthIndicator
接口或者继承AbstractHealthIndicator
类。
1 | /** |
最终效果:
5.2 /metrics
端点
/metrics
端点用来返回当前应用的各类重要度量指标,比如:内存信息、线程信息、垃圾回收信息、tomcat、数据库连接池等。
1 | { |
不同于1.x,Actuator在这个界面看不到具体的指标信息,只是展示了一个指标列表。为了获取到某个指标的详细信息,我们可以请求具体的指标信息,像这样:
1 | http://localhost:8080/actuator/metrics/{MetricName} |
比如我访问/actuator/metrics/jvm.memory.max
,返回信息如下:
也可以用query param的方式查看单独的一块区域。比如你可以访问/actuator/metrics/jvm.memory.max?tag=id:Metaspace
。结果就是:
5.3/loggers
端点
/loggers
端点暴露了我们程序内部配置的所有logger的信息。我们访问/actuator/loggers
可以看到,
你也可以通过下述方式访问单独一个logger,
1 | http://localhost:8080/actuator/loggers/{name} |
比如我现在访问 root
logger,http://localhost:8080/actuator/loggers/root
1 | { |
⭐改变运行时的日志等级
/loggers
端点我最想提的就是这个功能,能够动态修改你的日志等级。
比如,我们可以通过下述方式来修改 root
logger的日志等级。我们只需要发起一个URL 为http://localhost:8080/actuator/loggers/root
的POST
请求,POST报文如下:
1 | { "configuredLevel": "DEBUG" } |
如果在生产环境中,你想要你的应用输出一些Debug信息以便于你诊断一些异常情况,你你只需要按照上述方式就可以修改,而不需要重启应用。
如果想重置成默认值,把value 改成
null
5.4 /info
端点
/info
端点可以用来展示你程序的信息。我理解过来就是一些程序的基础信息。并且你可以按照自己的需求在配置文件application.properties
中个性化配置(默认情况下,该端点只会返回一个空的json内容。):
1 | info.app.name=actuator-test-demo |
启动项目,访问http://localhost:8080/actuator/info
:
1 | { |
5.5 /beans
端点
/beans
端点会返回Spring 容器中所有bean的别名、类型、是否单例、依赖等信息。
访问http://localhost:8080/actuator/beans
,返回如下:
5.6 /heapdump
端点
访问:http://localhost:8080/actuator/heapdump
会自动生成一个 Jvm 的堆文件 heapdump。我们可以使用 JDK 自带的 Jvm 监控工具 VisualVM 打开此文件查看内存快照。
5.7 /threaddump
端点
这个端点我个人觉得特别有用,方便我们在日常定位问题的时候查看线程的情况。主要展示了线程名、线程ID、线程的状态、是否等待锁资源、线程堆栈等信息。就是可能查看起来不太直观。访问http://localhost:8080/actuator/threaddump
返回如下:
5.8 /shutdown
端点
这个端点属于操作控制类端点,可以优雅关闭 Spring Boot 应用。要使用这个功能首先需要在配置文件中开启:
1 | management.endpoint.shutdown.enabled=true |
由于 shutdown 接口默认只支持 POST 请求,我们启动Demo项目,向http://localhost:8080/actuator/shutdown
发起POST
请求。返回信息:
1 | { "message": "Shutting down, bye..."} |
然后应用程序被关闭。
由于开放关闭应用的操作本身是一件非常危险的事,所以真正在线上使用的时候,我们需要对其加入一定的保护机制,比如:定制Actuator的端点路径、整合Spring Security进行安全校验等。(不是特别必要的话,这个端点不用开)
六、整合Spring Security 对端点进行安全校验
由于端点的信息和产生的交互都是非常敏感的,必须防止未经授权的外部访问。如果您的应用程序中存在Spring Security的依赖,则默认情况下使用基于表单的HTTP身份验证来保护端点。
如果没有,只需要增加对应的依赖即可:
1 | <dependency> |
添加之后,我们需要定义安全校验规则,来覆盖Spring Security 的默认配置。
这里我给出了两个版本的模板配置:
1 | import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest; |
application.properties
的相关配置如下:
1 | # Spring Security Default user name and password |
七、整合可视化界面实战
1.引入actuator和micrometer下的prometheus依赖 (如果想用其他可视化组件,例如Influx,就引入对应的依赖包)
(micrometer和prometheus的关系就像是slf4J和logback或log4J的关系)
1 | <dependency> |
2.项目里配置yml文件
(这里配置的是暴露端点,*代表所有端点。需要指定端口号,不然原项目的端口号访问不到,不知道哪里配置出错导致的。指定meter的标签)
1 | management: |
到这里即可以访问http://127.0.0.1:8484/actuator 和 http://127.0.0.1:8484/actuator/prometheus
3.官网下载prometheus后解压,运行.exe文件启动,默认端口号为9090
修改配置文件prometheus.yml (好像只能监测spring的metrics状态)
1 | scrape_configs: |
到这里可以访问http://127.0.0.1:9090/targets,如果显示为up表示成功
4.官网下载grafana后解压。默认端口号为3000,可以直接访问,但是需要账号密码。初始账号为admin,admin。登陆后要求修改。
创建数据源为prometheus,url写127.0.0.1:9090,点击保存显示校验数据源成功
创建可视化面板,或者在加号的import下搜索适配的现成模板代码,设置数据源后创建成功