一 Spring监控机制
在 Spring 2.x 之前,SpringBoot 使用 Actuator 模块进行监控,而在 Spring 2.x 之后,SpringBoot 使用了 Micrometer 进行监控。
Spring Boot Actuator 模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP 跟踪等,帮助我们监控和管理 Spring Boot 应用。这个模块是一个采集应用内部信息暴露给外部的模块,上述的功能都可以通过 HTTP 和 JMX 访问。
在 Spring 2.x 之后,Actuator 使用 Micrometer 与这些外部应用程序监视系统集成。这样一来,只需很少的配置即可轻松集成外部的监控系统。
Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,应用程序只需要使用 Micrometer 的通用 API 来收集性能指标即可。Micrometer 会负责完成与不同监控系统的适配工作。这就使得切换监控系统变得很容易。
简单地说,actuator 是真正去采集数据的模块,而 Micrometer 更像是一个适配器,将 actuator 采集到的数据适合给各种监控工具。
二 Spring Actuator Demo
添加如下依赖
1 | <dependency> |
添加如下配置
1 | # Actuator Web 访问端口 |
运行项目访问localhost:9096/actuator/health 查看应用健康状态,正常情况返回UP信息
除了提供最基本的健康检查外,actuator 还提供了许多其他的端点(Endpoints)信息。
三 端点暴露配置
不同于 Actuator 1.x,Actuator 2.x 的大多数端点默认被关闭。在查看对应端点之前,需要做好配置。
可以通过以下配置,来配置通过 JMX 和 HTTP 暴露的端点。
属性 | 默认值 |
---|---|
management.endpoints.jmx.exposure.exclude | |
management.endpoints.jmx.exposure.include | * |
management.endpoints.web.exposure.exclude | |
management.endpoints.web.exposure.include | info, health |
我们可以选择打开所有的监控点,例如:
1 | management.endpoints.web.exposure.include=* |
也可以选择打开部分端点,例如下面的配置打开 beans 和 trace 两个端点。
1 | management.endpoints.web.exposure.exclude=beans,trace |
Actuator 默认所有的监控点路径都在 /actuator/*
,当然如果有需要这个路径也支持定制。例如下面的配置将前缀改成了 monitor,那么访问路径就变成了 /monitor/*
。
1 | management.endpoints.web.base-path=/minitor |
这里我们在 application.yml 中加入了如下配置,默认打开所有端点。
1 | management.endpoints.web.exposure.include=* |
接着我们访问地址:localhost:9096/actuator/metrics,可以看到所有的指标地址。
四 常用端点
Spring Boot Actuator 提供了 Endpoints(端点)给外部来与应用程序进行访问和交互。
例如 /health
端点提供了关于应用健康情况的一些基础信息。/metrics
端点提供了一些有用的应用程序指标(JVM 内存使用、系统 CPU 使用等)。
一般来说,端点可以分为几类:
- 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与 Spring Boot 应用密切相关的配置类信息。
- 度量指标类:获取应用程序运行过程中用于监控的度量指标,比如:内存信息、线程池信息、HTTP 请求统计等。
- 操作控制类:提供了对应用的关闭等操作类功能。
1 health端点
/health
端点会聚合程序的健康指标,来检查程序的健康情况。端点公开的应用健康信息取决于参数 management.endpoint.health.show-components
,该属性值可选项为:
属性值 | 描述 |
---|---|
never | 不展示详细信息,up 或者 down 的状态,默认配置 |
when-authorized | 详细信息将会展示给通过认证的用户。授权的角色可以通过management.endpoint.health.roles 配置 |
always | 对所有用户暴露详细信息 |
当项目有依赖对应组件的时候,这些健康指示器就会被自动装配,继而采集对应的信息。
现在我们在 pom.xml 文件中增加 redis 依赖:
1 | <dependency> |
接着在 application.yml 中增加如下参数,允许对所有用户暴露详细信息:
1 | management.endpoint.health.show-components=always |
配置一下redis链接然后启动项目,最终我们再次访问地址:localhost:9096/actuator/health。可以看到 redis 的信息。
我们也可以通过配置禁用某个组件的健康监测。例如下面的配置禁用了 mongodb 的组件健康监测。
1 | management.health.mongo.enabled=false |
或者我们可以禁用所有自动配置的健康指示器:
1 | management.health.defaults.enabled=false |
在应用程序使用到相关功能的情况下,
Spring Boot会自动配置以下HealthIndicators,
这样访问health端点的时候就能看到对应指标:
名称 | 描述 |
---|---|
CassandraHealthIndicator | 检查Cassandra数据库是否已启动 |
CouchbaseHealthIndicator | 检查Couchbase群集是否启动 |
DiskSpaceHealthIndicator | 检查磁盘空间是否不足 |
DataSourceHealthIndicator | 检查是否可以获取到DataSource的连接 |
ElasticsearchHealthIndicator | 检查Elasticsearch群集是否启动 |
InfluxDbHealthIndicator | 检查InfluxDB服务器是否启动 |
JmsHealthIndicator | 检查JMS代理是否启动 |
MailHealthIndicator | 检查邮件服务器是否启动 |
MongoHealthIndicator | 检查Mongo数据库是否已启动 |
Neo4jHealthIndicator | 检查Neo4j服务器是否启动 |
RabbitHealthIndicator | 检查Rabbit服务器是否启动 |
RedisHealthIndicator | 检查Redis服务器是否启动 |
SolrHealthIndicator | 检查Solr服务器是否启动 |
除了使用自动引入的健康指示器之外,我们也可以自定义一个 Health Indicator,只需要实现 HealthIndicator 接口或者继承 AbstractHealthIndicator 类。
例如下面我们创建了一个 CustomHealthIndicator 类,继承了 AbstractHealthIndicator 类,并返回了一些健康信息。
1 |
|
重启应用并访问地址:localhost:9096/actuator/health,可以看到自定义的健康信息。
2 metrics端点
/metrics
端点用来返回当前应用的各类重要度量指标,比如:内存信息、线程信息、垃圾回收信息、tomcat、数据库连接池等。当我们访问:localhost:9096/actuator/metrics 时,会返回 SpringBoot Actuator 的所有可查看端点信息。
可以进一步使用如下格式的 URL 访问到对应的信息:
1 | http://localhost:9096/actuator/metrics/{MetricName} |
例如我想访问 system.cpu.count
这个指标,那么我访问这个链接即可:localhost:9096/actuator/metrics/system.cpu.count,返回值为:
3 loggers端点
/loggers 端点暴露了我们程序内部配置的所有 logger 的信息,访问这个链接就可以看到:localhost:9096/actuator/loggers。
也可以通过下述方式访问某一个 logger
1 | http://localhost:9096/actuator/loggers/{name} |
例如我想访问 Root Logger,就可以访问这个链接:localhost:9096/actuator/loggers/ROOT,返回信息如下:
1 | { |
4 info端点
/info
端点可以用来查看配置文件 application.properties
中 info 节点下的配置信息,默认情况下 application.properties
中并没有 info 节点配置,所以当我们访问 localhost:9096/actuator/info 时会访问空 JSON 串。
接下来在 application.properties
中增加了如下配置:
1 | info.app.name=actuator-test-demo |
再次访问 localhost:9096/actuator/info 会返回 info 节点的信息:
info 端点只会返回 info 节点下的信息,而不会返回其他节点下的信息。
5 beans端点
/beans
端点会返回 Spring 容器中所有 bean 的别名、类型、是否单例、依赖等信息。
当我们访问 localhost:9096/actuator/beans 时,会返回如下信息:
6 heapdump端点
访问 localhost:9096/actuator/threaddump 会返回应用的线程信息,包括线程名、线程 ID、线程的状态、是否等待锁资源、线程堆栈等信息。
7 shutdown端点
这个端点属于操作控制类端点,可以关闭 Spring Boot 应用。要使用这个功能首先需要在配置文件中开启:
1 | management.endpoint.shutdown.enabled=true |
由于 shutdown 接口默认只支持 POST 请求,启动 Demo 项目,向 http://localhost:9096/actuator/shutdown 发起 POST 请求。
五 整合Prometheus
上面用 actuator 暴露应用本身的线程、bean 等信息,但是这些信息还是独立于 Prometheus 之外的。下面将 SpringBoot Actuator 与 Prometheus 结合。
在上面项目的基础上添加Prometheus依赖
1 | <dependency> |
增加配置如下
1 | management.endpoint.metrics.enabled=true |
接着启动项目,访问 localhost:9096/actuator/prometheus 可以看到 SpringBoot 的应用信息都以 Prometheus 的标准形式输出了。
接下来部署到Prometheus中去
添加Prometheus配置
1 | scrape_configs: |
六 添加Grafana监控面板
参考Prometheus学习笔记(三):结合Prometheus和Grafana面板的可视化DEMO | 大头的博客