我有一个系统作为第三方的API。我需要观察每个第三方的响应时间。但正如prometheus在其文档中所定义的那样:
请记住键值标签对的每个独特组合 代表一个新的时间序列,可以大大增加 存储的数据量。不要使用标签来存储高的尺寸 基数(许多不同的标签值),例如用户ID,电子邮件 地址或其他无限值的值。
所以这意味着我不应该使用标签作为我的端点,因为用户是无界的,(现在600,保持groowing)。然后我将观察每个用户的指标,但这会改变我将来可能会遇到的任何性能问题吗?
而不是标签过滤:
http_requests_total {ID = “3rdParty1”} http_requests_total {ID = “3rdParty2”}
我应该按每个指标使用每个用户吗?
http_3rdParty1_requests_total http_3rdParty2_requests_total ...
答案 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