暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【原创|译】Prometheus的Counter、Gauge、Summary、Histogram是如何工作的?(上)

工匠人生 2019-11-06
1321

深耕HikariCP、数据库领域的公众号


历史文章推荐:

Grafana JVM Micrometer(4701)指标图解

匠心打磨,《HikariCP数据库连接池实战》书背后的故事(上):创作团队和封面故事

HikariCP常用监控指标与故障排查实战

《【追光者系列】HikariCP连接池监控指标实战》

《【久违了】猪猪带着自己的书《HikariCP In Action》回来了+自序+爆照》

《【文末双十一购书大促】HikariCP可视化监控已支持Prometheus接入


Prometheus仪表中有四种标准度量标准:Gauge, Counter, Summary and Histogram。

一、Counter

Counter用来计数。

其实计数本身并没有太多用处,用户真正的诉求是计数能有多快,比如你当前正在每秒收到12个请求。如果在每次请求时都将Counter增加,那么如何在监视系统中找出它,以便对其进行图形显示并发出警报?

有三种常见的做法。

第一种方法是定期提取流向监视系统的当前值,比如每分钟提取一次,然后将计数器重置为0。这有一个问题,如果推送失败,那么您将丢失关于该时间段的所有信息。这可能让你看不到流量的微小爆炸。另外,如果您有两个系统从计数器中提取数据以实现冗余,那么每个系统只能看到大约一半的增量,那不是很好的方案。

第二种方法是使用某种形式的移动平均值,通常是指数型的。这意味着最近的数据点比旧的数据点更重要。根据增量模式的相位和频率,相对于监控系统采样信息的时间,因为并非所有的数据点都是相同的,所以将会得到不同的结果。这种方法可以处理多个采集样本的系统,但是如果一个样本没有被采集,就会丢失信息。和第一种方法相比,这种方法更好一些,但还远远不够完美。

Prometheus采用的是第三种方法。计数器从0开始递增。客户端client不做其他计算。每一次scrape(Prometheus间隔,类似于雨刮器的刮擦),Prometheus就取一次这种状态的样本。在Prometheus中的 rate()
 方法查看一段时间内的时间序列历史,并计算它每秒增长的有多快这种方法可以处理多个采集样本的Prometheus Server,如果scrape失败会丢失分辨率,但是并不是数据(因为下一次成功的scrape中,increments增量并没有丢失或者平均掉)

一个常见的问题是,当进程重新启动并将计数器重置为0时会发生什么? rate()
 将自动处理这个问题。每当计数器Counter出现减少的情况时,它将被视为在第一个数据点之后立即重置为0。这使得计数器不可能递减变得很重要,一个有可能递减的计数器 Counter
 实际上是一个Gauge
。其他的监测系统经常在计数器 Counter
 复位时丢弃信息,比如Graphite的nonNegativeDerivative功能。rate()
 还具有处理传递给 rate()
的不完全覆盖整个时间范围的样本的逻辑。

除了 rate()
 之外,还有 increase()
 和irate()
 这两个对计数器 Counter
 进行操作的函数。rate()
 返回每秒的值,increase()
 是一个方便的函数,它返回时间段内的总数。例如,increase(my_counter_total[1h])
 将返回计数器Counter每小时的增量。以前讨论过irate()
,它只查看最后两个样本,对于短时间内的高精度图非常有用。resets()
 告诉您计数器Counter重置的频率,这对于调试非常有用。

最后,虽然我们在这里只讨论了计数请求,计数器Counter可以用任何非负的浮点值递增。您可以使用它们来跟踪时间花费,字节处理,异常跑出或记录遍历。

更多资料可以查看 柏林的CloudNativeCon 2017 ,对此主题进行了更深入的演讲
https://www.youtube.com/watch?v=67Ulrq6DxwA


二、Gauge

Prometheus Gauge
 原理和其他监测系统中的 Gauge
 一样简单。随着时间的推移, Gauge
可以上下浮动,而 scrape
值 则可以对当前值进行快照。像计数器Counter
 一样,移动平均值或重置是不可能的。

Prometheus不同于其他监控系统的是 Gauge
的API。Prometheus的Gauge
API涵盖了所有Gauge
的使用场景在一个地方使用的情况。它有 inc
dec
set
方法,以及各种常用的实用功能(如设置当前时间)。客户端client库library负责所有的bookkeeping和线程安全。通常也有一些方法来做回调,比如Python中的 set_function
,Java中的 setChild
,Go中的 GaugeFunc

相比之下,流行的Dropwizard metric library提供了许多不同的 gauge
 类,主要基于您希望它在暴露gauge
 之前执行什么处理。我认为有两个类是core核心的,因为它们不做任何额外的处理。Dropwizard Gauge
 有一个基于回调的API。Dropwizard计数器 Counter
 有 inc
 和 dec
方法,这实际上使它成为普罗米修斯的一个衡gauge
。其他Dropwizard gauge
 类型的用例在Prometheus有不同的处理方式,例如Dropwizard Meter是一个结合PromQL rate
功能为例的Prometheus Counter。

与许多其他监视和仪表系统相比,还有一个不同之处。与Prometheus一样,完全支持64位浮点值。

PromQL提供了许多处理gauge
的函数和操作符。事实上,除了少数只与计数器Counter
一起使用的函数(如rate
)之外,所有函数都可以与gauge
一起合理使用。值得注意的函数包括使用简单线性回归来计算值的变化率的deriv
,以及更进一步并预测未来的predict_linear
。使用max
min
avg
等操作符可以跨系列聚合,使用max_over_time
min_over_time
avg_over_time
等函数可以跨时间聚合。

未完待续, Summary and Histogram下篇工作原理敬请期待


欢迎大家购买我的新书《HikariCP数据库连接池实战》



《HikariCP数据库连接池实战》京东的数据库专题上线,轮转推荐


https://pro.m.jd.com/mall/active/2sfniwqTJWrqUQbWozxWvWrAW7tk/index.html


豆瓣书评:

https://book.douban.com/subject/34659722/


中关村软件园1024无bug市集现场书展


双十一大促,促销费用都是出版社来承担,京东双十一期间100-50元,预购从速


京东购书二维码:

欢迎转发海报:




你点的每个“在看”,我都认真当成了喜欢
复制
文章转载自工匠人生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论