昨天我們已經入門了 Grafana Tempo,學會了如何將應用程式的追蹤數據發送到 Tempo 並在 Grafana 中進行視覺化。我們現在可以看到一個請求的完整生命週期,但如果想深入了解某個特定環節 (Span) 到底發生了什麼事,我們仍然需要日誌提供更詳細的上下文。
今天,我們將打通任督二脈,實現 Grafana 可觀測性堆疊 (Loki, Grafana, Tempo) 的核心價值:在追蹤和日誌之間建立無縫連結。這將徹底改變我們排查問題的體驗。
這個功能讓我們在 Grafana 的 Explore 頁面檢視 Tempo 追蹤數據時,可以直接從任何一個 Span 跳轉到 Loki 中相關的日誌。
關鍵在於設定 Grafana 的 Tempo 資料來源,告訴它如何找到對應的 Loki 日誌。
進入 Grafana 設定:
Data Sources
。Tempo
資料來源。新增 Trace to logs 設定:
Trace to logs
區塊並點擊 Add
。Loki
資料來源。job
, namespace
, pod
, container
等,這取決於你的日誌和追蹤是如何標記的。
job
, service.name
。儲存設定:點擊 Save & test
。
(圖片來源: Grafana 官方文件)
設定完成後,回到 Explore 頁面查看一個追蹤。點擊任何一個 Span,你都會在右側面板看到一個藍色的 Logs
按鈕。點擊它,Grafana 就會自動開啟一個分割視窗,並執行一個 Loki 查詢,篩選出與這個 Span 在同一時間、具有相同標籤 (如 job
, pod
) 的日誌!
反過來,當我們在 Loki 中查看日誌時,如果日誌中包含了 TraceID
,我們也希望能一鍵跳轉到 Tempo 中對應的完整追蹤鏈路。
這個設定是在 Loki 的資料來源中完成的。
進入 Grafana 設定:
Data Sources
。Loki
資料來源。新增 Derived fields 設定:
Derived fields
區塊並點擊 Add
。TraceID
。TraceID
。如果你的日誌是 JSON 格式且有一個 trace_id
欄位,可以直接使用 "trace_id":"(.*?)"
。如果是 Key-Value 格式,可能是 trace_id=([a-f0-9]{32})
。${__data.fields.TraceID}
即可,但更重要的是設定 Internal link
。Internal Link
切換按鈕。
Tempo
資料來源。${__value.raw}
,這會將提取出的 TraceID 作為查詢內容。儲存設定:點擊 Save & test
。
設定完成後,當你在 Loki 中查詢到的日誌行包含 TraceID
時,Grafana 會自動辨識它,並在日誌旁邊顯示一個藍色的按鈕。點擊它,你就會立刻跳轉到 Tempo,看到這個 TraceID
對應的完整分散式追蹤圖!
今天我們打通了 Loki 和 Tempo 之間的連結,實現了日誌與追蹤的雙向無縫跳轉。這個功能是 Grafana 可觀測性平台的核心優勢,它將日誌的「深度」與追蹤的「廣度」完美結合,讓我們在面對複雜問題時,能夠以前所未有的效率進行定位和分析。熟練運用這個功能,將使你的故障排除能力提升一個檔次。