应用程序监控管理
1. Actuator 应用监控快速入门
一、大纲
- Spring Boot Actuator 简介
- Actuator 开启与配置
- 常用监控端点说明
二、Spring Boot Actuator 简介
Spring Boot 作为构建微服务节点的方案,一定要提供全面而且细致的监控指标,使微服务更易于管理!微服务不同于单体应用,微服务的每个服务节点都单独部署,独立运行,大型的微服务项目甚至有成百上干个服务节点。这就为我们进行系统监控与运维提出了挑战。为了应对这个挑战,其中最重要的工作之一就是:微服务节点能够合理的暴露服务的相关监控指标,用以对服务进行健康检查、监控管理,从而进行合理的流量规划与安排系统运维工作!
Spring Boot Actuator 模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP 跟踪等,帮助我们监控和管理 Spring Boot 应用、Bean 加载情况、环境变量、日志信息、线程信息,JVM 堆信息等。这个模块是一个采集应用内部信息暴露给外部的模块,上述的功能都可以通过 HTTP 和 JMX 访问。
Actuator 也可以和⼀些外部的应⽤监控系统整合(Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic 等)。这些监控系统提供了出⾊的仪表板,图形,分析和警报,可帮助你通过⼀个统⼀友好的 界⾯,监视和管理你的应⽤程序。
三、Actuator 开启与配置
新建 boot-actuator 模块
3.1 开启监控
在 Spring Boot 项目中开启 Actuator 非常简单,只需要引入如下的 maven 坐标即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3.2 默认开放访问的监控端点
Spring Boot Actuator 启⽤之后,HTTP 协议下默认开放了两个端点的访问:
- /actuator/health ⽤以监控应⽤状态。返回值是应⽤状态信息,包含四种状态 DOWN(应⽤不正常), OUT_OF_SERVICE(服务不可⽤),UP(状态正常), UNKNOWN(状态未知)。如果服务状态正常,我们访问 http:/host:port/actuator/health 得到如下响应信息:
{
"status": "UP"
}
从上⾯的响应结果看,该监控端点的监控信息⾮常有限,如果我们想让展示信息更加丰富的话,可以做如下配置。
management.endpoint.health.show-details=always
- /actuator/info ⽤来响应应⽤相关信息,默认为空。可以根据我们⾃⼰的需要,向服务调⽤者暴露相 关信息。如下所示,配置属性可以随意起名,但都要挂在 info 下⾯:
info.app-name=spring-boot-actuator-demo
info.description=spring-boot-actuator-demo indexs monitor
3.3 开放端点配置(exposure)
如果我们希望开放更多的监控端点给服务调⽤者,需要配置:开放部分监控端点,端点名称⽤逗号分隔。
## 开放访问的服务端点
management.endpoints.web.exposure.include=beans,env
## 不暴露对外开放的服务端点
management.endpoints.web.exposure.exclude=mappings
开放所有监控端点:
management.endpoints.web.exposure.include=*
星号在 YAML 配置⽂件中中有特殊的含义,所以在 YAML 配置⽂件使⽤星号⼀定要加引号,如下所示:
management:
endpoints:
web:
exposure:
include: "*"
3.4.开启端点配置(enabled)
针对 actuator 提供的服务端点,开启启⽤(enabled)不等于开放访问(include)。
绝⼤部分的监控端点是默认开启的(下图中的 Yes),少部分监控端点默认是不开启的,⽐如:shutdown。
对于默认不启⽤的监控服务端点,⼀定要先开启(enabled),开启的配置⽅法如下:
# shutdown是服务端点名称,可以替换
management.endpoint.shutdown.enabled=true
四、常⽤监控端点说明
Spring Boot Actuator 监控端点的分类
静态配置类:主要是⼀些静态配置信息,⽐如: Spring Bean 加载信息、yml 或 properties 配置信息、环境变量信息、请求接⼝关系映射信息等;
动态指标类:主要⽤于展现程序运⾏期状态,例如内存堆栈信息、请求链信息、健康指标信息等;
操作控制类:主要是 shutdown 功能,⽤户可以远程发送 HTTP 请求,从⽽关闭监控功能。
ID(监控端点名称) | 描述 | 服务是否默认启⽤ |
---|---|---|
auditevents | 应⽤程序的审计事件相关信息 | Yes |
beans | 应⽤中所有 Spring Beans 的完整列表 | Yes |
conditions | (confguration and auto-confgurationclasses)的状态及它们被应用或未被应用的原因 | Yes |
configprops | @ConfigurationProperties 的集合列表 | Yes |
env | Spring 的 ConfigurableEnvironment 的属性 | Yes |
flyway | flyway 数据库迁移路径,如果有的话 | Yes |
liquibase | Liquibase 数据库迁移路径,如果有的话 | Yes |
metrics | 应⽤的 metrics 指标信息 | Yes |
mappings | 所有@RequestMapping 路径的集合列表 | Yes |
scheduledtasks | 应⽤程序中的计划任务 | Yes |
sessions | 允许从 Spring 会话支持的会话存储中检索和删除(retrieval and deletion)用户会话.使用 Spring Session 对反应性 Web 应用程序的支持时不可用 | Yes |
shutdown | 允许应⽤以优雅的⽅式关闭(默认情况下不启⽤) | No |
threaddump | 线程名、线程 ID、线程的状态、是否等待锁资源、线程堆栈等信息 | Yes |
httptrace 显示 | HTTP 跟踪信息(默认显示最后 100 个 HTTP 请求-响应交换) | Yes |
如果使⽤ web 应⽤(Spring MVC, Spring WebFlux, 或者 Jersey),还可以使⽤以下端点:
ID (监控端点名称) | 描述 | 默认启⽤ |
---|---|---|
heapdump | 返回⼀个 GZip 压缩的 hprof 堆 dump ⽂件 | Yes |
jolokia | 通过 HTTP 暴露 JMX beans(当 Jolokia 在类路径上时,WebFlux 不可用) | Yes |
logfile | 返回日志文件内容(如果设置了 logging.file 或 logging。path 展性的话),支持使用 HTTPRange 头接收日志文件内容的部分信息 | Yes |
prometheus | 以可以被 Prometheus 服务器抓取的格式显示 metrics 信息 | Yes |
2. SpringBootAdmin 界面化监控
在之前的内容中,我们学习了如何使用 Spring Boot Actuator 对单个 Spring Boot 应用进行监控。通过浏览器访问 url 可以各个监控应用端点,可以知道应用的运行状态信息。但是这种方式返回的数据都是 JSON 的格式,各种指标需要单独访问查看。我们迫切希望有一种方式:可以通过方便地通过鼠标点击和友好的 U!界面的展现方式查看应用的各种运行指标。Spring Boot Admin 应运而生!
⼀、Spring Boot Admin 介绍
Spring Boot Admin 是⼀个针对 Spring Boot Actuator 的 JSON 数据响应结果进⾏ UI 美化封装的监控⼯具
通过 Spring Boot Admin,可以在可视化⻚⾯中浏览所有被监控的 spring-boot 项⽬的 Actuator 运⾏时信息,甚⾄还可以直接修改 logger 的 level
- Spring Boot Admin 包括客户端和服务端两个部分,⼀个服务端可以展示多个客户端的监控结果:
- 客户端:即需要监控的应⽤服务,需集成 spring-boot-admin-starter-client,通过 HTTP 协议注册到 Spring Boot Admin 服务端,从⽽进⾏集中展示。(也可以结合 Spring Cloud 服务注册中⼼)
- 服务端:访问客户端的 Actuator 运⾏时数据,并使⽤ UI 界⾯进⾏展示。是⼀个独⽴的 Spring Boot 应⽤,需集成 spring-boot-admin-starter-server
⼆、创建 SpringBoot Admin 服务端
新建⼀个模块:boot-admin ,maven 坐标引⼊
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
</dependency>
在项⽬启动类上⾯加上@EnableAdminServer 注解
@EnableAdminServer
@SpringBootApplication
public class BootActuatorAdminApplication {
public static void main(String[] args) {
SpringApplication.run(BootLaunchActuatorAdminApplication.class, args);
}
}
指定访问端⼝
server:
port: 8081
访问 http://localhost:8081/
,因为⽬前没有任何的客户端应⽤注册上来,所以界⾯上没有相关的展示信息。
三、集成 SpringBoot Admin 客户端
在我们之前的项⽬ boot-actuator ⾥⾯引⼊下⾯的依赖,作为被 SpringBoot Admin 监控的客户端存在。
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>
进⾏ application.yml 配置
spring:
boot:
admin:
client:
url: http://localhost:8081
management:
endpoint:
health:
show-details: always
endpoints:
web:
exposure:
include: "*"
spring.boot.admin.client.url 体现的是服务端的访问地址,也就是监控注册的地址。
当客户端注册到 spring boot admin 服务端之后,admin 服务端就会访问客户端应⽤的”/actuator”访问端点信息,因为我们为 boot-launch 配置了⽤户密码的访问权限(上⼀节),所以需要将⽤户名密码告知服务端,它才能正确的获取”/actuator”访问端点信息。这就是 metadata.user 配置段的作⽤
另外,为了让 Spring Boot Admin 展示的内容更加丰富,我们将所有的服务端点都开放出来。如果不开放,spring boot admin 只能获取健康检查”/health”和“/info”两个默认开放访问的基础信息,也就失去了使⽤ Spring Boot Admin 的意义。
再次访问 http://localhost:8081/
,这次展示的监控信息内容就很多了: