spring-boot - SpringBoot - *_max *_count *_sum 指标的可观察性
问题描述
关于 Spring Boot 的小问题,一些有用的默认指标,以及如何在 Grafana 中正确使用它们。
目前使用带有 Actuator + Micrometer + Prometheus 依赖项的 Spring Boot 2.5.1+(适用于 2.xx 的问题),有很多非常方便的默认指标开箱即用。
我看到他们中的许多人带有 pattern _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
的总值。让我们举个例子: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 个请求即可。
聚合和过滤
如果您已经运行了上述查询之一,您会注意到不是一行而是多行。这是由于标签;度量标准认为的每个唯一标签集都是一个单独的时间序列。这可以通过使用聚合函数(如sum()
)来解决。例如,您可以通过以下方式汇总请求率instance
:
sum by(instance) (http_server_requests_seconds_count[5m])
这将为每个唯一instance
标签显示一行。现在,如果您想查看一些而不是所有实例,您可以使用过滤器。例如,仅计算价值nodeA
:
sum by(instance) (http_server_requests_seconds_count{instance="nodeA"}[5m])
在此处阅读有关选择器的更多信息。使用标签,您可以创建任意数量的有用面板。也许你想计算异常的百分比,或者它们的发生率,或者可能是status
代码的请求率,你可以命名它。
注意事项max
根据我在 Internet 上找到的内容,max
显示设置中设置的某个时间间隔内的最大记录值(如果信任来源,默认为 2 分钟)。这是一个不常见的指标,它是否有用取决于您。由于它是一个仪表(不像它可以sum
上下count
移动),您不需要额外的功能(例如rate()
)来查看动态。因此
http_server_requests_seconds_max
将显示最大请求持续时间。avg()
您可以使用聚合函数( 、等)和标签过滤器来增强它sum()
,使其更有用。
推荐阅读
- reactjs - React Context 和 Apollo Client Link 之间的通信
- c++ - C ++ 14函数返回对象数组,尽管复制构造函数被删除
- reactjs - 使用 React + Material UI 创建自定义国家/地区选择
- performance - gstreamer 流的帧速率慢
- internet-explorer - Internet Explorer 在矩阵变换时扭曲 SVG 图像
- python - 从 Quora 问题中抓取答案仅返回 10 个答案
- reactjs - 如何用 jest 和 react-testing-library 测试 react-toastify
- amazon-web-services - 如何创建映射模板以将路径参数映射到 apigateway 中的 lambda 函数?
- python - 如何在 multiprocessing.Pool 中的函数运行中使用模拟
- typescript - Promise.then 回调中的打字稿错误