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

时间:2018-05-28 08:02:31

标签: prometheus

我有一个系统作为第三方的API。我需要观察每个第三方的响应时间。但正如prometheus在其文档中所定义的那样:

  

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

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

而不是标签过滤:

http_requests_total {ID = “3rdParty1”} http_requests_total {ID = “3rdParty2”}

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

http_3rdParty1_requests_total http_3rdParty2_requests_total ...

2 个答案:

答案 0 :(得分:2)

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

如果基数为600,以这种方式打破这些数据并不明智,你应该看一下使用基于日志的监控系统,例如ELK堆栈进行这种分析。

答案 1 :(得分:0)

使用“每个用户的标签”。请勿在指标名称中添加多个无关的问题。

如果您将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