PromQL 高级查询深度实践
PromQL (Prometheus Query Language) 是Prometheus的查询语言,提供了强大的时间序列数据查询、聚合和计算能力。掌握PromQL的高级用法是有效利用Prometheus监控数据的关键。
🎯 PromQL基础语法
选择器和匹配器
前面的 http_requests_total 是指标名
# 精确匹配,等价于 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_开头的指标# 范围向量 - 最近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操作符详解
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的节点📊 聚合操作和函数
聚合操作符
# 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) # 按服务分组的标准差# 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时间序列函数
# 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]) # 内存使用变化趋势# 时间相关函数
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持续高占用数学和统计函数
# 数学函数
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范围内# 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小时后磁盘空间不足的主机🔍 复杂查询模式
多指标关联查询
# 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# 子查询语法: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])条件和逻辑查询
# 简单条件过滤
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使用率# 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)
)📈 性能优化查询
窗口函数优化
# 短窗口 - 实时性好,但噪声多
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倍抓取间隔# 低效:先聚合再计算比率
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])
)
)资源使用优化查询
常用性能监控查询模式
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 才会进行加法,否则丢弃这条标签 | |
| or | A or B | SELECT * FROM A<br>UNION<br>SELECT * FROM B WHERE key NOT IN (SELECT key FROM A) | - or 运算返回两边的并集,但不会相加。- 对相同 labelset 的 time series,返回左边(A)那条; - 对只在右边存在的,保留右边。 |
| and | A and B |
常见问题
数据丢失
sum(rate(http_requests_total[5m])) by (method) + sum(rate(http_requests_total[5m])) by (method) :如果第一部分数据有两个method维度,第二个数据有一个维度,那么会丢失(保留method完全匹配的维度数据)
📋 PromQL面试重点
基础语法类
PromQL的基本数据类型有哪些?
- Instant Vector (瞬时向量)
- Range Vector (范围向量)
- Scalar (标量)
- String (字符串)
选择器的匹配模式有哪些?
- 精确匹配 (=)
- 正则匹配 (=~)
- 负匹配 (!=)
- 正则负匹配 (!~)
时间偏移和绝对时间查询如何使用?
- offset关键字的用法
- @ 操作符的绝对时间查询
- 组合使用的场景
函数应用类
rate()和irate()函数的区别?
- rate(): 时间段平均速率
- irate(): 瞬时速率(基于最后两个点)
- 适用场景和选择原则
聚合操作符的匹配机制?
- by和without的区别
- group_left和group_right的使用
- 向量匹配的原则
如何处理Histogram数据?
- histogram_quantile()函数使用
- bucket边界的设计
- 分位数计算原理
高级查询类
子查询的使用场景和语法?
- 嵌套时间序列查询
- 性能考虑和优化
- 实际应用案例
如何优化复杂的PromQL查询?
- 查询执行顺序优化
- 聚合层次调整
- 时间窗口选择策略
业务指标的计算模式?
- SLI/SLO指标构建
- 错误率和延迟计算
- 业务漏斗分析
🔗 相关内容
- Prometheus架构 - 理解数据模型和存储机制
- 指标收集 - 指标设计和收集策略
- 告警规则 - 基于PromQL的告警配置
- 性能优化 - 查询性能优化技巧
掌握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))
