Prometheus连接多个指标与聚合
- 初识PromSQL
- 一、Prometheus二进制操作符
- 一对一匹配One to one
- 一对多和多对一匹配
初识PromSQL
PromSQL看起来简短整洁,通俗易懂。乍一看很简单,但是当真正使用它的时候,就会发现Prometheus的语句苍白无力,微不足道。在网上关于PromSQL的博客,问答较少,官网上的教程不是很好看懂,而且大多都是在编程的基础上实验。下面根据公司使用Prometheus的情况就我自身理解来谈谈指标之间的聚合。
一、Prometheus二进制操作符
参考网上文章,PromSQL有15个二进制操作符,可以根据操作类型分为三组:
- 算术 ,
+ - * / ^ %
; - 比较,
< > <= >= == !=
; - 逻辑 ,
and unless or
;
对于不同类型的操作数,可以看一下具体的例子。
rabbitmq_queue_messages_ready + rabbitmq_queue_messages_unacked
rabbitmq_queue_messages_ready + rabbitmq_queue_messages_unacknowledged > 0
一对一匹配One to one
example 1:
一对多和多对一匹配
一对一的匹配是最直接的匹配。大多数的时候,on
或则ignoring
有助于返回一些想要的内容,这里的缺陷是。某些查询结果可能只显示一对一的基数。例如,碰巧查询在选定的时间范围内显示了一对一的数据关系,但通常可以是一对多。或则多对一。
Prometheus支持多对一和一对多的匹配。但必须通过向查询添加group_left或group_right修饰来指定。否则可能返回错误。
multiple matches for labels: many-to-one matching must be explicit (group_left/group_right)
除非使用逻辑运算符 and unless or,否则Prometheus总是认为二元运算的至少一边具有1的技术,如果在查询的执行过程中,Prometheus在one端发现冲突(标签冲突)查询将失败,并出现一下错误:
found duplicate series for the match group <keys/values> on the <left|right> hand-side of the operation: <op>;
many-to-many matching not allowed: matching labels must be unique on one side
即使一方没有冲突,指定了group_left
或group_right
,查询仍然失败,报错:
multiple matches for labels: grouping labels must ensure unique matches
会报这个错误是因为prometheus对于多方面的每一个元素,应该只能从一个方面找到一个元素,否则,查询结果将变得不清晰
one to one匹配
many to one匹配
many to many