如何用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
之前代码的问题说明
filter_ratio_by使用时机错误:需要先完成基础的分组聚合,再用该函数计算比例,否则无法正确关联总请求和错误请求的维度。- 聚合逻辑不清晰:未明确指定聚合字段,
val()的引用会导致结果混乱。 - 时间窗口顺序错误:应先计算每个时间点的错误率,再对滑动窗口内的结果做聚合,否则会偏离预期统计逻辑。
内容的提问来源于stack exchange,提问作者Fuyang Liu
相关产品推荐
相关产品推荐

