Spring Boot - *max_count *sum 指标的可观察性
Posted
技术标签:
【中文标题】Spring Boot - *max_count *sum 指标的可观察性【英文标题】:SpringBoot - observability on *_max *_count *_sum metrics 【发布时间】:2021-08-30 00:01:45 【问题描述】:请教关于 Spring Boot、一些有用的默认指标以及如何在 Grafana 中正确使用它们的小问题。
目前使用带有 Actuator + Micrometer + Prometheus 依赖项的 Spring Boot 2.5.1+(适用于 2.x.x.的问题),有很多非常方便的默认指标开箱即用。
我看到其中很多都带有 _max _count _sum
模式。
举几个例子:
spring_data_repository_invocations_seconds_max
spring_data_repository_invocations_seconds_count
spring_data_repository_invocations_seconds_sum
reactor_netty_http_client_data_received_bytes_max
reactor_netty_http_client_data_received_bytes_count
reactor_netty_http_client_data_received_bytes_sum
http_server_requests_seconds_max
http_server_requests_seconds_count
http_server_requests_seconds_sum
不幸的是,我不确定如何处理它们,如何正确使用它们,并且觉得我的无知让我错过了一些很棒的应用程序见解。
在网上搜索,我看到一些使用这样的方法来计算 Grafana 的平均值:
irate(http_server_requests_seconds::sumexception="None", uri!~".*actuator.*"[5m]) / irate(http_server_requests_seconds::countexception="None", uri!~".*actuator.*"[5m])
但不确定这是否是正确的使用方法。
请问可以进行哪些类型的查询,通常在处理_max _count _sum
类型的指标时使用?
谢谢
【问题讨论】:
【参考方案1】:count
和sum
一般用于计算平均值。 count
累积了sum
增加的次数,而sum
持有something 的总值。我们以http_server_requests_seconds
为例:
http_server_requests_seconds_sum 10
http_server_requests_seconds_count 5
通过上面的示例,可以说有 5 个 HTTP 请求,它们的总持续时间为 10 秒。如果您将sum
除以count
,您将获得2 秒的平均请求持续时间。
无论这两者有哪些标签(您可以将它们用于聚合/过滤),您都可以创建至少两个有用的面板:平均请求持续时间(即平均延迟)和请求速率。
请求率
使用rate() 或irate() 函数,您可以获得每秒请求数:
rate(http_server_requests_seconds_count[5m])
rate()
的工作方式如下:
-
Prometheus 从给定的时间间隔(本例中为
[5m]
)抽取样本,并计算当前时间点(不一定是现在)与[5m]
之前的时间点之间的差异。
然后将获得的值除以间隔中的秒数。
因此,间隔越大,线条越平滑。
平均请求持续时间
你可以继续
http_server_requests_seconds_sum / http_server_requests_seconds_count
但您很可能只会在图表上看到一条直线。这是因为这些指标的值随着时间的推移变得太大,并且必须发生非常剧烈的变化才能使该查询显示任何差异。由于这种性质,最好计算数据样本的平均值。使用increase()
函数,您可以获得一个近似值,该值表示度量在一个时间间隔内的变化情况。因此:
increase(http_server_requests_seconds_sum[5m]) / increase(http_server_requests_seconds_count[5m])
该值是近似值,因为实际上increase()
是rate()
乘以[inverval]
。错误是微不足道的,只是准备好可以增加 2.5 个请求:)。
聚合和过滤
如果您已经运行了上述查询之一,您会注意到不是一行而是多行。这是由于标签;度量标准的每组唯一标签都考虑了一个单独的时间序列。这可以通过使用aggregation function(如sum()
)来解决。例如,您可以通过instance
聚合请求率:
sum by(instance) (http_server_requests_seconds_count[5m])
这将为每个唯一的instance
标签显示一行。现在,如果您想查看一些而不是所有实例,您可以使用过滤器。例如,仅计算 nodeA
实例的值:
sum by(instance) (http_server_requests_seconds_countinstance="nodeA"[5m])
阅读更多关于选择器的信息here。使用标签,您可以创建任意数量的有用面板。也许您想计算异常的百分比,或者它们的发生率,或者可能是 status
代码的请求率,你可以命名它。
注意max
根据我在 Internet 上找到的信息,max
显示了在设置中设置的某个时间间隔内的最大记录值(如果信任来源,默认为 2 分钟)。这是一个不常见的指标,它是否有用取决于您。由于它是一个仪表(与sum
和count
不同,它可以上下移动),您不需要额外的功能(例如rate()
)来查看动态。因此
http_server_requests_seconds_max
将显示最大请求持续时间。您可以使用聚合函数(avg()
、sum()
等)和标签过滤器来增强它,使其更有用。
【讨论】:
以上是关于Spring Boot - *max_count *sum 指标的可观察性的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web?
《02.Spring Boot连载:Spring Boot实战.Spring Boot核心原理剖析》