Prometheus 普罗米修斯:每个用户的标签与每个用户的度量

Prometheus 普罗米修斯:每个用户的标签与每个用户的度量,prometheus,Prometheus,我有一个作为第三方API的系统。我需要观察每个第三方的响应时间。但正如普罗米修斯在其文件中所定义的: 请记住,键值标签对的每个唯一组合 表示一个新的时间序列,它可以显著增加 存储的数据量。不要使用标签来存储高精度的尺寸 基数(许多不同的标签值),例如用户ID、电子邮件 地址或其他无界值集 这意味着我不应该使用标签作为我的端点,因为用户是无限的(现在是600,继续摸索)。然后我将观察每个用户的指标,但这会改变我将来可能遇到的任何性能问题吗 代替标签过滤: http请求总数{id=“3rdParty

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

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

这意味着我不应该使用标签作为我的端点,因为用户是无限的(现在是600,继续摸索)。然后我将观察每个用户的指标,但这会改变我将来可能遇到的任何性能问题吗

代替标签过滤:

http请求总数{id=“3rdParty1”} http请求总数{id=“3rdParty2”}

我应该使用每个用户每个度量吗

http第三方1请求总数 http第三方2请求总数
…核心问题是你有多少个时间序列。无论是将用户放入度量名称还是标签中,数字都是相同的,唯一的区别是将用户放入度量名称中要困难得多

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

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

如果使用
http\u 3rdParty1\u requests\u total
作为度量名称,则将两个值连接到一个文本字段中:客户端名称和度量名称连接在一起

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

度量名称实际上只是另一个带有特殊名称的标签,即在内部是
\uuuu name\uuuu=“http-requests\u total”

您不能通过将数据放在名称中而不是放在它自己的标签中来绕过基数。这根本不会改变基数。对于600多个唯一值,您可能会遇到任何问题

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

见:

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

_

然而,这并不是普罗米修斯的处理方式,普罗米修斯的标签提供了更强大的数据模型

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