SpringBoot 的监控机制
在 Spring 2.x 之前,SpringBoot 使用 Actuator 模块进行监控,而在 Spring 2.x 之后,SpringBoot 使用了 Micrometer 进行监控。actuator 是真正去采集数据的模块,而 Micrometer 更像是一个适配器,将 actuator 采集到的数据通过提供通用的API暴露给各种监控工具。
启用Spring Boot Actuator
- 添加依赖
<!-- actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 配置端点 (
application.yml)
我们可以通过management.endpoints.web.exposure.include选择暴露哪些监控点
management.endpoints.web.exposure.include=* 暴露所有监控点
management.endpoints.web.exposure.include=health,prometheus,metrics 仅暴露health,prometheus,metrics监控点
management:
endpoints:
web:
exposure:
include: "health,metrics,info"
endpoint:
health:
show-details: always
- 测试
Actuator 默认所有的监控点路径都在 /actuator/*
curl http://localhost:8080/actuator/health
{
"status": "UP",
"components": {
"db": { "status": "UP" },
"diskSpace": { "status": "UP" }
}
}
集成Prometheus
我们知道actuator是采集数据模块,那采集的数据metrcis就需要暴露出来提供给监控使用,所以需要有监控系统负责统一收集和处理这些数据,还要有可视化UI工具去展示数据。我们可以使用Prometheus作为系统监控来采集数据,使用Grafana来展示图表。所以actuator需要提供能给Prometheus调用的接口。
如何集成Prometheus?
- 多引入一个Maven依赖
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<scope>runtime</scope>
</dependency>
- 配置文件添加配置
management.endpoints.enabled-by-default=false: 默认情况下,所有 Actuator 端点都被禁用。需要显式启用特定端点才能访问
management.endpoints.web.exposure.include=health,prometheus,metrics: 显式列出可通过 Web 访问的 Actuator 端点,包括健康检查 (/health) , Prometheus (/prometheus),指标(/metrics)
management.endpoint.prometheus.enabled=true
management.endpoint.health.enabled=true
management.endpoint.metrics.enabled=true
- 启动服务
需要注意的是有两种metrics。一种是actuator的metrics,主要是jvm相关指标,另一种才是给Prometheus的metrics。这两种metrics接口默认URL路径如下:
- 获取服务acutor metrics:curl localhost:8162/actuator/metrics
2. 获取给prometheus采集的metrics:curl localhost:8162/actuator/prometheus
- 健康检查:curl localhost:8162/actuator/health
有时我们为了规范,希望将接口URL做更改,想将Actuator 端点进行路径映射:
- 暴露给prometheus采集metrics: ”/actuator/prometheus“ ——> "/metrics"
- Actuator采集的metrics: ”/actuator/metrics“ ——> "/actuator/metrics"(相当于不变)
- 健康检查: ”/actuator/health“ ——> "/ping"
- 配置更改如下:
management:
endpoints:
web:
exposure:
include: health,prometheus //端点打开
base-path: "/"
path-mapping:
health: "/ping" //路径重写
prometheus: "/metrics"
metrics: "/actuator/metrics"
展示效果:
- Actuator采集的metrics:curl localhost:8162/actuator/metrics
- 暴露给prometheus采集metrics:curl localhost:8162/metrics
- 健康检查:curl localhost:8162/ping
在这里给出
自定义指标监控
如何自定义指标让Prometheus采集可以参考下面链接,这个在日常工作是挺好用的。举几个例子:比如下单总次数;比如我要做线程池监控,想要在Grafana DashBoard面板上看到关于线程池参数的变化;比如我想要知道某个调某个第三方接口的请求耗时,可以统计耗时然后定义成metrics让Prometheus采集;
【留待以后实践时补充】