这篇文章中,我们将对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}.enabledmanagement.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 入门与实践


文章作者: 沉迷思考的鱼
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 沉迷思考的鱼 !
评论
 上一篇
工作流引擎Activiti快速入门 工作流引擎Activiti快速入门
Activiti是一个用Java编写的开源工作流引擎,可以执行BPMN 2.0中描述的业务流程。Activiti是Alfresco的Alfresco Process Services (APS)的基础,而Alfresco是Activiti项
2019-02-24
下一篇 
[转载]简话开源协议 [转载]简话开源协议
一直对 Github 的开源协议没有明确认识,直到有一天,也想搞个开源项目。随之而来的问题是:如何选择,如何在这个到处撕比的时代用武器维护劳动成果? 一、了解协议作为第一步,我们首先需要知道什么是协议。协议的英文:License 是软件的
2019-01-08 沉迷思考的鱼
  目录