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请求接口
使用Counter.build()创建Counter metrics,
name()方法,用于指定该指标的名称
labelNames()方法,用于声明该metrics拥有的维度label。
在preHandle方法中,我们获取当前请求的,RequesPath,Method以及状态码。并且调用inc()方法,在每次请求发生时计数+1。
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?