SpringBoot - *_max *_count *_sum 指标的可观察性

Pat*_*Pat 16 spring-boot grafana spring-boot-actuator prometheus

关于 Spring Boot、一些有用的默认指标以及如何在 Grafana 中正确使用它们的小问题。

目前,Spring Boot 2.5.1+(适用于 2.xx 的问题)具有 Actuator + Micrometer + Prometheus 依赖项,有许多开箱即用的非常方便的默认指标。

我看到很多很多都有图案_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
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不知道如何处理它们,如何正确使用它们,并且感觉我的无知让我错过了一些很棒的应用程序见解。

在网上搜索时,我看到一些使用这样的方法来计算 Grafana 的平均值:

irate(http_server_requests_seconds::sum{exception="None", uri!~".*actuator.*"}[5m]) / irate(http_server_requests_seconds::count{exception="None", uri!~".*actuator.*"}[5m])
Run Code Online (Sandbox Code Playgroud)

但不确定这是否是使用它们的正确方法。

请问在处理 type 的指标时通常会使用什么类型的查询_max _count _sum

谢谢

ane*_*yte 37

UPD 2022/11:最近,我有机会亲自使用这些指标,并制作了一个仪表板,其中包含我在这个答案中所说的所有内容以及更多内容。它可以在GithubGrafana.com上找到。我希望这将成为您如何使用这些指标的一个很好的例子。

原答案

countsum一般用于计算平均值。count积累次数sum增加,同时保存某物sum的总价值。我们举个例子:http_server_requests_seconds

http_server_requests_seconds_sum   10
http_server_requests_seconds_count 5
Run Code Online (Sandbox Code Playgroud)

通过上面的示例,可以说有 5 个 HTTP 请求,它们的总持续时间为 10 秒。如果除以,sumcount将得到 2 秒的平均请求持续时间。

有了这些,您可以创建至少两个有用的面板:平均请求持续时间(=平均延迟)和请求率。

请求率

使用rate()irate()函数你可以得到每秒有多少个请求:

rate(http_server_requests_seconds_count[5m])
Run Code Online (Sandbox Code Playgroud)

rate()按以下方式工作:

  1. Prometheus 从给定的时间间隔([5m]在本例中)中获取样本,并计算当前时间点(不一定是现在)与[5m]之前时间点之间的差异。
  2. 然后将获得的值除以间隔中的秒数。

间隔太短会使图形看起来像锯子(每次波动都会很明显);间隔长会使线条更加平滑,显示变化缓慢。

平均请求持续时间

您可以继续

http_server_requests_seconds_sum / http_server_requests_seconds_count
Run Code Online (Sandbox Code Playgroud)

但您很可能只会在图表上看到一条直线。这是因为这些指标的值随着时间的推移变得太大,并且必须发生真正巨大的变化才能使该查询显示出任何差异。由于这种性质,最好计算数据间隔样本的平均值。使用increase()函数,您可以获得指标在时间间隔内如何变化的近似值因此:

increase(http_server_requests_seconds_sum[5m]) / increase(http_server_requests_seconds_count[5m])
Run Code Online (Sandbox Code Playgroud)

该值是近似值,因为在引擎盖下increase()乘以。对于快速移动的计数器(例如请求率)来说,该错误微不足道,只需做好可能增加 2.5 个请求的准备即可。rate()[inverval]

聚合和过滤

如果您已经运行了上面的查询之一,您会注意到没有一行,而是很多行。这是由于标签造成的;该指标具有的每组唯一标签都被视为一个单独的时间序列。这可以通过使用聚合函数(如)来解决sum()。例如,您可以通过以下方式聚合请求率instance

sum by(instance) (rate(http_server_requests_seconds_count[5m]))
Run Code Online (Sandbox Code Playgroud)

这将向您显示每个唯一标签的一行instance。现在,如果您只想查看部分实例而不是全部实例,可以使用过滤器来实现。例如,计算一个值nodeA

sum by(instance) (rate(http_server_requests_seconds_count{instance="nodeA"}[5m]))
Run Code Online (Sandbox Code Playgroud)

在此处阅读有关选择器的更多信息。使用标签,您可以创建任意数量的有用面板。也许您想计算异常的百分比,或者它们的发生率,或者通过status代码计算请求率,等等。

注意事项max

根据我在网上找到的内容,max显示了设置中设置的某个时间间隔内的最大记录值(如果信任来源,默认值为 2 分钟)。这是一个不太常见的指标,它是否有用取决于您。由于它是一个仪表(与它不同sumcount它可以向上和向下),因此您不需要额外的函数(例如rate())来查看动态。因此

http_server_requests_seconds_max
Run Code Online (Sandbox Code Playgroud)

...将显示最大请求持续时间。您可以使用聚合函数(avg()sum()等)和标签过滤器来增强它,以使其更有用。