springboot整合prometheus(五)

Prometheus 的特点

  • 多维数据模型(时序列数据由metric名和一组key/value组成)

  • 在多维度上灵活的查询语言(PromQl)

  • 不依赖分布式存储,单主节点工作.

  • 通过基于HTTP的pull方式采集时序数据

  • 可以通过中间网关进行时序列数据推送(pushing)

  • 目标服务器可以通过发现服务或者静态配置实现

  • 多种可视化和仪表盘支持

TSDB是什么? (Time Series Database)

简单的理解为.一个优化后用来处理时间序列数据的软件,并且数据中的数组是由时间进行索引的

  • 大部分时间都是写入操作

  • 写入操作几乎是顺序添加;大多数时候数据到达后都以时间排序.

  • 写操作很少写入很久之前的数据,也很少更新数据.大多数情况在数据被采集到数秒或者数分钟后就会被写入数据库.

  • 删除操作一般为区块删除,选定开始的历史时间并指定后续的区块.很少单独删除某个时间或者分开的随机时间的数据.

  • 数据一般远远超过内存大小,所以缓存基本无用.系统一般是 IO 密集型

  • 读操作是十分典型的升序或者降序的顺序读,

  • 高并发的读操作十分常见.

做一个案例,基于springboot整合prometheus监控http

Counter:只增不减的计数器,记录应用请求的总量 Gauge: 可增可减的仪表盘,我们使用Gauge记录当前正在处理的Http请求数量 Histogram: 分布统计图 Summary: 分布统计图

gradle

springboot配置

1. 请求总量的监控Counter

最终的统计结果样式:

首先需要定义数据收集器collector

定义一个http拦截器

注册http拦截器使其生效

定义两个http请求接口

  1. 使用Counter.build()创建Counter metrics,

  2. name()方法,用于指定该指标的名称

  3. labelNames()方法,用于声明该metrics拥有的维度label。

  4. 在preHandle方法中,我们获取当前请求的,RequesPath,Method以及状态码。并且调用inc()方法,在每次请求发生时计数+1。

  5. Counter.build()…register(),会像Collector中注册该指标,并且当访问/metrics地址时,返回该指标的状态。

通过指标http_requests_total我们可以:

  • 查询应用的请求总量

  • 查询每秒Http请求量

  • 查询当前应用请求量Top N的URI

2. 当前正在处理的http请求数

最后的显示样式是:

3. Histogram:自带buckets区间用于统计分布统计图

http请求内容长度的区间分布图

我们可以看到,自己通过le标签划分了区间,默认的划分间隔就是下面这样的0-10

如果value值在0-100之间的数值,我们就不得不自己划分区间 使用Histogram构造器可以创建Histogram监控指标。默认的buckets范围为{.005, .01, .025, .05, .075, .1, .25, .5, .75, 1, 2.5, 5, 7.5, 10}。如果需要覆盖默认的buckets,可以使用.buckets(double… buckets)覆盖。

4. Summary

常用的百分位数为0.5-quantile,0.9-quantile以及0.99-quantile。这也是Prometheus默认的设置。

这只是Prometheus中Summary目前版本的默认设置,在版本v0.10中,这些默认值会废弃,意味着默认的Summary将没有quantile设置。

自定义百分比区间

对面下面这一系列值的统计结果是:

6,14,15,23,24,51,79,86,92,95

5. 自定义collector

prometheus每次拉取metrics的时候,都会执行MyCollector.collect()方法

prometheus提供的collector和自己定义的collector区别:

prometheus定义的是成员变量,每次prometheus拉取数据的时候,直接读取内存中的数据,内存中的数据是我们在数据改变的时候就设置的到内存中了已近,说白了就是我们把数据推到内存中的成员变量上, 而prometheus直接从成员变量上拉取数据 自定义的collector是每次prometheus读取数据的时候,都要执行方法,从数据哭或者其他方法获取数据,这些数据都是计算好了的数据,例如counter可以做累计,我们只需要每次inc()+1,成员变量标签值上会帮助我们累计值,但是如果使用自己定义的counter,我们设置的值就是直接当时的值,可以理解成自己定义的collector是计算好的当时的结果值,直接存入到数据库中,而我们每次直接从数据库中读取当时的值

6. Timer计时器

Timer(计时器)同时测量一个特定的代码逻辑块的调用(执行)速度和它的时间分布。简单来说,就是在调用结束的时间点记录整个调用块执行的总时间,适用于测量短时间执行的事件的耗时分布

  • 适用于label的value是一个时间长度,用于时间的分布统计

  • 支持Histogram和Summary

还有一种写法

http请求时长的统计

Last updated

Was this helpful?