Skip to content

PromQL 高级查询深度实践

PromQL (Prometheus Query Language) 是Prometheus的查询语言,提供了强大的时间序列数据查询、聚合和计算能力。掌握PromQL的高级用法是有效利用Prometheus监控数据的关键。

🎯 PromQL基础语法

选择器和匹配器

前面的 http_requests_total 是指标名

promql
# 精确匹配,等价于 SQL 的 `WHERE method = 'GET'`
http_requests_total{method="GET"}

# 正则匹配:=~,等价于 SQL 的 `WHERE method IN ('GET','POST')`,其中 | 表示或
http_requests_total{method=~"GET|POST"}
# 也可以用正则表达式 path=~"/api/v1/.*",等价于 SQL 的 `WHERE path LIKE '/api/v1/%'`

# 负匹配,等价于 SQL 的 `WHERE method <> 'GET'`
http_requests_total{method!="OPTIONS"}

# 正则负匹配,等价于 SQL 的 `WHERE method NOT IN ('GET','POST')`
http_requests_total{method!~"HEAD|OPTIONS"}

# 多标签条件
http_requests_total{method="GET", status="200", handler="/api"}

# 存在性匹配
{__name__=~"http_.*"}  # 所有以http_开头的指标
promql
# 范围向量 - 最近5分钟的数据
http_requests_total[5m]

# 时间偏移 - 1小时前的数据
http_requests_total offset 1h

# 范围向量偏移 - 1小时前的5分钟数据
http_requests_total[5m] offset 1h

# 绝对时间查询
http_requests_total @ 1609459200  # Unix时间戳

# 范围向量绝对时间
http_requests_total[5m] @ 1609459200

操作符优先级

PromQL操作符详解
promql
operator_precedence:
  # 1. 幂运算 (最高优先级)
  2^3^2  # 等价于 2^(3^2) = 2^9 = 512
  
  # 2. 乘法、除法、取模
  rate(http_requests_total[5m]) * 60  # 每分钟请求数
  
  # 3. 加法、减法
  up + on(instance) group_left() node_load1
  
  # 4. 比较运算符
  up == 1  # 布尔结果
  up > 0.5  # 过滤条件
  
  # 5. 逻辑运算符 (最低优先级)
  up == 1 and on(instance) rate(cpu_usage[5m]) > 0.8

complex_examples:
  # 括号改变优先级
  (rate(http_requests_total[5m]) + rate(grpc_requests_total[5m])) * 60
  
  # 布尔运算符
  http_requests_total > 1000 and http_requests_total < 5000
  http_requests_total > 1000 or grpc_requests_total > 500
  http_requests_total unless http_errors_total
  
  # 集合运算符
  up == 1 and on(instance) node_load1  # 基于instance标签连接
  up == 1 or on(job) node_load1  # 基于job标签连接
  up == 1 unless on(instance) node_down  # 排除down的节点

📊 聚合操作和函数

聚合操作符

promql
# sum - 求和
sum(http_requests_total)  # 所有请求总数
sum by(job)(http_requests_total)  # 按job分组求和
sum without(instance)(http_requests_total)  # 排除instance标签求和

# avg - 平均值  
avg(cpu_usage)  # CPU使用率平均值
avg by(datacenter)(cpu_usage)  # 按数据中心求平均

# max/min - 最大值/最小值
max(memory_usage_bytes)  # 最大内存使用
min by(pod)(cpu_usage)  # 每个Pod最小CPU使用率

# count - 计数
count(up == 1)  # 在线实例数量
count by(job)(up)  # 每个job的实例数量

# stddev - 标准差
stddev(response_time_seconds)  # 响应时间标准差
stddev by(service)(response_time_seconds)  # 按服务分组的标准差
promql
# topk/bottomk - Top K查询
topk(5, rate(http_requests_total[5m]))  # 请求量前5的服务
bottomk(3, node_memory_MemAvailable_bytes)  # 内存最少的3台机器

# quantile - 分位数
quantile(0.95, http_request_duration_seconds)  # 95分位数延迟
quantile by(service)(0.99, http_request_duration_seconds)  # 各服务99分位数

# count_values - 值计数
count_values("version", prometheus_build_info)  # 统计各版本实例数

# group - 分组(只保留标签)
group by(cluster)(up)  # 按集群分组,值固定为1

时间序列函数

promql
# rate - 每秒增长率(适用于Counter)
rate(http_requests_total[5m])  # HTTP请求每秒速率
rate(node_cpu_seconds_total[5m])  # CPU使用率(每秒)

# irate - 瞬时增长率(基于最后两个样本点)
irate(http_requests_total[5m])  # 瞬时请求速率

# increase - 时间段内增长量
increase(http_requests_total[1h])  # 1小时内请求增长量

# delta - Gauge类型指标的变化量
delta(node_memory_MemFree_bytes[5m])  # 5分钟内内存变化

# deriv - 导数(变化率)
deriv(node_memory_MemFree_bytes[5m])  # 内存使用变化趋势
promql
# 时间相关函数
time()  # 当前Unix时间戳
hour()  # 当前小时 (0-23)
day_of_month()  # 当前月份中的天 (1-31)
day_of_week()  # 当前周中的天 (0-6, 周日为0)
month()  # 当前月份 (1-12)

# 时间条件过滤
cpu_usage and on() hour() > 9 < 18  # 工作时间的CPU使用率
memory_usage and on() day_of_week() < 6  # 工作日的内存使用

# 基于时间的告警
(
  avg_over_time(cpu_usage[1h]) > 0.8
  and on() 
  (hour() >= 9 and hour() <= 17)
)  # 工作时间CPU持续高占用

数学和统计函数

promql
# 数学函数
abs(cpu_usage - 0.5)  # 绝对值
sqrt(memory_usage_bytes)  # 平方根
ln(http_requests_total)  # 自然对数
log10(http_requests_total)  # 常用对数
exp(cpu_usage)  # 指数函数

# 舍入函数
round(cpu_usage, 0.01)  # 四舍五入到小数点后2位
ceil(cpu_usage * 100)  # 向上取整
floor(cpu_usage * 100)  # 向下取整

# 限制函数
clamp_max(cpu_usage, 0.9)  # 限制最大值为0.9
clamp_min(memory_usage_ratio, 0.1)  # 限制最小值为0.1
clamp(response_time, 0.1, 2.0)  # 限制在0.1-2.0范围内
promql
# predict_linear - 线性预测
predict_linear(node_filesystem_free_bytes[1h], 4*3600)  # 预测4小时后磁盘剩余空间

# holt_winters - 霍尔特-温特斯平滑
# 参数:sf(平滑因子) tf(趋势因子)
holt_winters(cpu_usage[5m:30s], 0.5, 0.5)  # CPU使用率趋势预测

# 实际应用示例
(
  predict_linear(node_filesystem_free_bytes[2h], 24*3600) < 0
) * on(instance) group_left(hostname) node_uname_info
# 预测24小时后磁盘空间不足的主机

🔍 复杂查询模式

多指标关联查询

promql
# one-to-one匹配 (默认)
node_memory_MemFree_bytes / node_memory_MemTotal_bytes  # 内存使用率

# many-to-one匹配 (group_left)
rate(http_requests_total[5m]) * on(instance) group_left(hostname) node_uname_info

# one-to-many匹配 (group_right)
node_uname_info * on(instance) group_right(method) rate(http_requests_total[5m])

# 指定匹配标签
rate(http_requests_total[5m]) 
* on(instance, job) 
group_left(hostname, datacenter) 
node_uname_info
promql
# 子查询语法:query[range:resolution]
# 查询过去1小时内,每5分钟的最大CPU使用率
max_over_time(
  (rate(cpu_usage[5m]))[1h:5m]
)

# 复杂子查询:过去24小时内每小时的错误率峰值
max_over_time(
  (
    rate(http_requests_total{status=~"5.."}[5m]) 
    / 
    rate(http_requests_total[5m])
  )[24h:1h]
)

# 嵌套子查询:检查是否存在异常波动
abs(
  rate(http_requests_total[5m])
  - 
  avg_over_time(rate(http_requests_total[5m])[1h:5m])
) > 0.2 * avg_over_time(rate(http_requests_total[5m])[1h:5m])

条件和逻辑查询

promql
# 简单条件过滤
up == 1  # 只显示在线的实例
cpu_usage > 0.8  # CPU使用率超过80%的实例

# 复合条件
(cpu_usage > 0.8 and memory_usage > 0.9)  # 同时满足CPU和内存高使用

# 条件聚合
sum(cpu_usage > 0.8)  # 统计CPU高使用率的实例数量
count(up == 1) by (job)  # 各job在线实例数

# 布尔运算作为乘数
cpu_usage * on() (hour() >= 9 and hour() <= 17)  # 工作时间的CPU使用率
promql
# unless操作符 - 排除
up == 1 unless on(instance) 
(node_load1 > 2 * on(instance) node_cpu_cores)  # 排除负载过高的实例

# or操作符 - 任一条件满足
(cpu_usage > 0.8) or (memory_usage > 0.9) or (disk_usage > 0.95)
# CPU、内存或磁盘任一资源紧张

# 组合复杂逻辑
(
  # 高错误率
  (
    rate(http_requests_total{status=~"5.."}[5m]) /
    rate(http_requests_total[5m]) > 0.05
  )
  and
  # 且不在维护时间
  on() (
    hour() >= 8 and hour() <= 22 and 
    day_of_week() >= 1 and day_of_week() <= 5
  )
  and
  # 且请求量足够大
  (rate(http_requests_total[5m]) > 10)
)

📈 性能优化查询

窗口函数优化

promql
# 短窗口 - 实时性好,但噪声多
rate(http_requests_total[1m])  # 1分钟窗口
irate(http_requests_total[1m])  # 瞬时速率

# 长窗口 - 平滑但滞后
rate(http_requests_total[15m])  # 15分钟窗口
avg_over_time(cpu_usage[10m])  # 10分钟平均值

# 自适应窗口选择
rate(http_requests_total[max(5m, 2 * scrape_interval)])
# 至少5分钟,或者2倍抓取间隔
promql
# 低效:先聚合再计算比率
sum(rate(http_requests_total{status=~"5.."}[5m])) /
sum(rate(http_requests_total[5m]))

# 高效:先计算比率再聚合
avg(
  rate(http_requests_total{status=~"5.."}[5m]) /
  rate(http_requests_total[5m])
)

# 分步聚合 - 适用于高基数场景
sum by (service) (
  sum by (service, instance) (
    rate(http_requests_total[5m])
  )
)

资源使用优化查询

常用性能监控查询模式
promql
performance_queries:
  cpu_utilization:
    # CPU总体使用率
    overall_cpu: |
      100 - (
        avg by (instance) (
          irate(node_cpu_seconds_total{mode="idle"}[5m])
        ) * 100
      )
    
    # 各CPU模式使用率
    cpu_by_mode: |
      100 * (
        1 - avg by(instance) (
          irate(node_cpu_seconds_total{mode="idle"}[5m])
        )
      )
    
    # CPU饱和度(负载均衡)
    cpu_saturation: |
      node_load1 / on(instance) group_left()
      count by(instance) (
        count by(instance, cpu) (
          node_cpu_seconds_total{mode="idle"}
        )
      )
  
  memory_utilization:
    # 内存使用率
    memory_usage_ratio: |
      1 - (
        node_memory_MemAvailable_bytes /
        node_memory_MemTotal_bytes
      )
    
    # 内存使用量(GB)
    memory_used_gb: |
      (
        node_memory_MemTotal_bytes -
        node_memory_MemAvailable_bytes
      ) / 1024^3
    
    # Swap使用情况
    swap_usage: |
      (
        node_memory_SwapTotal_bytes -
        node_memory_SwapFree_bytes
      ) / node_memory_SwapTotal_bytes
  
  disk_utilization:
    # 磁盘使用率
    disk_usage_ratio: |
      1 - (
        node_filesystem_avail_bytes{fstype!="tmpfs"} /
        node_filesystem_size_bytes{fstype!="tmpfs"}
      )
    
    # 磁盘IOPS
    disk_iops: |
      rate(node_disk_reads_completed_total[5m]) +
      rate(node_disk_writes_completed_total[5m])
    
    # 磁盘IO利用率
    disk_io_utilization: |
      rate(node_disk_io_time_seconds_total[5m])
  
  network_utilization:
    # 网络吞吐量 (Mbps)
    network_throughput_mbps: |
      (
        rate(node_network_receive_bytes_total[5m]) +
        rate(node_network_transmit_bytes_total[5m])
      ) * 8 / 1000000
    
    # 网络错误率
    network_error_rate: |
      rate(node_network_receive_errs_total[5m]) +
      rate(node_network_transmit_errs_total[5m])
    
    # 网络丢包率
    network_drop_rate: |
      rate(node_network_receive_drop_total[5m]) +
      rate(node_network_transmit_drop_total[5m])

  application_queries:
    # HTTP错误率
    http_error_rate: |
      sum(rate(http_requests_total{status=~"5.."}[5m])) by (service) /
      sum(rate(http_requests_total[5m])) by (service)
    
    # HTTP 95分位延迟
    http_p95_latency: |
      histogram_quantile(0.95,
        sum(rate(http_request_duration_seconds_bucket[5m])) by (le, service)
      )
    
    # 数据库连接池使用率
    db_connection_utilization: |
      mysql_global_status_threads_connected /
      mysql_global_variables_max_connections
    
    # JVM堆内存使用率
    jvm_heap_usage: |
      jvm_memory_bytes_used{area="heap"} /
      jvm_memory_bytes_max{area="heap"}
    
    # Redis命中率
    redis_hit_rate: |
      rate(redis_keyspace_hits_total[5m]) /
      (
        rate(redis_keyspace_hits_total[5m]) +
        rate(redis_keyspace_misses_total[5m])
      )

business_metrics_queries:
  # 业务指标示例
  user_activity:
    # 活跃用户数增长率
    active_user_growth: |
      (
        active_users_total -
        active_users_total offset 1d
      ) / active_users_total offset 1d * 100
    
    # 用户会话时长分布
    session_duration_p90: |
      histogram_quantile(0.90,
        rate(user_session_duration_seconds_bucket[5m])
      )
  
  transaction_metrics:
    # 交易成功率
    transaction_success_rate: |
      sum(rate(transactions_total{status="success"}[5m])) /
      sum(rate(transactions_total[5m]))
    
    # 平均交易金额
    avg_transaction_amount: |
      rate(transaction_amount_sum[5m]) /
      rate(transaction_amount_count[5m])

promQL与SQL对照表

基础运算

功能分类PromQL 示例SQL 对应语句说明
精确匹配{method="GET"}WHERE method = 'GET'标签值完全等于
正则匹配{method=~"GET|POST"}WHERE method IN ('GET','POST')标签值多匹配
🚫 不等匹配{method!="GET"}WHERE method <> 'GET'标签值不等于
🚫 正则负匹配{method!~"GET|POST"}WHERE method NOT IN ('GET','POST')标签值多不匹配
🏷️ 多标签条件{method="GET",status="200",handler="/api"}WHERE method='GET' AND status='200' AND handler='/api'多条件组合匹配
🧩 存在性匹配{__name__=~"http_.*"}WHERE metric_name LIKE 'http_%'匹配指标名模式(可匹配所有以 http_ 开头的指标)
📈 区间函数increase(metric[10m])聚合窗口内数据的增量类似于滑动窗口求差值
🧮 求和sum(rate(http_requests_total[5m]))SELECT SUM(rate) FROM table对所有实例求和
🧩 分组求和sum(rate(http_requests_total[5m])) by (method)SELECT method, SUM(rate) GROUP BY method按标签分组聚合
🧮 计数count(http_requests_total)SELECT COUNT(*) FROM table统计样本数量
🧠 最大/最小值max(rate(cpu_usage[5m]))SELECT MAX(cpu_usage)取区间最大值
🧭 过滤为空补零... or vector(0)COALESCE(value, 0)没有数据时补 0
⏱️ 时间窗口[10m], [5m], [1h]时间区间函数(滑动窗口)对应时间序列区间长度
🧮 比值计算sum(a) / sum(b)(SELECT SUM(a))/SUM(b)可直接算比例(如可用率)
🧩 聚合维度删除sum without(instance)(metric)GROUP BY 除 instance 外的所有字段删除某个标签维度聚合

聚合运算

功能分类PromQL 示例SQL 对应语句说明
正则匹配sum by (zone) (increase(...{method=~"ModifyRelation|DelFollowing"}[10m]))SELECT zone, SUM(value)
FROM metric
WHERE method IN ('ModifyRelation', 'DelFollowing')
GROUP BY zone;
筛选出所有匹配的 time series(即 method=A 或 B),之后进行sum
+sum by (zone)(increase(...method=ModifyRelation...)) +
sum by (zone)(increase(...method=DelFollowing...))
点对点匹配(one-to-one matching)
只有当 两边的标签集合完全一致(即 zone 相同)时,Prometheus 才会进行加法,否则丢弃这条标签
orA or BSELECT * FROM A<br>UNION<br>SELECT * FROM B WHERE key NOT IN (SELECT key FROM A)- or 运算返回两边的并集,但不会相加。

- 对相同 labelset 的 time series,返回左边(A)那条;

- 对只在右边存在的,保留右边。
andA and B

常见问题

数据丢失

sum(rate(http_requests_total[5m])) by (method) + sum(rate(http_requests_total[5m])) by (method) :如果第一部分数据有两个method维度,第二个数据有一个维度,那么会丢失(保留method完全匹配的维度数据)

📋 PromQL面试重点

基础语法类

  1. PromQL的基本数据类型有哪些?

    • Instant Vector (瞬时向量)
    • Range Vector (范围向量)
    • Scalar (标量)
    • String (字符串)
  2. 选择器的匹配模式有哪些?

    • 精确匹配 (=)
    • 正则匹配 (=~)
    • 负匹配 (!=)
    • 正则负匹配 (!~)
  3. 时间偏移和绝对时间查询如何使用?

    • offset关键字的用法
    • @ 操作符的绝对时间查询
    • 组合使用的场景

函数应用类

  1. rate()和irate()函数的区别?

    • rate(): 时间段平均速率
    • irate(): 瞬时速率(基于最后两个点)
    • 适用场景和选择原则
  2. 聚合操作符的匹配机制?

    • by和without的区别
    • group_left和group_right的使用
    • 向量匹配的原则
  3. 如何处理Histogram数据?

    • histogram_quantile()函数使用
    • bucket边界的设计
    • 分位数计算原理

高级查询类

  1. 子查询的使用场景和语法?

    • 嵌套时间序列查询
    • 性能考虑和优化
    • 实际应用案例
  2. 如何优化复杂的PromQL查询?

    • 查询执行顺序优化
    • 聚合层次调整
    • 时间窗口选择策略
  3. 业务指标的计算模式?

    • SLI/SLO指标构建
    • 错误率和延迟计算
    • 业务漏斗分析

🔗 相关内容


掌握PromQL的高级用法是有效利用Prometheus监控数据的关键。通过深入理解查询语言的各种功能,可以构建强大的监控分析和告警系统。

查询一: (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod"} [10m])or vector(0))) sh001:65758 sh004:66639

查询二: (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/DelFollowing",env="prod"} [10m])or vector(0))) sh001:2340 sh004:0

聚合方式一:通过 正则 & | sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation|/?account.service.relation.v1.Relation/DelFollowing",env="prod"} [10m])) or vector(0) sh001:68098 sh004:66639

聚合方式二:通过 + 1、(sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod"} [10m])or vector(0))) + (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/DelFollowing",env="prod"} [10m])or vector(0))) sh001:68098

聚合方式三:通过 or (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod"} [10m])or vector(0))) or (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/DelFollowing",env="prod"} [10m])or vector(0))) sh001:65758 sh004:66639

聚合方式四:通过 and (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod"} [10m])or vector(0))) and (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/DelFollowing",env="prod"} [10m])or vector(0))) sh001:65758

聚合方式五:通过二次sum sum by(zone) ((sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod"} [10m]))or vector(0)) , (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/DelFollowing",env="prod"} [10m])) or vector(0))) sh001:68098 sh004:66639

查询一: (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh004"} [10m])) or vector(0)) sh004:66639

查询二: (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/DelFollowing",env="prod", zone="sh001"} [10m])) or vector(0)) sh001:2340

聚合方式一:通过 正则 & | sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation|/?account.service.relation.v1.Relation/DelFollowing",env="prod"} [10m])) or vector(0) sh001:68098 sh004:66639

聚合方式二:通过 + 1、(sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh004"} [10m]) or vector(0))) + (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/DelFollowing",env="prod", zone="sh001"} [10m])or vector(0))) sh001: 0 sh004: 0 2、sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh004"} [10m])) or vector(0) + sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/DelFollowing",env="prod", zone="sh001"} [10m])) or vector(0) sh001:2340 sh004:66639 3、(sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh004"} [10m])) or vector(0)) + sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/DelFollowing",env="prod", zone="sh001"} [10m])) or vector(0) sh001:2340 sh004:0 4、(sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/DelFollowing",env="prod", zone="sh001"} [10m])) or vector(0)) + sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh004"} [10m])) or vector(0) sh001:0 sh004:66639 5、sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh004"} [10m])) or vector(0) + (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/DelFollowing",env="prod", zone="sh001"} [10m])) or vector(0)) sh001:2340 sh004:66639

聚合方式三:通过 or (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh004"} [10m]) or vector(0))) or (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/DelFollowing",env="prod", zone="sh001"} [10m])or vector(0))) sh001:2340 sh004:66639

聚合方式四:通过 and (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh004"} [10m]) or vector(0))) and (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/DelFollowing",env="prod", zone="sh001"} [10m])or vector(0))) sh001:0 sh004:0

聚合方式五:通过二次sum sum by(zone) ((sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod"} [10m]))or vector(0)) , (sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/DelFollowing",env="prod"} [10m])) or vector(0))) sh001:68098 sh004:66639

A = sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh004"} [10m])) B = sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/DelFollowing",env="prod", zone="sh001"} [10m])) 都有结果,但是label不一样,一个sh001,一个sh004 1、(A or vector(0)) 返回 A的结果sh004和vector(0)的结果空集 2、(B or vector(0)) 返回 B的结果sh001和vector(0)的结果空集 3、(A) + (B)会没有任何结果,因为标签匹配不上 4、(A or vector(0)) + (B or vector(0)) 也没有结果,因为A、B都有结果,直接vector(0)无效,标签匹配不上 5、A or vector(0) + B or vector(0) 会有结果sh001和sh004,因为先运算 vector(0) + B,返回B,之后两个or取并集 6、A or vector(0) + (B or vector(0)) 会有结果sh001和sh004,因为B or vector(0)返回B,B+vector(0)返回B,再or返回两者的并集 7、(A or vector(0)) + B or vector(0) 会有结果,返回B的结果sh001 8、(B or vector(0)) + A or vector(0) 会有结果,返回A的结果sh004 9、(A or vector(0)) + B 会有结果,返回B的结果sh001 10 、(B or vector(0)) + A 会有结果,返回B的结果sh001 7、8、9、10我无法解释,唯一的可能就是(A or vector(0))返回vector(0),但是很明显不是这样的,能帮我解释一下吗

( ( sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh001"} [10m])) ) or vector(0) + ( sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh004"} [10m])) ) or vector(0) ) / ( ( sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh001"} [10m])) ) or vector(0) + ( sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh004"} [10m])) ) or vector(0) )

( ( sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh001"} [10m])) or vector(0) ) + ( sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh004"} [10m])) or vector(0) ) ) / ( ( sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh001"} [10m])) or vector(0) ) + ( sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh004"} [10m])) or vector(0) ) )

( or vector(0)) + sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh004"} [10m])) or vector(0)) / ((sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh001"} [10m]))or vector(0) + sum by (zone) (increase(grpc_server_requests_code_total{app="main.account.relation-service", method=~"/?account.service.relation.v1.Relation/ModifyRelation",env="prod", zone="sh004"} [10m])) ) or vector(0))

正在精进