共计 3340 个字符,预计需要花费 9 分钟才能阅读完成。
监控的重要性就不用多说了吧,不要再花功夫开会讨论它的必要性了,当你线上遇到问题,就不会再狐疑监控是节约开发成本的建设。监控让人辞别了靠“猜”来维持的救火现状,它可能留下证据,来撑持咱们后续的剖析。
作为监控的首要指标,服务的存活性,也就是它的健康状况,成为了重中之重。SpringBoot 能够通过简略的参数,来开启健康检查,并可能和支流的监控系统集成起来。
- 监控开启
在 Spring 中,是应用 actuator 组件,来做监控等相干操作。能够在 pom 中退出上面的 starter:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
复制代码
对于 gradle 来说,退出上面这个。
dependencies {compile("org.springframework.boot:spring-boot-starter-actuator")
}
复制代码
拜访/actuator/health
,即可获取我的项目的健康状况。
{"status":"UP"}
复制代码
在 application.yml 文件里,退出如下的内容:
management:
endpoint:
health:
show-details: always
复制代码
再次拜访这个接口,将输入具体的内容。包含 DB 的状态、磁盘状态等。能够看到,最外层的 status,其实是外部各个组件状态的汇合。
{
"status":"UP",
"components":{
"db":{
"status":"UP",
"details":{
"database":"H2",
"validationQuery":"isValid()"}
},
"diskSpace":{
"status":"UP",
"details":{
"total":250685575168,
"free":31373905920,
"threshold":10485760,
"exists":true
}
},
"ping":{"status":"UP"}
}
}
复制代码
- 自定义 Indicator
这些性能,是由 Indicators
来实现的(HealthIndicator)。比方上面这些:
- DataSourceHealthIndicator
- DiskSpaceHealthIndicator
- CouchbaseHealthIndicator
- MongoHealthIndicator
- RedisHealthIndicator
- CassandraHealthIndicator
如果你是用的是组件提供的 starter,这些 Indicator 就会在 /health 接口进行聚合,如果你不想要监控某个组件,能够在配置中把它敞开。
management:
health:
mongo:
enabled: false
复制代码
明确了这个情理,在做一些组件的时候时候,就能够通过这种形式,来提供组件自带的健康检查:只须要实现 HealthIndicator 接口就能够了。代码样例如下:
@Component
@Slf4j
public class X implements HealthIndicator {
@Override
public Health health() {
try {// 查看组件状态异样信息} catch (Exception e) {log.warn("Failed to connect to: {}", URL);
return Health.down()
.withDetail("error", e.getMessage())
.build();}
return Health.up().build();
}
}
复制代码
- 接入监控零碎
更多状况,咱们是心愿把业务监控的数据,应用业余的监控组件收集起来。这个在 SpringBoot 中,能够应用 micrometer
来实现。
以最风行的 prometheus 为例,在 pom 里减少上面的内容。
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
复制代码
当然,咱们也要在 yaml 里配置一些内容。它当初看起来长这个样子:
management:
endpoints:
web:
exposure:
include: health,info,prometheus
endpoint:
health:
show-details: always
复制代码
这时候,拜访/actuator/prometheus
,即可获取 prometheus 格局的监控数据。
相似于上面这种:
jvm_memory_used_bytes{area="heap",id="PS Survivor Space",} 0.0
jvm_memory_used_bytes{area="heap",id="PS Old Gen",} 2.9444904E7
jvm_memory_used_bytes{area="heap",id="PS Eden Space",} 6.829E7
jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 5.917196E7
jvm_memory_used_bytes{area="nonheap",id="Code Cache",} 1.0929088E7
jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 8420512.0
复制代码
在 prometheus 的 target 页面,能够看到上面的信息:
最终在 Grafana 里,长的更加妖艳一些。
那它都能监控一些什么货色呢?咱们来看一下:
- 服务节点根本信息,包含内存 CPU 网络 IO 等
- JVM 堆栈信息
- JVM GC 信息,STW 信息
- 默认 HikariCP 的连接池信息
- HTTP 申请接口信息(最大耗时,QPS 最高)
- Tomcat 容器监控
- Logback 日志打印监控(各级别条数)
- … 其余
能够看到,只须要裸露这么一个接口,就能够对我的项目中的组件,进行比拟全面的掌控。
- 与容器配合
最初一点,因为 SpringBoot 服务,常常会公布到一些容器中,比方 docker。这个时候,就要用到 probes
配置(kube 有雷同的概念)。probes 是探测的意思,用来辨别 Liveness 和 Readiness 两种状态。
最终的配置如下:
management:
health:
probes:
enabled: true
endpoints:
web:
exposure:
include: health,info,prometheus
endpoint:
health:
show-details: always
复制代码
这时候,咱们将在浏览器的接口中获取两个分组,展现如下:
- http://localhost:8080/actuator/health/liveness
- http://localhost:8080/actuator/health/readiness
这两个链接,前者用于判断容器是否应该重启;后者判断服务是否可用,如果可用,将开始承受内部的申请。
End
对于规模比拟小的 SpringBoot 利用来说,应用 SpringBootAdmin 一类的监控,就曾经足够了。但如果你的企业是集中式部署,节点多且变动频繁,一个对立的监控建设平台是十分必要的。
除了 Prometheus,SpringBoot 的 Metrics 还反对以下组件:
- AppOptics
- Atlas
- Datadog
- Dynatrace
- Elastic
- Ganglia
- Graphite
- Humio
- Influx
- JMX
- KairosDB
- New Relic
- Prometheus
- SignalFx
- Simple (in-memory)
- Stackdriver
- StatsD
- Wavefront
你相熟的组件,有没有它的身影呢?
参考:《2020 最新 Java 根底精讲视频教程和学习路线!》
链接:https://juejin.cn/post/690331…