使用 SQL 计算延迟和分布百分位数
平均值将分布压缩为一个数字。这对于总数和总体趋势很有用,但它可能隐藏事件期间重要的缓慢体验。百分位数回答了一个不同的问题:p95 是大约 95% 的观测值处于或低于该值的值。
查询分布中的几个点
Telemetry 使用 Apache DataFusion SQL。使用 approx_percentile_cont 进行实际百分位估计:
SELECT
route_template,
COUNT(*) AS requests,
approx_percentile_cont(duration_ms, 0.50) AS p50_ms,
approx_percentile_cont(duration_ms, 0.95) AS p95_ms,
approx_percentile_cont(duration_ms, 0.99) AS p99_ms,
MAX(duration_ms) AS maximum_ms
FROM api_request_events
WHERE timestamp_utc >= now() - INTERVAL '24 hours'
GROUP BY route_template
HAVING COUNT(*) >= 100
ORDER BY p95_ms DESC;
在结果中保留请求计数。一个小群体的百分位数是不稳定的,当一个群体只包含少量观察值时,p99 没有意义。近似结果也不应该以人为的小数精度表示。
解释形状,而不仅仅是等级
如果 p50、p95 和 p99 一起上升,整个工作流程可能会发生变化。如果 p50 保持稳定而 p99 增加,则一部分请求正在经历尾部延迟。最大值对于调查很有用,但一个异常值不应定义正常性能。
仅按可以更改操作的维度进行分组:路由模板、依赖项、版本、区域或有界操作名称。原始 URL 和不受限制的查询文本会创建难以比较的高基数组,并且可能会暴露敏感值。
百分位数不是百分比。 p95 延迟 800 毫秒并不意味着 95% 的请求很慢;这意味着大约 95% 的完成率等于或低于该值。将数字与经过审查的目标和明确的单位配对。
使用 API 延迟配方、依赖延迟配方 或 队列等待食谱 作为测试示例。 分布可视化指南 解释了直方图何时比三个百分位点更能说明问题。