乔克视界 乔克视界
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • Kubernetes
  • Prometheus
  • ELK
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档

乔克

云原生爱好者
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • Kubernetes
  • Prometheus
  • ELK
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档
  • Docker

  • Golang

  • AIOps

  • Python

  • DevOps

  • Kubernetes

  • Prometheus

    • Prometheus 介绍
    • 手动搭建 Prometheus
    • 配置监控
    • 安装 Grafana
    • AlertManager
    • Operator 部署 Prometheus
    • 常用函数
    • 黑盒监控
    • 集群事件监控之 kube-eventer
    • 配置企业微信告警
    • PromQL 常用操作
      • 配置短信告警
      • 监控指标
      • PushGateway
      • Google 四大黄金指标
      • Kubernetes 性能指标
    • ELK

    • 专栏
    • Prometheus
    乔克
    2025-07-20
    目录

    PromQL 常用操作

    # (1)、即时矢量选择器

    =:匹配与标签相等的内容

    !=:不匹配与标签相等的内容

    =~: 根据正则表达式匹配与标签符合的内容

    !~:根据正则表达式不匹配与标签符合的内容

    示例:

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

    说明:这将匹配 method 不等于 GET,environment 匹配到 staging,testing 或 development 的 http_requests_total 请求内容。

    注意:向量选择器必须指定一个名称或至少一个与空字符串不匹配的标签匹配器

    比如以下表达式是非法的:

    { job=~"." } # Bad!
    
    1

    相反,这些表达式是有效的,因为它们都有一个与空标签值不匹配的选择器。

    {job=~".+"} # Good!
    {job=~".",method="get"} # Good!
    
    1
    2

    # (2)、范围矢量选择器

    持续时间仅限于数字,接下来是以下单位之一:

    • s - seconds
    • m - minutes
    • h - hours
    • d - days
    • w - weeks
    • y - years

    在此示例中,我们选择在过去 5 分钟内为度量标准名称为 http_requests_total 且标签设置为 job=prometheus 的所有时间序列记录的所有值:

    http_requests_total{job="prometheus"}[5m]
    
    1

    # (3)、偏移量修改器

    偏移修改器允许更改查询中各个即时和范围向量的时间偏移。

    例如,以下表达式相对于当前查询 5 分钟前的 http_requests_total 值:

    http_requests_total offset 5m
    
    1

    注意,偏移修改器需要立即跟随选择器,即以下内容是正确的:

    sum(http_requests_total{method="GET"} offset 5m) // GOOD.
    
    1

    以下内容是不正确的:

    sum(http_requests_total{method="GET"}) offset 5m // INVALID.
    
    1

    同样适用于范围向量。这将返回 http_requests_total 一周前的 5 分钟增长率:

    rate(http_requests_total[5m] offset 1w)
    
    1

    # (4)、二元运算符

    # (4.1)、算术二元运算符

    Prometheus 中存在以下二进制算术运算符:

    • (addition)
    • (subtraction)
    • (multiplication)
      / (division)
      % (modulo)
      ^ (power/exponentiation)
    # (4.2)、比较二元运算符
    • == (equal)
    • != (not-equal)
    • =(greater-than)

    • < (less-than)
    • = (greater-or-equal)
    • <= (less-or-equal)
    # (4.3)、逻辑/集二进制运算符
    • and (intersection)
    • or (union)
    • unless (complement)

    # (5)、矢量匹配

    # (5.1)、一对一矢量匹配

    一对一从操作的每一侧找到唯一的条目对。在默认情况下,这是格式为 vector1 vector2 之后的操作。如果两个条目具有完全相同的标签集和相应的值,则它们匹配。 ignore 关键字允许在匹配时忽略某些标签,而 on 关键字允许将所考虑的标签集减少到提供的列表:

    • ignoring()
    • on()

    示例:

    输入的内容如下

    method_code:http_errors:rate5m{method="get", code="500"} 24
    method_code:http_errors:rate5m{method="get", code="404"} 30
    method_code:http_errors:rate5m{method="put", code="501"} 3
    method_code:http_errors:rate5m{method="post", code="500"} 6
    method_code:http_errors:rate5m{method="post", code="404"} 21
    
    method:http_requests:rate5m{method="get"} 600
    method:http_requests:rate5m{method="del"} 34
    method:http_requests:rate5m{method="post"} 120
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    查询语句如下

    method_code:http_errors:rate5m{code="500"} / ignoring(code) method:http_requests:rate5m
    
    1

    这将返回一个结果向量,其中包含每个方法的状态代码为 500 的 HTTP 请求部分,在过去 5 分钟内测量。在不忽略(代码)的情况下,由于度量标准不共享同一组标签,因此不会匹配。方法 put 和 del 的条目没有匹配,并且不会显示在结果中:

    {method="get"} 0.04 // 24 / 600
    {method="post"} 0.05 // 6 / 120
    
    1
    2
    # (5.2)、多对一和一对多矢量匹配

    多对一和一对多匹配指的是"一"侧的每个向量元素可以与"多"侧的多个元素匹配的情况。必须使用 group_left 或 group_right 修饰符明确请求,其中 left/right 确定哪个向量具有更高的基数。

    • ignoring() group_left()
    • ignoring() group_right()
    • on() group_left()
    • on() group_right()

    示例:

    method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m
    
    1

    在这种情况下,左向量每个方法标签值包含多个条目。因此,我们使用 group_left 表明这一点。右侧的元素现在与多个元素匹配,左侧具有相同的方法标签:

    {method="get", code="500"} 0.04 // 24 / 600
    {method="get", code="404"} 0.05 // 30 / 600
    {method="post", code="500"} 0.05 // 6 / 120
    {method="post", code="404"} 0.175 // 21 / 120
    
    1
    2
    3
    4

    多对一和一对多匹配是高级用例,应该仔细考虑。通常正确使用忽略()可提供所需的结果。

    # (6)、聚合运算符

    Prometheus 支持以下内置聚合运算符,这些运算符可用于聚合单个即时向量的元素,从而生成具有聚合值的较少元素的新向量:

    • sum (calculate sum over dimensions) #范围内求和
    • min (select minimum over dimensions) #范围内求最小值
    • max (select maximum over dimensions) #范围内求最大值
    • avg (calculate the average over dimensions) #范围内求最大值
    • stddev (calculate population standard deviation over dimensions) #计算标准偏差
    • stdvar (calculate population standard variance over dimensions) #计算标准方差
    • count (count number of elements in the vector) #计算向量中的元素数量
    • count_values (count number of elements with the same value) #计算向量中相同元素的数量
    • bottomk (smallest k elements by sample value)#样本中最小的元素值
    • topk (largest k elements by sample value)#样本中最大的元素值
    • quantile (calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions) #计算 0-1 之间的百分比数量的样本的最大值

    这些运算符可以用于聚合所有标签维度,也可以通过包含 without 或 by 子句来保留不同的维度。

    ([parameter,] ) [without|by ()]

    parameter 仅用于 count_values,quantile,topk 和 bottomk。without 从结果向量中删除列出的标签,而所有其他标签都保留输出。 by 相反并删除未在 by 子句中列出的标签,即使它们的标签值在向量的所有元素之间是相同的

    例:如果 http_requests_total 具有按 application,instance 和 group 标签列出的时间序列,我们可以通过以下方式计算每个应用程序和组在所有实例上看到的 HTTP 请求总数:

    sum(http_requests_total) without (instance)
    
    1

    等价于:

    sum(http_requests_total) by (application, group)
    
    1

    如果我们只对我们在所有应用程序中看到的 HTTP 请求总数感兴趣,我们可以简单地写:

    sum(http_requests_total)
    
    1

    要计算运行每个构建版本的二进制文件的数量,我们可以编写:

    count_values("version", build_version)
    
    1

    要在所有实例中获取 5 个最大的 HTTP 请求计数,我们可以编写:

    topk(5, http_requests_total)
    
    1

    # (7)、函数

    常用的函数有:

    • abs(v instant-vector) #返回其绝对值
    • absent() # 如果传递给它的向量具有该元素,则返回空向量;如果传递给它的向量没有元素,则返回传入的元素。
    • ceil(v instant-vector) #返回向量中所有样本值(向上取整数)
    • round(v instant-vector, to_nearest=1 scalar) #返回向量中所有样本值的最接近的整数,to_nearest 是可选的,默认为 1,表示样本返回的是最接近 1 的整数倍的值, 可以指定任意的值(也可以是小数),表示样本返回的是最接近它的整数倍的值
    • floor(v instant-vector) #返回向量中所有样本值(向下取整数)
    • changes(v range-vector) #对于每个输入时间序列,返回其在时间范围内(v range-vector)更改的次数
    • clamp_max(v instant-vector, max scalar) #限制 v 中所有元素的样本值,使其上限为 max
    • clamp_min(v instant-vector, min scalar) #限制 v 中所有元素的样本值,使其下限为 min
    • year(v=vector(time()) instant-vector) #返回 UTC 中给定时间的年份
    • day_of_month(v=vector(time()) instant-vector) #返回 UTC 中给定时间的月中的某一天,返回值为 1 到 31
    • day_of_week(v=vector(time()) instant-vector) #返回 UTC 中给定时间的当周中的某一天,返回值为 0 到 6
    • days_in_month(v=vector(time()) instant-vector) #返回 UTC 中给定时间的一个月的天数,返回值 28 到 31
    • hour(v=vector(time()) instant-vector) #返回 UTC 中给定时间的当天中的某一小时,返回值为 0 到 23
    • minute(v=vector(time()) instant-vector) #返回 UTC 中给定时间的小时中的某分钟,返回值为 0 到 59
    • delta(v range-vector) #返回一个即时向量,它计算每个 time series 中的第一个值和最后一个值的差别
    • deriv(v range-vector) #计算每个 time series 的每秒的导数(derivative)
    • exp(v instant-vector) #计算 v 中所有元素的指数函数
    • histogram_quantile(φ float, b instant-vector) #从 buckets 类型的向量中计算 φ(0 ≤ φ ≤ 1)百分比的样本的最大值
    • holt_winters(v range-vector, sf scalar, tf scalar) #根据范围向量中的范围产生一个平滑的值
    • idelta(v range-vector) #计算最新的 2 个样本值之间的差别
    • increase(v range-vector) #计算指定范围内的增长值, 它会在单调性发生变化时(如由于目标重启引起的计数器复位)自动中断
    • irate(v range-vector) #计算每秒的平均增长值, 基于的是最新的 2 个数据点
    • rate(v range-vector) #计算每秒的平均增长值
    • resets(v range-vector) #对于每个 time series , 它都返回一个 counter resets 的次数
    • sort(v instant-vector) #对向量按元素的值进行升序排序
    • sort_desc(v instant-vector) #对向量按元素的值进行降序排序
    • sqrt(v instant-vector) #返回 v 中所有向量的平方根
    • time() #返回从 1970-1-1 起至今的秒数,UTC 时间

    示例:

    nginx_server_connections{endpoint="metrics",instance="192.168.43.5:9913",job="nginx-vts",namespace="dev",pod="nginx-vts-9fcd4d45b-sdqds",service="nginx-vts",status="accepted"} 89061
    nginx_server_connections{endpoint="metrics",instance="192.168.43.5:9913",job="nginx-vts",namespace="dev",pod="nginx-vts-9fcd4d45b-sdqds",service="nginx-vts",status="handled"} 2
    
    absent(nginx_server_connections{job="nginx-vts"}) => {}
    absent(nginx_server_connections{job="nginx-vts123"}) => {job="nginx-vts123"}
    
    1
    2
    3
    4
    5

    原文:https://www.cnblogs.com/ZhongzhouChen/p/11696792.html (opens new window)

    上次更新: 2025/07/20, 10:40:32
    配置企业微信告警
    配置短信告警

    ← 配置企业微信告警 配置短信告警→

    最近更新
    01
    elastic 账户认证 401 问题
    07-20
    02
    使用 helm 安装 es 和 kibana
    07-20
    03
    elastic stack 搭建
    07-20
    更多文章>
    Theme by Vdoing | Copyright © 2019-2025 乔克 | MIT License | 渝ICP备20002153号 |
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式