You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用MQL基于OpenTelemetry导出的累积gRPC时长指标绘制错误率

计算gRPC请求错误率的正确MQL写法

我通过opentelemetry-operations-go导出了workload.googleapis.com/rpc.server.duration这个CUMULATIVE类型的指标,已经能通过MQL绘制请求速率,但尝试计算非OK状态请求的占比(错误率)时,写的代码结果不符合预期,请问该怎么修正?

之前的错误代码:

fetch generic_task
| metric 'workload.googleapis.com/rpc.server.duration'
| count_from
| rate
| filter_ratio_by [metric.rpc_service, resource.location], metric.rpc_grpc_code != 'OK'
| group_by sliding(5m), sum(val())
| condition val() > .05 '10^2.%'

正确写法(两种可选)

写法一:分组聚合总请求与错误请求

这种方式更直观,先分别统计每个维度下的总请求数和错误请求数,再计算占比:

fetch generic_task
| metric 'workload.googleapis.com/rpc.server.duration'
| count_from  # 从CUMULATIVE指标中提取请求计数
| rate        # 转换为每秒请求速率
# 按服务、地域分组,同时聚合总请求数和错误请求数
| group_by [metric.rpc_service, resource.location],
    [total_requests: sum(value_duration_count_from),
     error_requests: sum(value_duration_count_from, metric.rpc_grpc_code != 'OK')]
# 计算错误率:错误请求数/总请求数
| add [error_ratio: error_requests / total_requests]
# 对5分钟滑动窗口内的错误率求和(需求不同也可改用取平均)
| group_by sliding(5m), sum(error_ratio)
# 设置阈值告警,超过5%时显示百分比格式
| condition val() > 0.05 '10^2.%'
# 按1分钟粒度输出结果
| every 1m

写法二:使用filter_ratio_by简化计算

如果想用filter_ratio_by,需要确保先完成基础的分组聚合,再计算比例:

fetch generic_task
| metric 'workload.googleapis.com/rpc.server.duration'
| count_from
| rate
# 先按维度分组统计总请求数
| group_by [metric.rpc_service, resource.location],
    [total_requests: sum(value_duration_count_from)]
# 基于分组后的结果,计算非OK请求的占比
| filter_ratio_by [metric.rpc_service, resource.location], metric.rpc_grpc_code != 'OK'
| group_by sliding(5m), sum(val())
| condition val() > 0.05 '10^2.%'
| every 1m

之前代码的问题说明

  1. filter_ratio_by使用时机错误:需要先完成基础的分组聚合,再用该函数计算比例,否则无法正确关联总请求和错误请求的维度。
  2. 聚合逻辑不清晰:未明确指定聚合字段,val()的引用会导致结果混乱。
  3. 时间窗口顺序错误:应先计算每个时间点的错误率,再对滑动窗口内的结果做聚合,否则会偏离预期统计逻辑。

内容的提问来源于stack exchange,提问作者Fuyang Liu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:50:23