Spring Boot Actuator
Spring Boot 包含许多附加功能,可帮助您在将应用程序投入生产时监控和管理应用程序。您可以选择使用 HTTP 端点或 JMX 来管理和监控您的应用程序。审核、运行状况和指标收集也可以自动应用于您的应用程序。
简介
Spring Boot Actuator模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP跟踪等,帮助我们监控和管理Spring Boot应用。这个模块是一个采集应用内部信息暴露给外部的模块,上述的功能都可以 通过HTTP 和JMX访问。
因为暴露内部信息的特性,Actuator也可以和一些外部的应用监控系统整合(Prometheus,Graphite,DataDog,Influx, Wavefront, New Relic等)。这些监控系统提供了出色的仪表板,图形,分析和警报,可帮助你通过一个统一友好的界面,监视和管理你的应用程序。
Actuator使用Micrometer与这些外部应用程序监视系统集成。这样一来,只需很少的配置即可轻松集成外 部的监控系统。
提供大量的监控端点(endpoints),主要作用是用于监控与管理(有效减少了监控代码的开发量)
快速应用
<!-- spring boot actuator监控 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
它提供了很多监控和管理你的spring boot应用的HTTP或者JMX端点,并且你可以有选择地开启和关闭部分功能。当你的spring boot应用中引入依赖之后,将自动拥有审计、健康检查、Metrics监控功能。
http://localhost:8080/actuator
监控端点(EndPoints)分类
Spring Boot提供了所谓的endpoints(下文翻译为端点)给外部来与应用程序进行访问和交互。
根据端点的作用的话,我们大概可以分为三大类:
- 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与Spring Boot应用密切相关的配置类信息。
- 度量指标类:获取应用程序运行过程中用于监控的度量指标,比如:内存信息、线程池信息、HTTP请求统计等。
- 操作控制类:提供了对应用的关闭等操作类功能。
需要注意的就是:
- 每一个端点都可以通过配置来单独禁用或者启动
- 不同于Actuator 1.x,Actuator 2.x的大多数端点默认被禁掉。Actuator
2.x中的默认端点增加了/actuator 前缀。默认暴露的两个端点为/actuator/health和/actuator/info
概念
http://localhost:8080/actuator
/actuator/health: 健康检查,显示应用健康信息
.
/actuator/info: 应用信息,展示了关于应用的一般信息,这些信息从编译文件比如META-INF/build-info.properties或者Git文件比如git.properties或者任何环境的property中获取。
测试 http://localhost:8080/actuator/health
status值为UP说明应用是健康的,如果应用不健康,将会显示DOWN。
默认情况下,只有health和info 通过HTTP暴露出来,所以/actuator 只展示了health 和 info endpoints.
.
如何暴露其他的endpoints ?
常用的端点列表
端点(endpoints)暴露配置
我们可以通过以下配置,来配置通过JMX和HTTP 暴露的端点。
可以打开所有的监控点
management.endpoints.web.exposure.include=*也可以选择打开部分,"*"代表暴露所有的端点,如果指定多个端点,用","分开
management.endpoints.web.exposure.exclude=beans,traceActuator 默认所有的监控点路径都在/actuator/*,当然如果有需要这个路径也支持定制。
management.endpoints.web.base-path=/minitor
设置完重启后,再次访问地址就会变成/minitor/*.
*在 YAML 中具有特殊含义,因此如果要包含(或排除)所有端点,请务必添加引号。
如果您的应用程序公开暴露,我们强烈建议您也保护您的端点。
重点端点解析
/health端点
/health端点会聚合你程序的健康指标,来检查程序的健康情况。
如redis、rabbitmg、db等组件。当你的项目有依赖对应组件的时候,这些健康指示器就会被自动装配,继而
采集对应的信息。
端点公开的应用健康信息取决于:
management .endpoint .health.show-details=always
management:endpoints:web:exposure:include:'*'endpoint:health:show-details: always
该属性可以使用以下值之一进行配置:
属性值 | 描述 |
---|---|
never | 不展示详细信息,up或者down的状态,默认配置 |
when-authorized | 详细信息将会展示给通过认证的用户。授权的角色可以通过management .endpoint.health.roles 配置 |
always | 对所有用户暴露详细信息 |
按照上述配置,配置成always之后,我们启动项目,访问http://localhost:8080/actuator/health端口
/health 端点有很多自动配置的健康指示器:如redis、rabbitmg、db等组件。当你的项目有依赖对应组件的时候,这些健康指示器就会被自动装配,继而采集对应的信息。
当如上的组件有一个状态异常,应用服务的整体状态即为down。我们也可以通过配置禁用某个组件的健康监测。
management.health.redis.enabled: false
或者禁用所有自动配置的健康指示器:
management.health.defaults.enabled: false
/metrics端点
/metrics 端点用来返回当前应用的各类重要度量指标,比如:内存信息、线程信息、垃圾回收信息、 tomcat、数据库连接池等。
访问 metrics端点:
http://localhost:8080/actuator/metrics
Actuator在这个界面看不到具体的指标信息,只是展示了一个指标列表。为了获取到某个指标的详细信息,我们可
以请求具体的指标信息,像这样:
http://localhost:8080/actuator/metrics/{MetricName}
比如我访问/actuator/metrics/jvm.memory.max ,
/loggers 端点
/loggers 端点暴露了我们程序内部配置的所有logger的信息。我们访问/actuator/loggers 可以看到,
- 1、例如:查看某一个组件服务或某一个应用的日志级别,并对其进行实时的变更。
- 2、loggers endpoint同时提供了在应用运行时改变日志级别的能力,比如你想要改变
com.netflix.discovery.DiscoveryClient的logger等级为DEBUG,可以发送一个POST请求, - 3、动态修改日志级别的功能对于日常排查问题,是一个有利支持。同时可以传递null給configuredLevel来重置 日志等级。
info端点
/info 端点可以用来展示你程序的信息。
info endpoint展示了应用的基本信息,它通过META-INF/build-info.properties来获取编译信息,通过git.properties来获取当前应用的Git版本信息。同时它可以展示任何信息,只要应用环境property中含有info key。 就是一些程序的基础信息。并且你可以按照自己的需求在配置文件application.yml 中个性化配置(默认情况下,该端点只会返回一个空的JSON内容)
例如一些常用信息配置,包含应用名称、应用描述、应用版本、编码格式、JDK版本等。
info:app:name: acturator-demojava: jdk1.8encoding: utf-8auther: guoweixin
/beans端点
/beans 端点会返回Spring容器中所有bean的别名、类型、是否单例、依赖等信息。
访问http://localhost:8080/actuator/beans,返回如下:
/heapdump 端点
访问:http://localhost:8080/actuator/heapdump会自动生成一个Jvm 的堆文件heapdump。我们可以使用JDK 自带的 Jvm监控工具VisualVM打开此文件查看内存快照。
返回一个GZIP压缩的JVM堆dump
问题:
开发大型Java应用程序的过程中难免遇到内存泄露、性能瓶颈等问题,比如文件、网络、数据库的连接未释放,未优化的算法等。随着应用程序的持续运行,可能会造成整个系统运行效率下降,严重的则会造成系统崩溃。为了找出程序中隐藏的这些问题,在项目开发后期往往会使用性能分析工具来对应用程序的性能进行分析和优化。
简介:
VisualVM是一款免费的性能分析工具。它通过jvmstat、JMX、SA(ServiceabilityAgent)以及Attach API等多种方式从程序运行时获得实时数据,从而进行动态的性能分析。同时,它能自动选择更快更轻量级的技术尽量减少性能分析对应用程序造成的影响,提高性能分析的精度。
VisualVM 的主要功能如何利用获得的数据进行性能分析及调优
VisualVM 是一个性能分析工具,自从JDK 6 Update 7以后已经作为Oracle JDK的一部分,位于JDK根目录的bin 文件夹下。VisualVM自身要在JDK6以上的版本上运行,但是它能够监控JDK1.4以上版本的应用程序
在JDK/bin目录下找到该文件jvisualvm.exe:
导入http://localhost:8080/actuator/heapdump下载的堆文件
返回一个GZIP压缩的JVM堆dump(heapdump)将其后缀名改为: .hprof
分析堆文件中的类占用内存情况和实例数
/threaddump 端点
该端点方便我们在日常定位问题的时候查看线程的情况。主要展示了线程名、线程ID、线程的状态、是否等待锁资源、线程堆栈等信息。就是可能查看起来不太直观。访问
http://localhost:8080/actuator/threaddump返回如下:
/shutdown 端点
这个端点属于操作控制类端点,可以优雅关闭Spring Boot应用。要使用这个功能首先需要在配置文件中开启:
management.endpoint.shutdown.enabled=true
由于 shutdown 接口默认只支持 POST 请求,我们启动项目,向http://localhost:8080/actuator/shutdown
发起 POST 请求。返回信息:
{
"message":"Shutting down, bye..."
}
Spring Security对端点进行安全校验
由于端点的信息和产生的交互都是非常敏感的,必须防止未经授权的外部访问。应用程序中引入Spring Security的依赖,则默认情况下使用基于表单的HTTP身份验证来保护端点。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>