随手记 Prometheus
https://www.cnblogs.com/litzhiai/p/11169650.html
https://cloud.tencent.com/developer/ask/sof/260909
正儿八经的文档
https://icloudnative.io/prometheus/3-prometheus/functions.html
https://www.prometheus.wang/promql/prometheus-promql-functions.html
指标
- Counter :计数器指标,只增不减,反映累计趋势
- 这种指标的设计一般是客户端每次发生请求时直接记录,当Prometheus服务器轮询时直接提取数据
- Gauge : 动态指标,可增可减,反应动态趋势
- 这种指标一般是服务器轮询时,客户端实时计算得到结果返回
为什么Gauge不能替代Counter?
比如,对于一个HTTP请求的记录指标 nginx_http_count 使用Counter则是没来一次请求就增加一个数值,Prometheus服务器轮询时直接返回当前值,如果是Gauge类型会有两个问题
- 如果在两个检查点之间(比如Prometheus服务器每隔5分钟来获取一次结果)突然拉了一个大高峰,但是在第二个检查点之前就降落了,那么获取到的Gauge值是无法反应这个大高峰的
- Gauge指标是轮询时计算的,对于动态的指标(HTTP频繁建立和断连),当轮询时客户端才去统计当前的HTTP连接数,容易造成数据失真(你不知道有哪些HTTP链接在检查点之前就断连了,这部分是无法统计到的)
函数表
- rate(…) 函数计算在时间窗内的平滑的平均变化率
- irate(…) ,用于计算瞬时变化率,常用于累计指标的瞬时变化计算
- increase(…) 给出时间窗内数值的增加量
- delta(…) 给出时间窗内数值的变化量
- change( vector )
- 输入一个区域向量,计算每个数值变化的次数,如果样本数值没有发生变化,则恒为 1
- clamp_max( vector, max ) | clam_min( vector , min )
- 输入一个向量,如果超出最大值 \ 最小值 则使用给定的最大值 \ 最小值
- sort( … , DESC | AES ) 按数值大小排序
计算函数
- sum(…) 求和统计结果
- avg(…) 平均值结果
- min(…) | max(…) 结果中的最小或最大值
- count(…) 统计结果数量,往往用于不是数字的结果
- topk(…) 取得前K个大的元素
- bottomk(…) 取出后k个小的元素
- quantile(…) 计算出指标值的分位数
- histogram_quantile( $\phi$ , vector ) 从bucket类型的向量中求取分位数的最大值
数学函数
- abs(…) 取绝对值
- ceil(…) | foor(…) 向上取整 | 向下取整
- exp( … ) 求取 $e^{…}$ 导数结果
- sqrt | ln | log2 | log10
- 基于换底公式,自定义底数 $\frac{log(X)}{log100} = log_{100}(X)$
- stddev(…) | stdvar(…) 标准差 | 方差
label_replace
标签替换函数
*label_replace( vector , dstLabel , replaceStr , srcLabel , regStr )*
- dstLabel : 替换\新增标签名称,与
srcLabel
保持进行原地替换 - replaceStr: 替换的标签名称,与旧标签保持一致时使用
$1
,下表来自 regStr正则匹配结果 - srcLabel: 被替换的标签名称
- regStr: 正则,可以用于提取被替换标签的一部分赋值,使用
(.*)
进行拷贝
irate rate increase 辨析
https://techannotation.wordpress.com/2021/07/19/irate-vs-rate-whatre-they-telling-you/
- 二者只考虑时间窗口的起始点和终止点,做差后除去时间窗大小
- irate
- 推荐用于间隔较小的瞬时速率计算
- 受到数据起伏的速度大,时间窗默认为两个检查点的间隔,不可调
- rate
- 推荐用于整体趋势的反应
- 通过调大时间窗来平滑个别检查点的突发变化,更反应整个时间窗的趋势
- irate
注意,irate | rate 难以捕获快速变化的计数器的值(捕获峰值),一般情况下,使用 rate 效果更好
PrometheusQL
这里融合了一些 Grafana 的语句
1 |
|
- PQL
sum(rate(nginx_http_requests{host=~**,path=**,cluster=**,status=200}[ ** ])) by (**)
- 这里的监控指标(metric)为 nginx_http_requests ,筛选条件(label)为内部的一系列键值,方括号
[ ** ]
内为采样时间窗,by
语句后是聚类语法
- 这里的监控指标(metric)为 nginx_http_requests ,筛选条件(label)为内部的一系列键值,方括号
- 这里的
$host $path $cluster $__rate_interval
都会替换为 Grafana 的具体变量$__rate_interval
为 Grafana 的时间窗,会根据窗体显式的时间区间自动调整
随手记 Prometheus
https://blog.sukiloli.com/2024/11/11/Prometheus初见/