【问题标题】:Spring Boot Actuator - MAX propertySpring Boot Actuator - MAX 属性
【发布时间】:2019-07-29 04:25:10
【问题描述】:

我正在使用 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

响应 404 (我在请求执行器之前已经执行了 /user/getEmployee/2)


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
        }
    ],

【问题讨论】:

  • 你能检查一下localhost:8889/actuator/metrics/http.server.requests?tag=uri:/user/getEmployee/{employeeId}localhost:8889/actuator/metrics/http.server.requests?tag=uri:/user/asset/getAllAssets吗,它们应该和MAX = 0的那个屏幕一样。否则,您会看到带有根调用的所有端点的指标聚合。
  • 感谢@buræquete 的回复,/user/getEmployee/{employeeId} 我得到404,400uri:/user/asset/getAllAssets 相同的结果MAX as 0
  • @buræquete 随着请求数量的增加,COUNT,TOTAL_TIME 也在增加,但 MAX 有时会减少(请参阅请求 1,请求 2 了解详细信息),您能告诉我如何MAX是计算出来的还是代表什么,谢谢

标签: java spring spring-boot spring-boot-actuator spring-boot-admin


【解决方案1】:

MAX 指标是滚动最大值。所以它代表了滚动窗口中的最大测量值。

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

          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 分钟,总数和计数没有增加,因为没有请求。由于没有请求,因此不可能有对 MAX 的“最慢”请求,这就是 MAX 为 0 的原因。

【讨论】:

  • 很高兴看到您的回答,是的,您是对的,如果我们没有对到期时间或轮换时间提出任何要求,那么在该持续时间之后,MAX 将为 0。
  • 我发现 DistributionStatisticConfig 有 .expiry(Duration.ofMinutes(2)).bufferLength(3) 如果在到期时间或轮换之间没有提出请求,它会将一些测量值设置为 0时间。是旋转MAX窗口的代码吧?
  • 我不确定,因为我自己没有尝试过调整该属性。我相信它是可配置的,所以我认为您找到了正确的,尽管我不确定 bufferLength(3) 部分。
【解决方案2】:

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

  • COUNT:每秒调用次数。
  • TOTAL_TIME:记录的时间总和。以监控系统的基本时间单位报告
  • MAX:记录的最大金额。当这表示一个时间时,它以监控系统的基本时间单位报告。

如给定here,也是here


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

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

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

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

【讨论】:

  • 是的,没有适当的文档。除此之外,您能否澄清一下为什么我为localhost:8889/actuator/metrics/http.server.requests?tag=uri:/user/getEmployee/2 得到 404 或者我们如何查看具有路径变量的端点的指标
  • @PatelRomil 您应该使用它在控制器中的定义方式,而不是像2 这样的硬编码值,例如/user/getEmployee/{employeeId},不知道为什么你会得到 400,你可以在默认 /http.server.requests 响应的 availableTags 中看到
  • @RequestMapping(value="/user/getEmployee/{employeeId}",method=RequestMethod.GET) public ResponseEntity<User> getUser(@PathVariable("employeeId") BigInteger employeeId ),获取 ID 为 COUNT 的个人资料视图可能会有所帮助
  • @PatelRomil 你不能用/metrics 端点做到这一点,除非你添加一些我认为的自定义逻辑。您应该可以使用localhost:8889/actuator/metrics/http.server.requests?tag=uri:/user/getEmployee/{employeeId} 尝试从不同的环境中调用它,也许您在其中添加了一些未接受的字符? 400 不是有效 URL 的正常错误响应
  • 是的,我已经从/http.server.requests 复制,但没有运气。谢谢你的时间
【解决方案3】:
  • 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,由Measurement 使用 (在测量中我们得到 COUNT、TOTAL_TIME、MAX)

公共静态最终统计MAX

记录的最大数量。当这代表一个时间时,它是 以监控系统的基本时间单位报告。


注意事项: 这是特定端点(此处为/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 将与特定端点相同。 (但确定,正在调查)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-01
    • 2018-10-15
    • 2018-06-16
    • 1970-01-01
    • 2015-04-02
    • 2016-05-03
    • 2017-09-10
    • 2016-06-01
    相关资源
    最近更新 更多