SpringBoot - Actuator应用监控使用详解3(metrics端点:度量指标信息展示)
作者:hangge | 2020-02-16 08:10
七、度量指标信息展示
Metrics 翻译成中文就是度量的意思。当我们需要为某个系统某个服务做监控、做统计,就需要用到 Metrics。比如一个图片压缩服务,我需要统计它:
- 每秒钟的请求数是多少(TPS)?
- 平均每个请求处理的时间?
- 请求处理的最长耗时?
- 等待处理的请求队列长度?
1,查看所有可追踪的度量
(1)metrics 端点用来返回当前应用的各类重要度量指标,比如内存信息、线程信息、垃圾回收信息等。通过 /metrics 接口可以展示出所有可以追踪的度量:(2)各个指标说明如下:
序号 | 参数 | 参数说明 | 是否监控 | 监控手段 | 重要度 |
---|---|---|---|---|---|
JVM | |||||
1 | jvm.memory.max | JVM 最大内存 | |||
2 | jvm.memory.committed | JVM 可用内存 | 是 | 展示并监控堆内存和 Metaspace | 重要 |
3 | jvm.memory.used | JVM 已用内存 | 是 | 展示并监控堆内存和 Metaspace | 重要 |
4 | jvm.buffer.memory.used | JVM 缓冲区已用内存 | |||
5 | jvm.buffer.count | 当前缓冲区数 | |||
6 | jvm.threads.daemon | JVM 守护线程数 | 是 | 显示在监控页面 | |
7 | jvm.threads.live | JVM 当前活跃线程数 | 是 | 显示在监控页面;监控达到阈值时报警 | 重要 |
8 | jvm.threads.peak | JVM 峰值线程数 | 是 | 显示在监控页面 | |
9 | jvm.classes.loaded | 加载 classes 数 | |||
10 | jvm.classes.unloaded | 未加载的 classes 数 | |||
11 | jvm.gc.memory.allocated | GC 时,年轻代分配的内存空间 | |||
12 | jvm.gc.memory.promoted | GC 时,老年代分配的内存空间 | |||
13 | jvm.gc.max.data.size | GC 时,老年代的最大内存空间 | |||
14 | jvm.gc.live.data.size | FullGC 时,老年代的内存空间 | |||
15 | jvm.gc.pause | GC 耗时 | 是 | 显示在监控页面 | |
TOMCAT | |||||
16 | tomcat.sessions.created | tomcat 已创建 session 数 | |||
17 | tomcat.sessions.expired | tomcat 已过期 session 数 | |||
18 | tomcat.sessions.active.current | tomcat 活跃 session 数 | |||
19 | tomcat.sessions.active.max | tomcat 最多活跃 session 数 | 是 | 显示在监控页面,超过阈值可报警或者进行动态扩容 | 重要 |
20 | tomcat.sessions.alive.max.second | tomcat 最多活跃 session 数持续时间 | |||
21 | tomcat.sessions.rejected | 超过 session 最大配置后,拒绝的 session 个数 | 是 | 显示在监控页面,方便分析问题 | |
22 | tomcat.global.error | 错误总数 | 是 | 显示在监控页面,方便分析问题 | |
23 | tomcat.global.sent | 发送的字节数 | |||
24 | tomcat.global.request.max | request 最长时间 | |||
25 | tomcat.global.request | 全局 request 次数和时间 | |||
26 | tomcat.global.received | 全局 received 次数和时间 | |||
27 | tomcat.servlet.request | servlet 的请求次数和时间 | |||
28 | tomcat.servlet.error | servlet 发生错误总数 | |||
29 | tomcat.servlet.request.max | servlet 请求最长时间 | |||
30 | tomcat.threads.busy | tomcat 繁忙线程 | 是 | 显示在监控页面,据此检查是否有线程夯住 | |
31 | tomcat.threads.current | tomcat 当前线程数(包括守护线程) | 是 | 显示在监控页面 | 重要 |
32 | tomcat.threads.config.max | tomcat 配置的线程最大数 | 是 | 显示在监控页面 | 重要 |
33 | tomcat.cache.access | tomcat 读取缓存次数 | |||
34 | tomcat.cache.hit | tomcat 缓存命中次数 | |||
CPU | |||||
35 | system.cpu.count | CPU 数量 | |||
36 | system.load.average.1m | load average | 是 | 超过阈值报警 | 重要 |
37 | system.cpu.usage | 系统 CPU 使用率 | |||
38 | process.cpu.usage | 当前进程 CPU 使用率 | 是 | 超过阈值报警 | |
39 | http.server.requests | http 请求调用情况 | 是 | 显示 10 个请求量最大,耗时最长的 URL;统计非 200 的请求量 | 重要 |
40 | process.uptime | 应用已运行时间 | 是 | 显示在监控页面 | |
41 | process.files.max | 允许最大句柄数 | 是 | 配合当前打开句柄数使用 | |
42 | process.start.time | 应用启动时间点 | 是 | 显示在监控页面 | |
43 | process.files.open | 当前打开句柄数 | 是 | 监控文件句柄使用率,超过阈值后报警 | 重要 |
2,查看某个度量的详细信息
(1)如果要获得每个度量的详细信息,我们需要传递度量的名称到 URL 中,格式如下:/actuator/metrics/{MetricName}
(2)比如下面查看系统 CPU 使用率(system.cpu.usage)这个度量的详细信息:
附:添加自定义的统计指标
除了使用 metrics 端点默认的这些统计指标外,我们还可以实现自定义统计指标。Metrics 提供 4 种基本的度量类型:Gauge、Counter、Timer、Summary。下面分别进行介绍。1,Gauge(计量器)
Gauge(计量器)是最简单的度量类型,只有一个简单的返回值,他用来记录一些对象或者事物的瞬时值。
@RestController public class HelloController { @GetMapping("/hello") public void hello() { Metrics.gauge("user.test.gauge", 3); } }
(2)通过 /actuator/metrics 接口可以看到我们自定义的这个指标:
(3)假设我们访问了 /hello 接口后,再次通过 /actuator/metrics/user.test.gauge 这个自定义度量的消息信息,显示如下:
2,Counter(计数器)
Counter(计数器)简单理解就是一种只增不减的计数器。它通常用于记录服务的请求数量、完成的任务数量、错误的发生数量等等。
@Service public class MyCounterService { static final Counter userCounter = Metrics.counter("user.counter.total", "services", "demo"); public void processCollectResult() { userCounter.increment(1D); } }
(2)然后增加一个 controller,触发这个服务:
@RestController public class HelloController { @Autowired MyCounterService myCounterService; @GetMapping("/hello") public void hello() { myCounterService.processCollectResult(); } }
(3)通过 /actuator/metrics 接口可以看到我们自定义的这个指标:
(4)假设我们访问了 3 次 /hello 接口,再次通过 /actuator/metrics/user.counter.total 这个自定义度量的消息信息,显示如下:
3,Timer(计时器)
Timer(计时器)可以同时测量一个特定的代码逻辑块的调用(执行)速度和它的时间分布。简单来说,就是在调用结束的时间点记录整个调用块执行的总时间,适用于测量短时间执行的事件的耗时分布,例如消息队列消息的消费速率。
注意:在实际生产环境中,可以通过 spring-aop 把记录方法耗时的逻辑抽象到一个切面中,这样就能减少不必要的冗余的模板代码。
@RestController public class HelloController { private Timer timer = Metrics.timer("user.test.timer","timer", "timersample"); @GetMapping("/hello") public void hello() { // 执行createOrder方法并记录执行时间 timer.record(() -> createOrder()); } //模拟方法耗时 private void createOrder() { try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { } } }
(2)假设我们访问了 3 次 /hello 接口,再次通过 /actuator/metrics/user.test.timer 这个自定义度量的消息信息,显示如下:
4,Summary(摘要)
Summary(摘要)用于跟踪事件的分布。它类似于一个计时器,但更一般的情况是,它的大小并不一定是一段时间的测量值。在 micrometer 中,对应的类是 DistributionSummary,它的用法有点像 Timer,但是记录的值是需要直接指定,而不是通过测量一个任务的执行时间。
@RestController public class HelloController { private DistributionSummary summary = Metrics.summary("user.test.summary","summary", "summarysample"); @GetMapping("/hello") public void hello() { summary.record(2D); summary.record(3D); summary.record(4D); } }
(2)假设我们访问 /hello 接口后,再次通过 /actuator/metrics/user.test.summary 这个自定义度量的消息信息,显示如下:
全部评论(0)