微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决SpringBoot - *_max *_count *_sum 指标的可观察性

关于 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::sum{exception="None",uri!~".*actuator.*"}[5m]) / irate(http_server_requests_seconds::count{exception="None",uri!~".*actuator.*"}[5m])

但不确定使用这些方法是否正确。

请问可以使用哪些类型的查询,通常在处理 _max _count _sum 类型的指标时使用?

谢谢

解决方法

countsum 通常用于计算平均值。 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() 的工作方式如下:

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

因此,间隔越大,线条越平滑。

平均请求持续时间

您可以继续

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_count{instance="nodeA"}[5m])

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

注意max

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

http_server_requests_seconds_max

将显示最大请求持续时间。您可以使用聚合函数(avg()sum() 等)和标签过滤器对其进行扩充,使其更有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。