iT邦幫忙

2026 iThome 鐵人賽

DAY 24
0
Software Development

30 天把舊 ERP 整合成現代微服務平台:架構治理與工程實作雙軌實戰系列 第 24 篇

Day 24|Logs、Metrics、Traces:三種訊號各回答什麼?

  • 分享至 

  • xImage
  •  

收到系統異常的通知時,我會想先知道三件事:發生什麼事、影響有多大,以及卡在哪裡。Logs、Metrics、Traces 各自能回答一部分,把它們串連起來,才比較容易把事情看完整。

本篇名詞小筆記

  • Logs:事件紀錄,保存某個時間點發生的操作、錯誤與相關欄位。
  • Metrics:數值指標,以時間序列呈現流量、錯誤率、延遲與資源使用趨勢。
  • Traces:分散式追蹤,記錄一筆請求跨服務的呼叫路徑與各段耗時。
  • OpenTelemetry:提供遙測資料產生、傳遞與匯出的開放標準及工具集合。
  • SLO:服務等級目標(Service Level Objective),定義服務預期達到的可靠度或效能。

今天要解決的問題

有時候,三種資料都有留存,但是查問題卻還是要分開找。告警上顯示錯誤率上升,但是找不到是哪筆請求;在 Log 上看到了,又不知道它經過哪些服務。其實資料都在,缺的是彼此能對照的方式。

訊號 適合回答
Logs 發生了什麼事件?錯誤內容為何?
Metrics 錯誤是否增加?延遲是否惡化?
Traces 哪一段服務造成整體延遲或失敗?

所以,我會先確認識別碼有沒有串接好,讓同一段流程留下的紀錄能找得到彼此。

架構師視角:以共同識別碼串接三種訊號

https://ithelp.ithome.com.tw/upload/images/20260926/201842301xcEGwADTs.png

圖 Day 24-1:可觀測性三種訊號。

圖中先用 Trace ID 與 Correlation ID 連接 Log 和 Trace,再透過 Dashboard 與 SLO 找到需要查看的時間與條件。我希望收到告警後,能順著這條路找到事件細節。

這兩個 ID,也要先說明各自的用途。Trace ID 用來追蹤技術呼叫鏈;Correlation ID 可以對應一段業務操作,跨越不同 Trace。遇到非同步流程時,尤其要確認後續事件還接得回原本的操作。

因此,事件裡會保留 correlationId,Consumer 處理時再把它和自己的 Trace 關聯起來。Day 17 留下的事件欄位,就在這裡派上用場。

工程師視角:欄位定義與遮罩

實作上,各服務容器都掛著 OpenTelemetry Java agent,由它產生與傳遞 trace context,程式碼不用自己處理。結構化 Log 再把 timestamp、service、environment、level、traceId、spanId、correlationId、event name 與結果定義好,查詢時比較有一致的欄位。

為了避免不同環境的紀錄混在一起,log 裡多了 environment 欄位;correlationId 從請求標頭接進來,格式不對就換成自己產生的,不讓外面的字串直接進 log。之後統計同一種事件時,不用猜大家用了哪些不同描述,所以 event name 也用固定名稱。

Token、密碼、完整個資與 ERP 敏感 payload,都不要寫進 Log。一旦寫下來,資料可能還會進入儲存、備份與其他系統,之後才過濾就太晚了,所以遮罩做在 log 編碼那一層:Bearer token、密碼類的 key=value、身分證字號寫進去前就換成星號。手機號碼的格式和品號、單號重疊,遮了對帳 log 就沒法用,所以 email、手機與單號都刻意不遮。

入口 API 應蒐集 request rate、error rate 與 duration;主機、容器需觀察資源飽和程度;Kafka 與 RabbitMQ 則監控 lag、queue depth 與 DLQ 深度。每類指標都要有明確用途與告警依據——沒有對應處理動作的指標可以收集,但不應設成告警。

策略取捨與限制

取捨 這樣選的理由 何時要重新評估
採樣先用比例,錯誤與高延遲優先保留列為下一步 完整保留成本高,但異常樣本最有價值 採樣導致無法重建問題時
遮罩在產生端處理 寫入後再過濾已經來不及 無
Correlation ID 要貫穿非同步邊界 業務操作的追蹤不應在事件處斷掉 無
只為可處理的指標設告警 無動作的告警會讓人忽略所有告警 無

流量越大,Trace 與 Log 要寫入和保存的資料越多,成本也越高;正常請求的紀錄多半大同小異,所以可以採樣。但罕見的重要問題可能剛好沒被取樣到,錯誤與高延遲請求應該必定保留。只是目前在請求一開始就決定留不留,還看不到結果,所以表格把它列為下一步。

驗證方式與衡量指標

驗證項目 做法 想確認什麼
跨層串聯 選一筆交易,以同一 traceId 查 Gateway、服務與 Adapter 追蹤是否在某一層斷掉?
非同步串聯 追一筆含事件處理的流程 correlationId 是否跨過事件邊界?
遮罩有效 檢查 Log 是否含 Token、密碼或個資 敏感資訊是否確實未寫入?
查閱權限 以不同角色查詢觀測平台 紀錄的存取是否受控?
告警可行動 逐一檢視現有告警 每個告警是否都有對應處理動作?

我會準備一筆測試交易,從 Gateway 走到服務與 Adapter,確認紀錄能用 traceId 串起來,也檢查遮罩與查閱權限。哪一層斷了,就先補那一層的 context 傳遞。

今天先整理到這裡

今天想確認的,是從一個告警出發,能不能找到整段請求與事件細節。下一篇,再把這些訊號接到 Prometheus、Grafana 與 Jaeger,看看畫面和告警怎麼幫助處理問題。

參考資料

  1. OpenTelemetry, OpenTelemetry Signals,查閱日期:2026-10-07。
  2. OpenTelemetry, OpenTelemetry Semantic Conventions,查閱日期:2026-10-07。

上一篇
Day 23|先定 Timeout Budget,再談 Retry:API 韌性設計的順序
下一篇
Day 25|Prometheus、Grafana、Jaeger:從 Dashboard 到可行動告警
系列文
30 天把舊 ERP 整合成現代微服務平台:架構治理與工程實作雙軌實戰 共 25 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言