Spring 引导执行器 - MAX 属性

Spring Boot Actuator - MAX property

我正在使用 Spring Boot Actuator 依赖项来深入了解应用程序。为此,我使用了 Spring Boot Admin。客户端-服务器的配置工作正常。我必须测量将要执行的端点的计数、总时间、最大值。

uri:/user/asset/getAllAssets
TOTAL_TIME: 831ms
MAX: 0ms 

uri:/user/getEmployee/{employeeId}
TOTAL_TIME: 98ms
MAX: 0ms

为什么MAX(时间)是0而TOTAL_TIME:是Xms

当我执行泛化形式时

localhost:8889/actuator/metrics/http.server.requests 我得到 MAX 为 3.00..

我也看过 production-ready-features 但找不到任何关于 MAX 是如何计算的或它代表什么的描述

备注: 随着请求数量的增加,COUNT,TOTAL_TIME也在增加,但MAX有时会减少(详见请求1,请求2)

请求 1:http.server.requests

 {
        "name": "http.server.requests",
        "description": null,
        "baseUnit": "seconds",
        "measurements": [
            {
                "statistic": "COUNT",
                "value": 597
            },
            {
                "statistic": "TOTAL_TIME",
                "value": 144.9057076
            },
            {
                "statistic": "MAX",
                "value": 3.0002913
            }
        ],
        "availableTags": [
            {
                "tag": "exception",
                "values": [
                    "None"
                ]
            },
            {
                "tag": "method",
                "values": [
                    "GET"
                ]
            },
            {
                "tag": "uri",
                "values": [
                    "/actuator/metrics/{requiredMetricName}",
                    "/**/favicon.ico",
                    "/actuator",
                    "/user/getEmployee/{employeeId}",
                    "/user/asset/getAllAssets",
                    "/actuator/health",
                    "/actuator/info",
                    "/actuator/env/{toMatch}",
                    "/actuator/metrics",
                    "/**"
                ]
            },
            {
                "tag": "outcome",
                "values": [
                    "CLIENT_ERROR",
                    "SUCCESS"
                ]
            },
            {
                "tag": "status",
                "values": [
                    "404",
                    "200"
                ]
            }
        ]
    }

更新

localhost:8889/actuator/metrics/http.server.requests?tag=uri:/user/getEmployee/2

Response 404(我已经执行了/user/getEmployee/2,然后才请求actuator)


localhost:8889/actuator/metrics/http.server.requests?tag=uri:/user/getEmployee/{employeeId}

响应 400


localhost:8889/actuator/metrics/http.server.requests?tag=uri:/user/asset/getAllAssets

{
    "name": "http.server.requests",
    "description": null,
    "baseUnit": "seconds",
    "measurements": [
        {
            "statistic": "COUNT",
            "value": 1
        },
        {
            "statistic": "TOTAL_TIME",
            "value": 0.8311609
        },
        {
            "statistic": "MAX",
            "value": 0
        }
    ],
    "availableTags": [
        {
            "tag": "exception",
            "values": [
                "None"
            ]
        },
        {
            "tag": "method",
            "values": [
                "GET"
            ]
        },
        {
            "tag": "outcome",
            "values": [
                "SUCCESS"
            ]
        },
        {
            "tag": "status",
            "values": [
                "200"
            ]
        }
    ]
}

请求 2:http.server.requests

localhost:8889/actuator/metrics/http.server.requests

{
    "name": "http.server.requests",
    "description": null,
    "baseUnit": "seconds",
    "measurements": [
        {
            "statistic": "COUNT",
            "value": 3346
        },
        {
            "statistic": "TOTAL_TIME",
            "value": 559.7992767999998
        },
        {
            "statistic": "MAX",
            "value": 2.3612968
        }
    ],

您可以使用根 /actuator/metrics/http.server.requests 调用的响应中定义的 ?tag=url:{endpoint_tag} 查看各个指标。 measurements 值的详细信息是;

  • COUNT: 每秒呼叫速率。
  • TOTAL_TIME:记录的次数总和。以监控系统基本时间单位上报
  • MAX: The maximum amount recorded. When this represents a time, it is reported in the monitoring system's base unit of time.

给定 here, also here.


您看到的差异是由于计时器的存在。这意味着在一段时间后,当前定义的任何标记指标的 MAX 值都可以重置回 0。您可以向 /user/asset/getAllAssets 添加一些新调用,然后立即调用 /actuator/metrics/http.server.requests 以查看给定标签的非零 MAX 值吗?

这是因为为每个较小的周期获取 MAX 指标背后的想法。当您看到这些指标时,您将能够在很长一段时间内获得 MAX 个值的数组,而不是单个值。

您可以在 Micrometer 源代码中看到这一点。有一个 rotate() 方法专注于重置 MAX 值以创建上述行为。

您可以看到每次 poll() 调用都会调用它,每隔一段时间就会触发一次以收集指标。

  • MAX代表什么

MAX 表示执行端点所花费的最长时间。

针对 /user/asset/getAllAssets

的分析
COUNT  TOTAL_TIME  MAX
5      115         17
6      122         17  (Execution Time = 122 - 115 = 17)
7      131         17  (Execution Time = 131 - 122 = 17)
8      187         56  (Execution Time = 187 - 131 = 56)  
9      204         56  From Now MAX will be 56 (Execution Time = 204 - 187 = 17)  

  • 如果我们对特定端点的请求数量较少(或 1 个请求),MAX 是否会为 0?

没有特定端点的请求数不影响MAX


  • 当MAX为0时

Timer设置值为0。当端点未被调用或执行一段时间时,Timer将MAX设置为0。这里大约计时器值为 2.30 分钟(150 秒)


  • 我是如何确定计时器值的?

为此,我采集了 6 个样本(对同一个端点执行了 6 次)。为此,我确定了调用端点的时间与 MAX 设置回零的时间之间的 时间差

DistributionStatisticConfig.expiry(Duration.ofMinutes(2)).bufferLength(3) 如果在到期时间或旋转时间之间没有发出请求,则将某些测量值设置为 0。


MAX 属性属于enum Statistic which is used by Measurement (在测量中我们得到 COUNT,TOTAL_TIME,MAX)

public static final Statistic MAX

The maximum amount recorded. When this represents a time, it is reported in the monitoring system's base unit of time.


备注: 这是来自特定端点的指标的情况(此处 /actuator/metrics/http.server.requests?tag=uri:/user/asset/getAllAssets)。

对于 actuator/metrics/http.server.requests

的概括指标

正如您从请求 1 和请求 2(有问题)中看到的那样,MAX 已减少(从 3.0002913 到 2.3612968) 因此可能因为某些端点的 MAX由于计时器而被设置回 0。在我看来,/http.server.requests 的 MAX 将与特定端点相同。 (但可以肯定的是,对此进行调查)

MAX 指标是滚动最大值。所以它表示滚动中的最大测量值 window.

例如,如果您要每分钟抓取一次指标:

          Total    Count   Max
Minute 1    100        1   100  
Minute 2    500      101    90
Minute 3   4500     1000    10
Minute 4   4500     1000     0

第 1 分钟你有 1 个请求,总共 100 毫秒,所以平均持续时间为 100 毫秒,最慢(最大)为 100 毫秒

在第 2 分钟,总数增加了 400(因为总数是累积的)并且计数增加了 100。所以平均值是 4 毫秒。然而,由于最大值为 90 毫秒,因此您知道虽然在那一秒内您的大部分请求都很快,但仍有一些请求较慢。

在第 3 分钟,您又收到了 899 个请求(计数),总数增加了 4000 毫秒。 (4000/899 = ~4.4ms) 所以你的平均测量值为 4.4ms,最大值为 10ms。

因此 MAX 的目的是测量最差的离群值,以便您了解代码执行的一致性。

查看第 4 分钟,总数和计数没有增加,因为没有请求。既然没有请求,那么就不可能有 'slowest' 请求 MAX,这就是 MAX 为 0 的原因。