了解 Spring Boot 执行器`http.server.requests` 指标 MAX 属性

Posted

技术标签:

【中文标题】了解 Spring Boot 执行器`http.server.requests` 指标 MAX 属性【英文标题】:Understanding Spring Boot actuator `http.server.requests` metrics MAX attribute 【发布时间】:2019-11-22 01:03:14 【问题描述】:

有人可以解释以下响应中的 MAX 统计数据指的是什么。我没有在任何地方看到它的记录。

localhost:8081/actuator/metrics/http.server.requests?tag=uri:/myControllerMethod

回复:

  
   "name":"http.server.requests",
   "description":null,
   "baseUnit":"milliseconds",
   "measurements":[  
        
         "statistic":"COUNT",
         "value":13
      ,
        
         "statistic":"TOTAL_TIME",
         "value":57.430899
      ,
        
         "statistic":"MAX",
         "value":0
      
   ],
   "availableTags":[  
        
         "tag":"exception",
         "values":[  
            "None"
         ]
      ,
        
         "tag":"method",
         "values":[  
            "GET"
         ]
      ,
        
         "tag":"outcome",
         "values":[  
            "SUCCESS"
         ]
      ,
        
         "tag":"status",
         "values":[  
            "200"
         ]
      ,
        
         "tag":"commonTag",
         "values":[  
            "somePrefix"
         ]
      
   ]

【问题讨论】:

【参考方案1】:

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

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

如给定here,也是here。


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

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

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

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

【讨论】:

在我的情况下,MAX 始终等于零,与调用端点的次数无关。 @RahulGupta 自您上次调用端点以来有多近?您可以在调用端点后检查MAX 的值吗?打电话时还要确认COUNT的变化,也许你用错误的标签调用/metrics/http.server.requests端点? 是的,我也试过了......但这也没有任何改变。 @RahulGupta 这很奇怪,我在端点上进行了测试,行为是这样的,在上次通话后的一段时间后,MAX 转到0... 你确定@当你打电话时,987654344@ 会增加,但MAX 保持0 ? 我遇到了问题,因为我在控制器方法上自定义了 @Timed。我没有研究过/metrics/http.server.requests 端点,而是在自定义指标端点上,出现了MAX 的问题。当我禁用自定义端点时,我看到 MAX 按预期工作。知道需要做什么才能使MAX 处理自定义的“@Timed”注释吗?【参考方案2】: 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 (参见 Spring Boot Admin 的图片)


当 MAX 为 0 时

Timer 将值设置为 0。当端点没有被调用或执行一段时间 Timer 将 MAX 设置为 0。这里 近似的计时器值是 2 分钟(120秒)

DistributionStatisticConfig.expiry(Duration.ofMinutes(2)). 如果在到期时间或轮换时间之间没有提出请求,则将一些测量值设置为 0。


如何确定计时器值?

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

More Details


更新

Document 已更新。

注意:

对于基本的DistributionSummary 实现,例如CumulativeDistributionSummaryStepDistributionSummary,Max 是一个时间 窗口最大值 (TimeWindowMax)。

表示其值为一个时间窗口内的最大值。

如果时间窗口结束,它将被重置为 0,并重新开始一个新的时间窗口。

除非DistributionStatisticConfig 中的到期时间设置为其他值,否则时间窗口大小将是仪表注册表的步长 明确的。

【讨论】:

以上是关于了解 Spring Boot 执行器`http.server.requests` 指标 MAX 属性的主要内容,如果未能解决你的问题,请参考以下文章

译:在 Spring Boot 中使用 Spring AOP 和 AspectJ 来测量方法的执行时间

spring-boot Quartz 实践

使用 Spring Boot Actuator 构建 RESTful Web 服务

Spring Boot定时器的使用

想学会 Spring Boot 你必须深刻了解这些概念

了解 Spring Boot 2 的默认 logback 配置