随手记 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类型会有两个问题

  1. 如果在两个检查点之间(比如Prometheus服务器每隔5分钟来获取一次结果)突然拉了一个大高峰,但是在第二个检查点之前就降落了,那么获取到的Gauge值是无法反应这个大高峰的
  2. 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 | rate 难以捕获快速变化的计数器的值(捕获峰值),一般情况下,使用 rate 效果更好

PrometheusQL

这里融合了一些 Grafana 的语句

1
2
3
4
sum(rate(
nginx_http_requests{
host=~"$host",path=~"$path",cluster=~"$cluster",status="200"}[$__rate_interval]))
by (${group_by_path}host,cluster,status)
  • PQL sum(rate(nginx_http_requests{host=~**,path=**,cluster=**,status=200}[ ** ])) by (**)
    • 这里的监控指标(metric)为 nginx_http_requests ,筛选条件(label)为内部的一系列键值,方括号 [ ** ] 内为采样时间窗, by 语句后是聚类语法
  • 这里的 $host $path $cluster $__rate_interval 都会替换为 Grafana 的具体变量
    • $__rate_intervalGrafana 的时间窗,会根据窗体显式的时间区间自动调整

随手记 Prometheus
https://blog.sukiloli.com/2024/11/11/Prometheus初见/
作者
QLozin
发布于
2024年11月11日
许可协议