这篇文章中,我们将对Spring Boot Actuator进行全面介绍,使读者清楚什么是Spring Boot Actuator,以及如何合理地使用它。
另外,我们将介绍一些可以和Spring Boot Actuator集成的APM(Application performance management)。
1. 什么是Spring Boot Actuator
Spring Boot Actuator可以帮助开发者在生产环境中监视和管理应用程序,一旦在pom中添加spring-boot-starter-actuator
依赖,Spring Boot将自动集成审计、健康和指标收集等功能到应用程序中。
换句话说,Spring Boot Actuator是我们常说的非功能性的监控管理工具;同时,依托于自动配置的机制,使其能够开箱即用。
Actuator的定义
中文翻译为致动器,是个制造术语,指用于移动或控制某物的机械装置,它可以从小变化中产生大量的运动。笔者理解应该是指Actuator功能虽然较小,但意义重大。
2. 使用方式
只需要在Spring Boot项目中添加如下Starter,即可完成集成并开启Actuator。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
此时启动服务器,然后请求/actuator/health,若返回{“status”:”UP”}代表Actuator已生效。
上述路径中的/actuator
为Actuator的默认根目录,health是一个监控点(endpoint);除了使用HTTP协议访问这些监控点,还可以使用JMX来访问。
Actuator’s endpoints
Spring文档中称上述监控点为“endpoints”,即“端点”,笔者觉得翻译过来应该叫监控点、控制点、或检测点比较好。
Actuator默认集成了23个监控点:
序号 | 名称 | 描述 | 默认开启 |
---|---|---|---|
1 | auditevents | 公开审计事件信息 | Yes |
2 | beans | 列出所有Spring管理的的Beans | Yes |
3 | caches | 公开可用缓存 | Yes |
4 | conditions | 展示所有自动配置的条件,并显示匹配或不匹配的原因 | Yes |
5 | configprops | 展示@ConfigurationProperties 列表 |
Yes |
6 | env | 公开ConfigurableEnvironment 下的属性 |
Yes |
7 | flyway | 展示由Flyway管理的数据库脚本 | Yes |
8 | health | 展示程序的健康信息 | Yes |
9 | httptrace | 展示HTTP轨迹信息,默认显示最后100次 | Yes |
10 | info | 展示应用程序信息 | Yes |
11 | integrationgraph | 显示Spring集成视图 | Yes |
12 | loggers | 显示和修改日志配置文件 | Yes |
13 | liquibase | 显示由Liquibase管理的数据库脚本 | Yes |
14 | metrics | 显示指标信息 | Yes |
15 | mappings | 显示所有被@RequestMapping 拦截的路径 |
Yes |
16 | scheduledtasks | 显示定时任务 | Yes |
17 | sessions | 可以检索或删除会话(Spring管理的会话) | Yes |
18 | shutdown | 发送优雅关闭指令 | No |
19 | threaddump | 下载线程dump文件 | Yes |
20 | heapdump | 下载堆dump文件(只在Web应用下有效) | Yes |
21 | jolokia | 通过HTTP公开JMX Beans(只在Web应用下有效) | Yes |
22 | logfile | 返回日志文件内容(只在Web应用下有效) | Yes |
23 | prometheus | 以Prometheus服务格式公开指标(只在Web应用下有效) | Yes |
Actuator对监控点有两层控制,第一层是启用/禁用,第二层是公开/不公开(JMX和HTTP需要分开指定),只有启用并公开的监控点才可以使用。
启用/禁用的默认值(2.x版本):shutdown被禁用,其它的监控点都启用。
公开/不公开的默认值(2.x版本):HTTP公开info和health,其它不公开;JMX公开所有监控点。
启动/禁用配置格式为management.endpoint.{ID}.enabled
和management.endpoints.enabled-by-default
,示例如下:
# 启用shutdown
management.endpoint.shutdown.enabled=true
# 全部禁用
management.endpoints.enabled-by-default=false
# 启用info
management.endpoint.info.enabled=true
公开/不公开配置格式有四个,分别控制JMX和HTTP
- management.endpoints.jmx.exposure.exclude
- management.endpoints.jmx.exposure.include
- management.endpoints.web.exposure.exclude
- management.endpoints.web.exposure.include
# 在JMX中,公开health和info,此时其它的监控点都不公开
management.endpoints.jmx.exposure.include=health,info
# 在JMX中,公开除了env和beans之外的所有监控点
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,beans
上文虽然列出了所有内置的监控点,但看起来仍然有些空洞,这里尝试从实用功能这个维度来描述一下Spring Boot Actuator。
- 支持自定义endpoint、定制端口、根路径、HTTPS。
- 支持CORS,即跨站资源共享。
- 在health中,支持检查磁盘空间、数据库连接、Mongo DB、Rabbit Server等,也支持检查自定义组件。
- 在info中,支持展示系统配置、git提交信息、构建信息,也支持公示自定义信息。
- 在metrics中,支持监控JVM、CPU、文件描述符、Kafka消费者等指标;同时支持向多个平台推送指标数据,如AppOptics、Influx等;也支持定义指标。
- 在auditevents中,若同时使用了Spring Security,则可以监听用户身份认证失败的事件,系统可以以此为准进行访问限制;也支持自定义的事件。
2. 规避安全问题
毫无疑问,Actuator开放的这些监控点存在很多敏感信息,它们的访问权限需要被严格控制,不能被外部访问到。通常的做法有两个:
- 使用Spring Security的
WebSecurityConfigurerAdapter
定制不同角色的访问权限
@Configuration
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests()
.anyRequest().hasRole("ENDPOINT_ADMIN")
.and()
.httpBasic();
}
}
- 使用
management.server.port
更改Actuator的访问端口,并限制该端口的外网访问权限
management.server.port=8081
3. 与APMs集成
Spring Boot Actuator只提供了监控和数据收集的功能,这些数据的呈现需要单独的系统来支撑,这些系统通常也称为APM(Application performance management)。
如果不打算自研,而是直接集成使用已有的APM相关组件,可以考虑使用下面这些(笔者对此并不熟悉,所以仅列出了一个简单的清单)。
Spring Boot Admin
Spring Boot Admin是为了监控Spring Boot项目,基于Spring Boot Actuator实现的WEB UI,它和Spring Boot Actuator结合的比较好,基本发挥出所有预定义监控点的作用。需要注意的是,它不能存储数据,只能看到监控服务的实时数据。
Prometheus
Prometheus是一套开源的系统监控报警框架。由工作在 SoundCloud的google前员工在2012年创建,并于2015年正式发布。2016年,Prometheus正式加入 Cloud Native Computing Foundation,成为受欢迎度仅次于 Kubernetes 的项目。可以使用一个适配器,与Spring Boot Actuator集成。
StatsD
StatsD就是一个简单的网络守护进程,基于 Node.js 平台,通过 UDP 或者 TCP 方式侦听各种统计信息,包括计数器和定时器,并发送聚合信息到后端服务,如 Graphite。Spring Boot有一个关于将数据导出到StatsD的文档。但是,除了在Spring Boot application module中安装StatsD实例之外,还必须实现一些存根才能使其工作。
Graphite
Graphite是一个开源实时的、显示时间序列度量数据的图形系统。Graphite并不收集度量数据本身,而是像一个数据库,通过其后端接收度量数据,然后以实时方式查询、转换、组合这些度量数据,它可以展示StatsD收集到的数据。
OpenTSDB
OpenTSDB是基于Hbase的分布式的,可伸缩的时间序列数据库。主要用途,就是做监控系统;譬如收集大规模集群(包括网络设备、操作系统、应用程序)的监控数据并进行存储,查询。Spring Boot有一个关于将数据导出到OpenTSDB的文档。
JMXTrans
JMXTrans是一个通过JMX采集java应用的数据采集器,他的输出可以是Graphite、StatsD、Ganglia、InfluxDb等。
Ganglia
Ganglia是UC Berkeley发起的一个开源集群监视项目,设计用于测量数以千计的节点。Ganglia的核心包含gmond、gmetad以及一个Web前端。主要是用来监控系统性能,如:cpu 、mem、硬盘利用率,I/O负载、网络流量情况等,通过曲线很容易见到每个节点的工作状态,对合理调整、分配系统资源,提高系统整体性能起到重要作用。
Jolokia
Jolokia是一个用来访问远程JMXMBeans的崭新方法,与JSR-160连接器不同的是,它使用基于HTTP的JSON格式作为通讯协议,提供JMX批量操作等。Spring Boot支持使用Jolokia通过HTTP导出JMX数据,可以开箱即用,无需额外开发。
Telegraf
Telegraf是一款Go语言编写的metrics收集、处理、聚合的代理,其设计目标是较小的内存使用,通过插件来构建各种服务和第三方组件的metrics收集。Telegraf通过Jolokia集成支持JMX数据检索。它有一个预先制作的输入插件,可以开箱即用。
InfluxDB
InfluxDB是一个开源的时序数据库,使用GO语言开发,特别适合用于处理和分析资源监控数据这种时序相关数据。InfluxDB可以通过插件接收Telegraf返回的指标。它也是开箱即用的,无需二次开发。
Grafana
Grafana是一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器,支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源。
无二次开发的一个方案
Jolokia、Telegraf、InfluxDB、Grafana这四个组件结合使用,可以在不进行二次开发的前提下,实现对Spring Boot Actuator数据的友好展示。
4. 小结
本文主要介绍了Spring Boot Actuator的基本功能,该组件在指标、审计、健康检查等方面做的非常完善,监控点大多都支持灵活扩展;使用时一定要注意安全问题,需要通过各种手段规避安全风险。
另外,Spring Boot Actuator只负责采集数据,采集之后数据的传输和呈现需要依靠其它组件,这方面的开源组件也比较多,如果没有太多的研发预算可以直接使用开源APM。如果是有这方面需求且有研发能力的团队,可以集成开源组件后做一些定制开发,使其满足特定业务需要。
本文并未关注Spring Boot Actuator对应用性能上的影响,这对一个监控体系也是非常重要的,下一篇文章将会就此进行说明。
参考的文章
Spring Boot Actuator: Production-ready features
Spring Boot Actuator
Spring boot metrics monitoring using TICK stack
Near real-time monitoring charts with Spring Boot Actuator, Jolokia and Grafana
Prometheus 入门与实践