大计数器重置后的单一统计
Single stat after big counter reset
我们使用 Grafana + Prometheus 来监控我们的基础设施,最近我们添加了一些以业务为中心的指标,我们跟踪的其中一个计数器一直存在问题。这是一个会话时间计数器。基本上,每次会话结束时,我们都会根据用户在该会话中花费的时间来增加该计数器。因此,如果用户使用该软件花费了 2m,则计数器将增加 120000 毫秒。几天来这种方法工作得很好,但是从昨天开始,当我们在一个实例计数器和其他实例计数器之间存在很大差异,并且由于部分服务重新启动而重置了那个大计数器时,我无法获得不再有意义的单一统计面板。
这是发生的事情的图表(这个计数器有 3 个标签,导致超过 50 个标签组合)
Prometheus graph
此计数器当前跟踪的所有时间总计为 13.8 年,为期 4 天,但自计数器重置以来,我的单一统计指标为 -20 年(使用差异)或 35 年(使用范围) 24 小时。如果您不考虑计数器重置,这并没有错,因为 diff 和 range 将查看 min/max/first/current 值,但它不再是一个有用的指标。
如果我将时间范围设置为不包括计数器重置,Diff 和 Range 都会显示非常接近预期的值(我们的使用非常线性且可预测)。
singlestat 面板公式如下所示
sum(dyno_app_music_total_user_listen_time{server=~"[[server]]", clusterId=~"[[clusterid]]"})
如何在计数器中处理单一统计指标的重置?
我不确定我是否完全理解你的问题,但如果我必须总结一下,我的理解是你有一个带有 3 个标签的指标(产生 50 个不同的时间序列)并且你想显示一个单一统计面板一直将所有这些计数器加在一起。
您在 Prometheus 中处理计数器重置的方式是使用 rate()
或者,如果您想要一个绝对值 increase()
。因此,您编写查询的方式(假设您想要所有时间的计数器增加总和)是:
sum(increase(dyno_app_music_total_user_listen_time{...}[100y]))
但是请注意,随着时间的推移,这会变得越来越慢,因为普罗米修斯在进行计算之前必须一直返回并加载您的 50 个时间序列。 (加载的样本数量将超过 Prometheus 中配置的限制或可用内存量)。
可能比这更有用(并且随着时间的推移会消除您遇到的尖峰 "yesterday")是显示您的计数器在更短时间范围内的变化率图表:
sum(rate(dyno_app_music_total_user_listen_time{...}[1h]))
这将向您显示(近似值)在您可以选择在图表上显示的任何时间范围内前一小时的平均会话数。
我们使用 Grafana + Prometheus 来监控我们的基础设施,最近我们添加了一些以业务为中心的指标,我们跟踪的其中一个计数器一直存在问题。这是一个会话时间计数器。基本上,每次会话结束时,我们都会根据用户在该会话中花费的时间来增加该计数器。因此,如果用户使用该软件花费了 2m,则计数器将增加 120000 毫秒。几天来这种方法工作得很好,但是从昨天开始,当我们在一个实例计数器和其他实例计数器之间存在很大差异,并且由于部分服务重新启动而重置了那个大计数器时,我无法获得不再有意义的单一统计面板。
这是发生的事情的图表(这个计数器有 3 个标签,导致超过 50 个标签组合)
Prometheus graph
此计数器当前跟踪的所有时间总计为 13.8 年,为期 4 天,但自计数器重置以来,我的单一统计指标为 -20 年(使用差异)或 35 年(使用范围) 24 小时。如果您不考虑计数器重置,这并没有错,因为 diff 和 range 将查看 min/max/first/current 值,但它不再是一个有用的指标。
如果我将时间范围设置为不包括计数器重置,Diff 和 Range 都会显示非常接近预期的值(我们的使用非常线性且可预测)。
singlestat 面板公式如下所示
sum(dyno_app_music_total_user_listen_time{server=~"[[server]]", clusterId=~"[[clusterid]]"})
如何在计数器中处理单一统计指标的重置?
我不确定我是否完全理解你的问题,但如果我必须总结一下,我的理解是你有一个带有 3 个标签的指标(产生 50 个不同的时间序列)并且你想显示一个单一统计面板一直将所有这些计数器加在一起。
您在 Prometheus 中处理计数器重置的方式是使用 rate()
或者,如果您想要一个绝对值 increase()
。因此,您编写查询的方式(假设您想要所有时间的计数器增加总和)是:
sum(increase(dyno_app_music_total_user_listen_time{...}[100y]))
但是请注意,随着时间的推移,这会变得越来越慢,因为普罗米修斯在进行计算之前必须一直返回并加载您的 50 个时间序列。 (加载的样本数量将超过 Prometheus 中配置的限制或可用内存量)。
可能比这更有用(并且随着时间的推移会消除您遇到的尖峰 "yesterday")是显示您的计数器在更短时间范围内的变化率图表:
sum(rate(dyno_app_music_total_user_listen_time{...}[1h]))
这将向您显示(近似值)在您可以选择在图表上显示的任何时间范围内前一小时的平均会话数。