繁体   English   中英

Prometheus 中的高基数标签有多危险?

[英]How dangerous are high-cardinality labels in Prometheus?

我正在考虑将一些指标导出到 Prometheus,我对我打算做什么感到紧张。

我的系统由一个工作流引擎组成,我想跟踪工作流中每个步骤的一些指标。 这似乎是合理的,有一个名为wfengine_step_duration_seconds的衡量指标。 我的问题是我的所有工作流程中有数千个步骤。

根据此处的文档,我不应该以编程方式生成名称的任何部分。 这排除了诸如wfengine_step1_duration_secondswfengine_step2_duration_seconds之类的名称的使用,因为步骤名称是程序化的(它们会不时更改)。

解决方案是 label 作为步骤名称。 不过,这也带来了一个问题,因为此处此处的文档非常强烈地警告不要使用具有高基数的标签。 具体来说,他们建议将“指标的基数保持在 10 以下”,对于超过 100 的基数,“研究替代解决方案,例如减少维度数量或将分析从监控中移开”。

我正在查看低几千(1,000 到 10,000)中的 label 个值。 鉴于指标的数量不会非常大,这是普罗米修斯的适当用法,还是我应该将自己限制在更通用的指标上,例如单个聚合步骤持续时间而不是每个步骤的单独持续时间?

高基数标签(例如具有大量唯一值的标签)本身并不危险。 危险在于活动时间序列的总数。 根据https://www.robustperception.io/why-does-prometheus-use-so-much-ram在内存大于 100GB 的主机上运行时,单个 Prometheus 实例可以处理多达一千万个活动时间序列。

一个例子:假设导出的指标有一个step_id label 和 10K 个唯一值。

如果指标没有其他标签(例如,如果它导出为wfengine_duration_seconds{step_id="...} ),那么它将生成 10K 活动时间序列(Prometheus 的微小值)。

如果指标包含另一个 label,例如具有 100 个唯一值的workflow_id ,并且每个工作流具有 10K 个唯一步骤,则导出的时间序列总数会飙升至100*10K=1M 这仍然是普罗米修斯的活动时间序列数量非常少的。

现在假设导出指标的应用程序在 50 台主机(或 Kube.netes pod)上运行。 Prometheus 将抓取目标地址存储在instance label 中 - 请参阅这些文档 这意味着从 50 台主机收集到的活动时间序列总数跃升至50*1M=50M 这个数字对于单个 Prometheus 实例来说可能太大了。 还有其他系统可以在单节点设置中处理如此多的活动时间序列,但它们也有上限。 它只是大N倍 ( 1 < N < 10 )。

因此,经验法则是考虑活动时间序列的数量,而不是每个 label 的唯一值数量。

保留100个基数以获得最大指标的指导原则假设您拥有1000个服务的副本,因为这是一个相当安全的上限。 如果您知道使用此代码的每个人都将拥有较少数量的副本,则可以在检测中获得更高的基数。

说,成千上万的标签仍然需要注意。 如果它已经成千上万,它需要多长时间才能成千上万? 从长远来看,您可能必须将此数据移动到给定基数的日志中,因此您可能希望现在这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM