SpringBoot - *_max *_count *_sum 指标的可观察性
SpringBoot - observability on *_max *_count *_sum metrics
关于 Spring 启动的小问题,一些有用的默认指标,以及如何在 Grafana 中正确使用它们。
目前使用 Spring Boot 2.5.1+(适用于 2.x.x 的问题)与 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
不幸的是,我不确定如何使用它们,如何正确使用它们,并且觉得我的无知让我错过了一些很棒的应用程序见解。
在网络上搜索时,我看到有人像这样使用 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
类型的指标时使用?
谢谢
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() or 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) (rate(http_server_requests_seconds_count[5m]))
这将为每个唯一的 instance
标签显示一行。现在,如果您只想查看部分实例而不是所有实例,则可以使用过滤器来实现。例如,要为 nodeA
实例计算一个值:
sum by(instance) (rate(http_server_requests_seconds_count{instance="nodeA"}[5m]))
阅读更多关于选择器的信息here。使用标签,您可以创建任意数量的有用面板。也许您想通过 status
代码计算异常的百分比,或者它们的发生率,或者可能是请求率,您可以给它命名。
关于 max
的注释
根据我在网上找到的内容,max
显示了在设置中设置的某个时间间隔内的最大记录值(如果相信来源,默认值为 2 分钟)。这是一个不太常见的指标,它是否有用取决于您。因为它是一个仪表(不像 sum
和 count
它可以上下移动)你不需要额外的功能(例如 rate()
)来查看动态。于是
http_server_requests_seconds_max
... 将显示最长请求持续时间。您可以使用聚合函数(avg()
、sum()
等)和标签过滤器来增强它,使其更有用。
关于 Spring 启动的小问题,一些有用的默认指标,以及如何在 Grafana 中正确使用它们。
目前使用 Spring Boot 2.5.1+(适用于 2.x.x 的问题)与 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
不幸的是,我不确定如何使用它们,如何正确使用它们,并且觉得我的无知让我错过了一些很棒的应用程序见解。
在网络上搜索时,我看到有人像这样使用 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
类型的指标时使用?
谢谢
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() or 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) (rate(http_server_requests_seconds_count[5m]))
这将为每个唯一的 instance
标签显示一行。现在,如果您只想查看部分实例而不是所有实例,则可以使用过滤器来实现。例如,要为 nodeA
实例计算一个值:
sum by(instance) (rate(http_server_requests_seconds_count{instance="nodeA"}[5m]))
阅读更多关于选择器的信息here。使用标签,您可以创建任意数量的有用面板。也许您想通过 status
代码计算异常的百分比,或者它们的发生率,或者可能是请求率,您可以给它命名。
关于 max
的注释
根据我在网上找到的内容,max
显示了在设置中设置的某个时间间隔内的最大记录值(如果相信来源,默认值为 2 分钟)。这是一个不太常见的指标,它是否有用取决于您。因为它是一个仪表(不像 sum
和 count
它可以上下移动)你不需要额外的功能(例如 rate()
)来查看动态。于是
http_server_requests_seconds_max
... 将显示最长请求持续时间。您可以使用聚合函数(avg()
、sum()
等)和标签过滤器来增强它,使其更有用。