在 Spring 2.x 之前,SpringBoot 使用 Actuator 模块进行监控,而在 Spring 2.x 之后,SpringBoot 使用了 Micrometer 进行监控。
Spring Boot Actuator 模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP 跟踪等,帮助我们监控和管理 Spring Boot 应用。这个模块是一个采集应用内部信息暴露给外部的模块,上述的功能都可以通过 HTTP 和 JMX 访问。
在 Spring 2.x 之后,Actuator 使用 Micrometer 与这些外部应用程序监视系统集成。这样一来,只需很少的配置即可轻松集成外部的监控系统。
那什么是 Micrometer 呢?
Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,应用程序只需要使用 Micrometer 的通用 API 来收集性能指标即可。Micrometer 会负责完成与不同监控系统的适配工作。这就使得切换监控系统变得很容易。
简单地说,actuator 是真正去采集数据的模块,而 Micrometer 更像是一个适配器,将 actuator 采集到的数据适配给各种监控工具。
作为SpringBoot的四大核心之一,Actuator让你时刻探知SpringBoot服务运行状态信息,是保障系统正常运行必不可少的组件。
spring-boot-starter-actuator提供的是一系列HTTP或者JMX监控端点,通过监控端点我们可以获取到系统的运行统计信息,同时,我们可以自己选择开启需要的监控端点,也可以自定义扩展监控端点。
Actuator通过端点对外暴露的监控信息是JSON格式数据,我们需要使用界面来展示,目前使用比较多的就是Spring Boot Admin或者Prometheus + Grafana的方式;
Spring Boot 提供了所谓的 endpoints (下文翻译为端点)给外部来与应用程序进行访问和交互。
打比方来说,/health 端点 提供了关于应用健康情况的一些基础信息。metrics 端点提供了一些有用的应用程序指标(JVM 内存使用、系统CPU使用等)。
这些 Actuator 模块本来就有的端点我们称之为原生端点。根据端点的作用的话,我们大概可以分为三大类:
应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与Spring Boot应用密切相关的配置类信息。
度量指标类:获取应用程序运行过程中用于监控的度量指标,比如:内存信息、线程池信息、HTTP请求统计等。
操作控制类:提供了对应用的关闭等操作类功能。
Actuator 提供的所有 endpoint:
此处使用的是SpringBoot 2.2.8
下面介绍几个核心的端点
当我们开启health的健康端点时,我们能够查到应用健康信息是一个汇总的信息,健康信息包含磁盘空间、redis、DB,如果启用监控的这个spring boot应用确实是连接了redis和mysql DB,那actuator就自动给监控起来了,很方便、很有用。
/health原理
Spring boot的健康信息都是从ApplicationContext中的各种HealthIndicator Beans中收集到的,Spring boot框架中包含了大量的HealthIndicators的实现类,当然你也可以实现自己认为的健康状态。
默认情况下,最终的spring boot应用的状态是由HealthAggregator汇总而成的,汇总的算法是:
//配置 always:对所有用户暴露详细信息
management.endpoint.health.show-details=always
{
"status": "UP",
"details": {
"diskSpace": {
"status": "UP",
"details": {
"total": 250685575168,
"free": 172252426240,
"threshold": 10485760
}
},
"redis": {
"status": "UP",
"details": {
"version": "3.2.11"
}
},
"db": {
"status": "UP",
"details": {
"database": "Mysql",
"hello": "Hello"
}
}
}
}
有时候需要提供自定义的健康状态检查信息,你可以通过实现HealthIndicator的接口来实现,并将该实现类注册为spring bean。
你需要实现其中的health()方法,并返回自定义的健康状态响应信息,该响应信息应该包括一个状态码和要展示详细信息。demo 如下
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class MyHealthIndicator implements HealthIndicator {
@Override
public Health health() {
int errorCode = check(); // perform some specific health check
if (errorCode != 0) {
return Health.down().withDetail("Error Code", errorCode).build();
}
return Health.up().build();
}
}
/metrics端点用来返回当前应用的各类重要度量指标,比如:内存信息、线程信息、垃圾回收信息、tomcat、数据库连接池等。
除了使用 metrics 端点默认的这些统计指标外,我们还可以实现自定义统计指标。具体实现以后有机会再详细描述
访问: http://localhost:8080/actuator/heapdump 会自动生成一个 Jvm 的堆文件 heapdump。我们可以使用 JDK 自带的 Jvm 监控工具 VisualVM 打开此文件查看内存快照。
查看线程的情况。 主要展示了线程名、线程ID、线程的状态、是否等待锁资源、线程堆栈等信息。就是可能查看起来不太直观。
默认的端点虽然可以满足大多数的需求,但一些特殊的需求还是需要能够支持自定义端点的。
自定义 Endpoint 端点,只需要在我们的新建Bean上使用 @Endpoint 注解即可, Bean 中的方法就可以通过 JMX 或者 HTTP 公开。
// id属性代表新增的端点名称
// 利用@ReadOperation @WritOperation注解,在端点中添加信息
@Component
@Endpoint(id = "myservice")
public class MyServiceEndPoint {
@ReadOperation
public Map getDockerInfo () {
//端点的读操作
return Collections.singletonMap("dockerInfo", "docker start...");
}
@WriteOperation
private void restartDocker(){
System.out.println("docker restarted....");
}
}
org.springframework.boot
spring-boot-starter-actuator
Prometheus: 是一款开源的系统和服务监控系统,属于云原生计算基金会项目。它可以通过设置的时间间隔从配置的目标系统采集指标数据,保存指标数据(时序数据库),评估规则表达式,显示结果,并在检测到指定条件时触发警报。
虽然Prometheus也支持可视化界面展示,但是界面不美观,更多人选择使用Grafana来展示Prometheus的监控数据。
Grafana:Grafana是一款开源的数据可视化工具。它提供对数据指标的查询、可视化和告警,它可以实现无论数据存储在哪里,都可以与您的团队创建、探索和共享十分美观的仪表盘数据可视化,并培养数据驱动的文化。
我们使用Docker来安装需要的Prometheus+Grafana,通常情况下,我们会根据业务需求来安装需要的组件,在这里健康监控系统也是这样,如果我们的微服务部署在Docker容器中,那么我们需要安装cAdvisor组件来监控Docker相关数据指标,如果要采集系统环境数据,那么需要安装 Node Exporter 组件,而且告警组件也是和Prometheus分开的,如果需要告警功能,同样需要安装Alertmanager组件,这一连串组件的组合,我们可以使用docker-compose来安装我们需要所有组件。
这里只做简单介绍,不搞这么复杂了。prometheus都可以支持
我们可以在应用端安装下列组件,
更多exporter可在prometheus官网下载
微服务引入prometheus依赖
......
......
io.micrometer
micrometer-registry-prometheus
1.5.14
# 性能监控端点配置
management:
security:
enabled: true
role: ACTUATOR_ADMIN
endpoint:
health:
show-details: always
endpoints:
enabled-by-default: true
web:
base-path: /actuator
exposure:
include: '*'
metrics:
tags:
application: ${spring.application.name}
export:
prometheus:
enabled: true
server:
servlet:
context-path: /actuator
health:
mail:
enabled: false
1、编辑prometheus配置文件prometheus.yml,设置采集微服务端点scrape_configs:
scrape_configs:
- job_name: 'actuator-gitegg'
basic_auth:
username: user
password: password
scrape_interval: 15s
scrape_timeout: 10s
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['192.168.0.2:80','192.168.0.2:8002']
2、重启prometheus,访问界面status -> targets,查看采集端点状态。