http_request_duration_seconds_sum / http_request_duration_seconds_count 显示 2 个图表

bad*_*key 2 jquery dashboard grafana prometheus

我有一个 Grafana 仪表板,我尝试在其中绘制一些普罗米修斯指标。

我正在尝试使用以下公式计算 2 个端点的平均响应时间:

http_request_duration_seconds_sum / http_request_duration_seconds_count
Run Code Online (Sandbox Code Playgroud)

但是当将查询绘制到 Grafana 图形面板中时,我得到 4 个图形(每个图形 2 个),而不是只有 2 个,我不明白。

Grafana 的片段

谁能告诉我,为什么有 4 条曲线而不是 2 条?顶部的两个来自同一个查询,底部的两个也来自同一个查询。

更新

正在添加

sum(rate(http_request_duration_sum))[24h] / sum(rate(http_request_duration_count))[24h] 
Run Code Online (Sandbox Code Playgroud)

答案?这给了我 2 条曲线而不是 4 条,但不确定结果是否是我想要的(即端点的平均响应时间)。

val*_*ala 8

和是计数器类型http_request_duration_sum的指标,因此它们通常会随着时间的推移而增加,有时可能会重置为零(例如,当重新启动公开这些指标的服务时):http_request_duration_count

  • http_request_duration_sum指标显示自上次服务重启以来所有请求持续时间的总和。
  • http_request_duration_count指标显示自上次服务重新启动以来的请求总数。

因此给出了自服务启动以来的http_request_duration_sum / http_request_duration_count平均请求持续时间。该指标没有用,因为它可以平滑可能的请求持续时间峰值,并且平滑因子会随着时间的推移而增加。通常人们希望查看过去几分钟内的平均请求持续时间。这可以通过将计数器包装到increase()函数中并在方括号中包含所需的后向持续时间来计算。例如,以下查询返回过去 5 分钟内的平均请求持续时间(请参见方括号中):N5m

increase(http_request_duration_sum[5m]) / increase(http_request_duration_count[5m])
Run Code Online (Sandbox Code Playgroud)

如果指标在多个应用程序(也称为作业)或节点(又称为实例或抓取目标)上公开,则此查询可能会返回多个时间序列http_request_duration。如果您需要获取每个作业在过去 5 分钟内的平均请求持续时间,则必须使用sum函数:

sum(increase(http_request_duration_sum[5m])) by (job)
  /
sum(increase(http_request_duration_count[5m])) by (job)
Run Code Online (Sandbox Code Playgroud)

请注意,sum(...) by (job)分别应用于 的左侧和右侧部分/。这并不等同于以下错误查询:

sum(
  increase(http_request_duration_sum[5m]) / increase(http_request_duration_count[5m])
) by (job)
Run Code Online (Sandbox Code Playgroud)
avg(
  increase(http_request_duration_sum[5m]) / increase(http_request_duration_count[5m])
) by (job)
Run Code Online (Sandbox Code Playgroud)

由于第一个错误查询计算每个查询的平均响应时间之和job,而第二个错误查询计算每个查询的平均响应时间的平均值job。这不是大多数用户所期望的 - 有关详细信息,请参阅此答案