Prometheus:每个用户的标签 VS 每个用户的指标

Posted

技术标签:

【中文标题】Prometheus:每个用户的标签 VS 每个用户的指标【英文标题】:Prometheus: Label per User VS Metric per User 【发布时间】:2018-11-06 18:31:18 【问题描述】:

我有一个系统作为第 3 方的 API。我需要观察每个第 3 方的响应时间。但正如普罗米修斯在其文档中定义的那样:

请记住,键值标签对的每个唯一组合 代表一个新的时间序列,它可以显着增加 存储的数据量。不要使用标签来存储尺寸过高的 基数(许多不同的标签值),例如用户 ID、电子邮件 地址,或其他无限制的值集。

所以这意味着我不应该使用标签作为我的端点,因为用户是无限的(目前为 600,继续增长)。然后我会观察每个用户的指标,但这会改变我将来可能会解决的任何性能问题吗?

代替标签过滤:

http_requests_totalid="3rdParty1" http_requests_totalid="3rdParty2"

我应该使用每个用户的每个指标吗?

http_3rdParty1_requests_total http_3rdParty2_requests_total ...

【问题讨论】:

【参考方案1】:

核心问题是你有多少个时间序列。无论您将用户放入度量名称还是标签,它都是相同的数字,唯一的区别是将它们放入度量名称更难处理。

基数为 600,以这种方式分解这些数据不太明智,您还应该考虑使用基于日志的监控系统(例如 ELK 堆栈)进行此类分析。

【讨论】:

【参考方案2】:

使用“每个用户的标签”。不要将多个不相关的关注点放入指标名称中。

如果您使用http_3rdParty1_requests_total 作为指标名称,您需要将两个值连接到一个文本字段中:客户端名称和指标名称连接在一起。

如果您以这种方式设计 SQL 数据库,例如将“客户姓氏+银行分行名称”存储在一个文本字段中,我们会认为您犯了一个菜鸟错误,并告诉您将两个值存储在两个字段中,每个字段都有一个有意义的名称,而不是一个字段有两个值混入其中。这没什么不同。

指标名称​​真的只是另一个具有特殊名称的标签,即在内部它是__name__ ="http-requests_total"

您无法通过将数据放在名称中而不是在它自己的标签中来绕过基数。这根本不会改变基数。有超过 600 个唯一值,无论哪种方式,您都可能遇到问题。

但是在两个字段中存储两个不同的值,而不是一个,仍然是正确的方法,并且可以在以后进行查询时为您省去麻烦。例如使用user="3rdParty1" 等单独的标签,您可以制作查询,例如:过去 24 小时内有多少用户处于活动状态?显示每个用户的 http 请求量图表。显示在过去一小时内出现 10 个或更多错误的用户。显示此用户的所有指标。

见:

处理这个问题的正确方法是使用标签来区分不同的池,而不是在度量名称中对其进行编码

https://www.robustperception.io/whats-in-a-\_\_name__

然而,这不是在 Prometheus 中处理标签提供更强大数据模型的方式。

https://www.robustperception.io/target-labels-not-metric-name-prefixes

您可以尝试将路径放在度量名称中,例如在 Graphite 中很常见...因此,这是您应该避免的反模式。相反,为了处理这种常见用例,Prometheus 有标签。

https://www.oreilly.com/library/view/prometheus-up/9781492034131/ch05.html

【讨论】:

以上是关于Prometheus:每个用户的标签 VS 每个用户的指标的主要内容,如果未能解决你的问题,请参考以下文章

prometheus relabel 配置

6.prometheus重新打标

Prometheus 查询按特定标签随时间平均

prometheus-relabel_configs和metric_relabel_configs

如何使用 Prometheus 警报规则检测新指标

prometheus alertmanager 规则的自动标签