有道无术,术尚可求,有术无道,止于术。
本系列Spring Boot版本2.7.0
在IT监控系统简介一文中,介绍过一个成熟的监控系统包含了系统层、中间件及基础设施类、应用层、业务层四个层面的监控,并且包含指标数据采集、指标数据存储、指标数据趋势分析及可视化、告警等功能。
Metrics翻译过来是量度;指标的意思,是指随时间推移产生的一些与监控相关的可聚合数据点。
接下里我们学习下Spring Boot是如何进行应用层面指标采集的。
Spring Boot提供了应用层指标监控,可以诊断性检查应用程序收集的指标。
有了指标数据,就可以实现数据存储、可视化查询、告警,当然这些需要依赖于第三方监控系统。

访问metrics端点,可以看到一些指标项:

访问具体的指标项可获取到对应的指标数据:

可以看到spring-boot-starter-actuator默认是引入了一个Micrometer框架:

Micrometer 是一个用于基于 JVM 的应用程序的指标检测库。旨在为指标收集活动增加很少甚至没有开销,同时最大限度地提高指标工作的可移植性。
有了指标检测和收集,就可以对接应用监控系统,将数据对接入监控系统进行展示。
Spring Boot Actuator 为Micrometer提供依赖管理和自动配置,支持众多监控系统包括:
AppOptics
Atlas
Datadog
Dynatrace
Elastic
Ganglia
Graphite
Humio
Influx
JMX
KairosDB
New Relic
Prometheus
SignalFx
Simple (in-memory)
Stackdriver
StatsD
Wavefront
Prometheus+Grafana监控Spring Boot
Spring Boot 默认提供了很多指标。
自动配置公开应用程序启动时间指标:
application.started.time: 启动应用程序所用的时间。
application.ready.time:应用程序准备好为请求提供服务所需的时间。
访问/actuator/metrics/application.started.time:
{
"name": "application.started.time", // 指标名称
"description": "Time taken (ms) to start the application", // 描述信息
"baseUnit": "seconds", // 时间单位
"measurements": [
{
"statistic": "VALUE",
"value": 2.826 // 启动耗时2.826秒
}
],
"availableTags": [
{
"tag": "main.application.class",
"values": [
"org.pearl.app.App1"// 启动类
]
}
]
}
自动配置通过使用核心 Micrometer 类启用系统指标。系统指标以system.、process.和disk.计量名称发布。
提供了以下系统指标:
CPU 指标
文件描述符指标
正常运行时间指标
可用磁盘空间
可用指标如下:
{
"names": [
"disk.free",
"disk.total",
"process.cpu.usage",
"process.start.time",
"process.uptime",
"system.cpu.count",
"system.cpu.usage",
]
}
访问/actuator/metrics/disk.total:
{
"name": "disk.total",
"description": "Total space for path",
"baseUnit": "bytes",
"measurements": [
{
"statistic": "VALUE",
"value": 3.32862058496E11
}
],
"availableTags": [
{
"tag": "path",
"values": [
"E:\\TD\\project\\my\\study-demo\\."
]
}
]
}
JVM 指标以jvm.计量名称发布。提供了以下 JVM 指标:
各种内存和缓冲池细节
垃圾回收相关统计
线程利用率
加载和卸载的类数
可用指标如下:
{
"names": [
"jvm.buffer.count",
"jvm.buffer.memory.used",
"jvm.buffer.total.capacity",
"jvm.classes.loaded",
"jvm.classes.unloaded",
"jvm.gc.live.data.size",
"jvm.gc.max.data.size",
"jvm.gc.memory.allocated",
"jvm.gc.memory.promoted",
"jvm.gc.overhead",
"jvm.gc.pause",
"jvm.memory.committed",
"jvm.memory.max",
"jvm.memory.usage.after.gc",
"jvm.memory.used",
"jvm.threads.daemon",
"jvm.threads.live",
"jvm.threads.peak",
"jvm.threads.states",
]
}
访问/actuator/metrics/jvm.threads.live:
{
"name": "jvm.threads.live",
"description": "The current number of live threads including both daemon and non-daemon threads",
"baseUnit": "threads",
"measurements": [
{
"statistic": "VALUE",
"value": 25.0 // 存活线程数
}
],
"availableTags": []
}
自动配置为 Logback 和 Log4J2 启用事件指标。
访问/actuator/metrics/logback.events:
{
"name": "logback.events",
"description": "Number of trace level events that made it to the logs",
"baseUnit": "events",
"measurements": [
{
"statistic": "COUNT",
"value": 11.0
}
],
"availableTags": [
{
"tag": "level",
"values": [
"warn",
"trace",
"debug",
"error",
"info"
]
}
]
}
检测所有的ThreadPoolTaskExecutor 、ThreadPoolTaskScheduler Bean对象,度量标签来自于线程池的 Bean 名称。
自动配置启用对Spring MVC控制器和功能处理程序处理的所有请求的进行检测。默认情况下,生成的指标名称为 http.server.requests. 可以通过设置management.metrics.web.server.request.metric-name属性来自定义名称。
比如访问/actuator/metrics/http.server.requests:
{
"name": "http.server.requests",
"description": null,
"baseUnit": "seconds",
"measurements": [
{
"statistic": "COUNT",
"value": 34.0
},
{
"statistic": "TOTAL_TIME",
"value": 0.7422510000000001
},
{
"statistic": "MAX",
"value": 0.0
}
],
"availableTags": [
{
"tag": "exception",
"values": [
"None" // 处理请求时引发的任何异常的简单类名。
]
},
{
"tag": "method", // 请求的方法(例如,GET或POST)
"values": [
"GET"
]
},
{
"tag": "uri",// 请求路径
"values": [
"/actuator/metrics/{requiredMetricName}",
"/actuator/metrics",
"/app1/test"
]
},
{
"tag": "outcome",
"values": [
"CLIENT_ERROR", // 请求的结果,基于响应的状态代码。
"SUCCESS"
]
},
{
"tag": "status", // 响应的 HTTP 状态代码(例如,200或500)
"values": [
"404",
"200"
]
}
]
}
当然也支持Spring WebFlux 。
Tomcat 指标以tomcat.计量名称发布。
"tomcat.sessions.active.current",
"tomcat.sessions.active.max",
"tomcat.sessions.alive.max",
"tomcat.sessions.created",
"tomcat.sessions.expired",
"tomcat.sessions.rejected"
DataSource数据源指标使用前缀为jdbc.connections. ,检测会生成表示池中当前活动、空闲、允许的最大连接数和允许的最小连接数。
"hikaricp.connections",
"hikaricp.connections.acquire",
"hikaricp.connections.active",
"hikaricp.connections.creation",
"hikaricp.connections.idle",
"hikaricp.connections.max",
"hikaricp.connections.min",
"hikaricp.connections.pending",
"hikaricp.connections.timeout",
"hikaricp.connections.usage",
"jdbc.connections.max",
"jdbc.connections.min",
其他还有很多指标,这里就以一一赘述了,如下:
Spring Boot使用Micrometer框架进行指标检测,可以采集CPU、JVM、磁盘、数据库、缓存等指标,然后可以对接第三方监控系统,进行数据存储和可视化UI。