返回 导航

SpringBoot / Cloud

hangge.com

SpringBoot - Actuator应用监控使用详解3(metrics端点:度量指标信息展示)

作者:hangge | 2020-02-16 08:10

七、度量指标信息展示

    Metrics 翻译成中文就是度量的意思。当我们需要为某个系统某个服务做监控、做统计,就需要用到 Metrics。比如一个图片压缩服务,我需要统计它:
  • 每秒钟的请求数是多少(TPS)?
  • 平均每个请求处理的时间?
  • 请求处理的最长耗时?
  • 等待处理的请求队列长度?
这些统计功能我们都可以通过 metrics 端点来实现。

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 种基本的度量类型:GaugeCounterTimerSummary。下面分别进行介绍。

1,Gauge(计量器)

Gauge(计量器)是最简单的度量类型,只有一个简单的返回值,他用来记录一些对象或者事物的瞬时值。

(1)假设我们在一个 Contoller 使用一个类型为 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(计数器)简单理解就是一种只增不减的计数器。它通常用于记录服务的请求数量、完成的任务数量、错误的发生数量等等。

(1)为方便使用首先我们自定义一个计数器服务:
@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(计时器)可以同时测量一个特定的代码逻辑块的调用(执行)速度和它的时间分布。简单来说,就是在调用结束的时间点记录整个调用块执行的总时间,适用于测量短时间执行的事件的耗时分布,例如消息队列消息的消费速率。

(1)假设我们在一个 Contoller 使用 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,但是记录的值是需要直接指定,而不是通过测量一个任务的执行时间。

(1)假设我们在一个 Contoller 使用 Summary 来连续记录三次值:
@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)

回到顶部