使用 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 延遲配方、依賴延遲配方 或 佇列等待食譜 作為測試範例。 分佈視覺化指南 解釋了直方圖何時比三個百分位點更能說明問題。