API Latency 儀表板
以 Trace ID 串起 API、外部呼叫與 DB 耗時,用 OpenSearch Dashboards 找出慢 API 與重複呼叫
透過 Filebeat 收集帶有同一個 Trace ID 的 Log,送進 OpenSearch,並以 OpenSearch Dashboards 的趨勢圖呈現各 API、外部 API 與 DB 的耗時與呼叫次數。團隊可以直接看到哪些 API 偏慢、哪些 API 呼叫最頻繁,以及哪些請求重複呼叫同一支外部 API 或出現 N+1 DB query,不必再逐筆翻 Log 排查。
- 角色
- 需求分析、架構設計、開發、測試
- 使用技術
- JavaSpring BootSLF4J MDCFilebeatOpenSearchOpenSearch Dashboards
要解決的問題
系統變慢或出現異常時,只能憑印象猜是哪支 API,再逐筆翻 Log 確認,排查很花時間。
具體來說有三件事看不到:哪些 API 回應偏慢、哪些 API 呼叫次數最多,以及哪些 API 在一次請求裡重複呼叫同一支外部 API,或出現 N+1 DB query。
這個儀表板把每次請求經過的各個節點(API、外部呼叫、DB)的耗時都記錄下來,並以同一個 Trace ID 串起來,讓問題從「猜」變成「看得到」。
運作流程
- 01
請求進入
每個請求在入口產生 Trace ID,放進 MDC,讓同一個請求的所有 Log 都帶有它。
- 02
記錄各節點耗時
API 本身、外部 API 呼叫、DB 呼叫各自記錄耗時與目標,輸出成結構化 Log。
- 03
Filebeat 收集
Filebeat 讀取 Log 檔案,送進 OpenSearch。
- 04
建立索引與欄位
Trace ID、類型、API 名稱、呼叫目標與耗時都成為可查詢、可聚合的欄位。
- 05
儀表板呈現
OpenSearch Dashboards 以趨勢圖與統計圖呈現耗時、呼叫次數與重複呼叫。
- 06
往下追蹤
從異常的 API 用 Trace ID 查出該次請求的每一個外部呼叫與 SQL。
三個要回答的問題
每個問題對應一組圖表,用趨勢圖觀察變化,也方便比對上線前後。
哪些 API 回應偏慢
依 API 統計耗時(建議看 p95 而不是平均值),以趨勢圖呈現。耗時突然上升,可以對照上線時間找原因。
哪些 API 呼叫最多
依時間範圍統計各 API 的呼叫次數,找出流量最大的 API,作為優化優先順序的參考。
哪些 API 重複呼叫外部 API 或有 N+1
以 Trace ID 為單位,統計同一個外部 API 或同一種 SQL 在一次請求內出現的次數,次數異常多的就是需要檢查的對象。
Log 範例
同一個 Trace ID 下,一次請求會留下 API、外部呼叫與多筆 DB 呼叫的紀錄。下面的例子中,同一種 SQL 重複出現,就是典型的 N+1。
{"traceId":"a1b2c3d4","type":"API","api":"GET /orders/{id}","durationMs":1280}
{"traceId":"a1b2c3d4","type":"EXTERNAL","target":"POST payment-service/query","durationMs":310}
{"traceId":"a1b2c3d4","type":"EXTERNAL","target":"POST payment-service/query","durationMs":295}
{"traceId":"a1b2c3d4","type":"EXTERNAL","target":"POST payment-service/query","durationMs":302}
{"traceId":"a1b2c3d4","type":"DB","sqlId":"selectOrderItemByOrderId","durationMs":12}
{"traceId":"a1b2c3d4","type":"DB","sqlId":"selectOrderItemByOrderId","durationMs":11}
{"traceId":"a1b2c3d4","type":"DB","sqlId":"selectOrderItemByOrderId","durationMs":13}示意用的 Log 格式,API 名稱、SQL 名稱與數值皆為假資料。
成果
- >慢 API 與高流量 API 可以直接在儀表板看到排名與趨勢,不再靠印象判斷。
- >重複呼叫外部 API 與 N+1 DB query 可以被統計出來,不必逐筆翻 Log。
- >以 Trace ID 從單一請求往下追到每個外部呼叫與 SQL,加速異常排查。