PromQL 备忘

偶尔需要写PromQL,但是总是不记得,以下为备忘。

表达式语言数据类型包括以下四种:

  • 瞬时向量 Instant vector:一组时间序列,每个时间序列包含单个样本,它们共享相同的时间戳。也就是说,表达式的返回值中只会包含该时间序列中的最新的一个样本值。而相应的这样的表达式称之为瞬时向量表达式。
  • 区间向量 Range vector:- 一组时间序列,每个时间序列包含一段时间范围内的样本数据。
  • 标量 Scalar:一个浮点型的数据值。
  • 字符串 String: - 一个简单的字符串值。

下面来看看查询语句:

  • http_requests_total 查询所有值
  • http_requests_total{job=“xxx”} 用大括号增加过滤条件,逗号 , 分割多个条件
    • = : 选择与提供的字符串完全相同的标签。
    • != : 选择与提供的字符串不相同的标签。
    • =~ : 选择正则表达式与提供的字符串(或子字符串)相匹配的标签。
    • !~ : 选择正则表达式与提供的字符串(或子字符串)不匹配的标签。

例如 http_requests_total{environment=~"staging|testing|development",method!="GET"}

  • 用中括号选择时间,例如 http_requests_total{job="prometheus"}[5m],单位有:

    • ms - milliseconds
    • s - seconds
    • m - minutes
    • h - hours
    • d - days - assuming a day has always 24h
    • w - weeks - assuming a week has always 7d
    • y - years - assuming a year has always 365d
  • rate() 函数用来计算变化率

  • increase() 用来计算增长量

  • sum() 用来聚合

sum(rate(xxx)) / sum(rate(xxx)) = sum(increase()) / sum(increase)

  • histogram_quantile() 用来计算直方图里,百分位中的最大值

例如 histogram_quantile(0.9, rate(http_requests_total[10m])) 计算 过去10分钟内,http_requests_total 90% 分位的最大值。

  • $__interval 是Grafana中选中的时间范围
  • $__rate_interval 是选中时间范围,但是解决了 $__interval 的一些小问题,比如 $__interval 选择了15s,刚好Prometheus抓取间隔是15s,那么就会显示不出数据,而 $__rate_interval 保证至少会选择4个数据展示出来。

ref:


更多文章
  • Redis源码阅读:启动过程
  • WAL(Write-ahead logging)的套路
  • 搞定CORS问题
  • 如何定位程序问题所在
  • 设计一个IM归档系统
  • logrotate read only filesystem问题
  • Golang GIN写单测时,愉快的使用返回值
  • Python Queue源码分析
  • Go里优雅的使用全局配置
  • Golang sync.Map源码分析
  • Android滑动时隐藏FAB
  • Python中用tuple作为key
  • 一些常用的算法思维
  • 编写可维护的函数
  • 为什么要把配置保存在仓库里?