场景
相同功能的集群A,B。我们想知道集群A和B之间的差距。例如内存使用量或者什么业务数据。当差距达到一定阈值的时候触发告警。
简易分析
这里比较的是两个集群的差距,指标是一个计算后的结果,起码有两种方案可以参考。
- exporter只做指标的采集,prometheus进行运算。
- exporter做好计算的结果,prometheus进行拉取。
方案1的好处是灵活,计算在prometheus这边,prometheus有丰富的计算表达方式,把原始数据采集上来以后,prometheus可以通过预计算或者直接查询的时候写表达式满足结果,数据的计算方式已经被实现,并且prometheus也支持时间窗口的表达,可以说非常的灵活,如果是想求其他的运算,一个sql就解决了。
方案1的缺点就是得依赖prometheus的表达,如果一个sql表达不出来,那么也没法继续执行下去。而且他的运算都挤压在了prometheus上,如果数据量特别大的话,可能运算不过来。
方案2的好处就是简单。只要在exporter上写逻辑代码即可,prometheus只有抓取的压力,并没有其他方面的压力在。而且运算分摊在了每个exporter上。运算压力的是比较小的。缺点就是得自己做运算,都是工作量。
两个方案各有优劣,第二个纯粹靠自己编写代码,这里就不主要讲了。我们可以在第一个sql上进行一些加工。
prometheus sql的表达式
大家接触prometheus的时候,简单运算基本都是做过的,大家也发现了,简单运算一定是相同指标名,相同label的才能计算。
其实prometheus还提供了一些比较运算方式解决上面的限制。去除label运算。
<vector expr> <bin-op> ignoring(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) <vector expr>
运算的时候加上ignoring可以忽略指标,on可以只关注某些指标。他们正好是相同操作的不同表达。
这个就解决了方案1的一个问题,如果是不同的exporter采集的话,prometheus默认为带上instance标签,这个值是ip:port。虽然prometheus可以在抓取的时候可以进行relabel操作,直接可以删除掉这个操作,这个的好处就是我们去除了不必须要的标签,但是还需要加入集群的标签。所以instance的标签,其实有些时候是可以表达集群的信息的,虽然不建议这么做,我不意见删除标签,标签的信息后续可以作为一个追踪的部分。一旦计算出错可以很快的进行追踪。
一般建议在sql层面进行处理,例如ignoring(instance)。如果有其他的标签可以继续追加。
<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]
还有一种去除标签的方式,计算求和这种,我们可以通过by操作留下对应的标签。(这里without和by也是一对操作,表达的是同一个意思)
有了上面的几个操作,相信可以满足了大部分的需求,promethues也支持左连接等操作,暂时用的比较少。
小结
prometheus有丰富的表达可以减少我们的开发压力,我们必须思考prometheus是否能承担对应的压力,如果不能则需要压力的分散。例如运算压力分散,可以把运算功能加到exporter中,也可以是抓取压力分散,用两台prometheus做扩展。
共同学习,写下你的评论
评论加载中...
作者其他优质文章