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】:

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() 的工作方式如下:

    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 分钟)。这是一个不常见的指标,它是否有用取决于您。由于它是一个仪表(与sumcount 不同,它可以上下移动),您不需要额外的功能(例如rate())来查看动态。因此

http_server_requests_seconds_max

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

【讨论】:

以上是关于Spring Boot - *max_count *sum 指标的可观察性的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2Spring Boot CLI

如何在 asdict 中获取@property 方法?

为啥 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web?

《02.Spring Boot连载:Spring Boot实战.Spring Boot核心原理剖析》

spring-boot-quartz, 依赖spring-boot-parent

spring-boot系列:初试spring-boot