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 每个用户的指标的主要内容,如果未能解决你的问题,请参考以下文章