sum - Prometheus:如何对来自不同机器的相同计数器的总和进行评分?
问题描述
我有一个 Prometheus 计数器,我想获得它在时间范围内的速率(真正的目标是对rate求和,有时在其上使用histogram_quantile作为直方图度量)。
但是,我有多台机器运行这种工作,每台机器都设置了自己的实例标签。这会导致在不同机器上对该计数器进行不同的inc操作以创建计数器的不同实体,因为标签值的组合是唯一的。
问题是rate()在每个这样的计数器实体上单独工作。
结果是具有唯一组合的计数器实体没有考虑到
率()。
例如,如果我有:
mycounter{aaa="1",instance="1.2.3.4:6666",job="job1"} value: 1
mycounter{aaa="2",instance="1.2.3.4:6666",job="job1"} value: 1
mycounter{aaa="2",instance="1.2.3.4:7777",job="job1"} value: 1
mycounter{aaa="1",instance="5.5.5.5:6666",job="job1"} value: 1
所有计数器实体都是唯一的,因此它们的值为 1。
如果计数器标签始终是唯一的(来自不同的机器),则在这种情况下, rate(mycounter[5m])的值为 0,并且sum(rate(mycounter[5m) ]))会得到 0,这不是我需要的!
我想忽略实例标签,以便它引用这些 mycounter inc操作,因为它们是在同一个计数器实体上进行的。
换句话说,我希望只有 2 个实体(它们可以有一个共同的实例值或没有实例标签):
mycounter{aaa="1", job="job1"} value: 2
mycounter{aaa="2", job="job1"} value: 2
在这种情况下,新机器(具有现有aaa值)中的inc操作将增加一些实体计数器,而不是添加值为 1 的新实体,并且rate()将获得每个实体的实际费率,因此我们可以sum()它们。我怎么做?
我做了几次尝试来解决它,但都失败了:
- 执行sum() 的 rate() -由于类型不匹配而失败...
- 删除自动实例标签,在配置中使用metric_relabel_configswork和action: labeldrop,但随后分配默认地址值。
- 使用metric_relabel_configswork和replacement将所有实例值更改为一个通用值,但似乎其中一个实体覆盖了所有其他实体,所以它无济于事......
有什么建议么?
Prometheus 版本:2.3.2
提前致谢!
解决方案
如果其他标签(aaa
等)的可能组合有限,则最好在应用程序启动时将计数器显示为 0。这种方式rate()
函数在底层正常工作,sum()
会给你正确的结果。
如果您必须执行 a rate()
of the sum()
,请先阅读以下内容:
请注意,当
rate()
与聚合运算符(例如sum()
)或随时间聚合的函数(任何以 结尾的函数_over_time
)结合时,总是先取一个rate()
,然后再聚合。否则rate()
,当您的目标重新启动时,无法检测到计数器重置。
如果您可以容忍这种情况(或实例同时重置计数器),则有一种解决方法。将记录规则定义为
record: job:mycounter:sum
expr: sum without(instance) (mycounter)
然后这个表达式起作用:
sum(rate(job:mycounter:sum[5m]))
推荐阅读
- c# - 有没有办法在 Unity 中进行自动化 UI 测试?
- ffmpeg - FFMPEG:Youtube 流媒体质量和速度问题
- python - 解码字符串(UTF?)
- cassandra - Cassandra 失败的格式值
- java - 为什么我在无限循环代码中有不同的结果
- angularjs - Ag-grid 主详细信息防止详细信息行在数据刷新时关闭
- android - 构建项目上的 java.lang.ArrayIndexOutOfBoundsException
- react-native - 如何调用组件的方法
- ios - 提供商不提供语音邮件时的 iOS 语音邮件应用程序/代码
- ruby-on-rails - 是否可以在不使用 gem 的情况下在 rails 中渲染/生成 pdf?