🌐 This page hasn't been translated yet — showing the original Chinese. Translated posts

關聯:從一個尖峰,點到那一行 log

· tech

#observability#grafana#correlation

📑 目錄

整個系列從第一篇的黃金路徑就一直押著一句:metric 看有沒有、trace 看在哪、log 看是什麼,由粗到細。但我一直跳過最關鍵的一步——這三格之間,到底怎麼「跳」過去?Tempo 那篇說「找 trace-id 的活交給 metric 和 log」、採集層那篇說「關聯是採集時種下的」,兩個伏筆都指向這篇。這篇把它收掉:讓黃金路徑不只是一張概念圖,而是事故當下真的能一路點過去的路徑——而它能成立的秘密,反直覺地不在 Grafana,在採集端。

黃金路徑,這次真的能「點」過去

先看它在事故當下長什麼樣。重點是:你不是「開 metric 系統 → 開 trace 系統 → 開 log 系統 → 手動對時間戳」,而是在同一塊玻璃上,三步都是「點」,不是「查」:

黃金路徑:由粗到細,一路「點」過去 ① Metric:有沒有 ↑ exemplar = trace_id 先看到「痛」 ② Trace:在哪一段 紅色那段 = 慢/error 縮到哪個服務、哪段 ③ Log:是什麼 info handling req error NPE at line 42 info retry ok 都帶同一個 trace_id 看到根因那一行 trace_id trace_id 三步都是「點」,不是「查」:看有沒有 → 看在哪 → 看是什麼
看到 p99 尖峰 → 點尖峰上那個 exemplar 小點,直接跳進那條 trace → 在 waterfall 上看到紅色那段 span(慢/error)→ 點它,log 已經用 trace_id 幫你篩好、根因那一行就在眼前。整條路徑由粗到細,一路用 trace_id 點過去——這才是「一塊玻璃」真正的價值:不是把三個東西擺在一起,是把它們串成一條路

靠什麼跳:一條 trace_id 穿過三種訊號

上面那條路能一路點過去,靠的是同一個東西——trace_id 同時活在三種訊號裡。而且它不是查詢時才算出來的,是採集時由同一套 context(OTel / Alloy)種進去的:

同一個 trace_id,穿過三種訊號 採集端種下 ID OTel / Alloy trace_id=abc123 Metric 資料點 p99… exemplar:abc123 Trace trace abc123{ spans } Log 一行 error trace_id=abc123 關聯是採集時種下的 ID,不是查詢時算的 —— Grafana 只是跟著 ID 跳
三個 abc123 是同一個字串,像一條線穿過三種訊號——這就是互跳的全部秘密。exemplar 讓聚合的 metric 留一根線頭(「這個尖峰的其中一個樣本請求,trace_id 是這個」);結構化 log 每行帶 trace_id,於是 tracelog 雙向可跳。而這一切的前提,是這個 ID 在採集端由同一套 context 種進三種訊號——不是三套工具各記各的。三孤島的失敗模式就敗在這:trace 一套 agent、log 一套 shipper,ID 對不齊,黃金路徑當場斷成三段

而 Grafana 這一端做的,少得意外——它只是認出那個 ID、生成一個可點的連結。兩個機制:exemplar,Mimir 的 metric 點附帶 trace_id,Grafana 在圖上畫成可點的小點,一點就帶著 ID 打開 Tempo;data link / derived field,Loki 的 log 面板用一條 regex 把 trace_id=xxx 抽出來、渲染成連去 Tempo 的連結,反過來 Tempo 的 span 也有「看這段的 logs」按鈕,設定成用 trace_id 去 Loki 撈。看清楚:真正的關聯早在採集端就綁好了,Grafana 只是跟著線頭走。

反思

關聯是採集時種下的,不是查詢時算的

這句話,是我現在評估一套觀測時的第一道檢查題。很多團隊會很驕傲地說「我三支柱都上了」——但我只問一個問題:隨便抓一個 metric 尖峰,你能不能兩下點到造成它的那一行 log? 答不出來的,幾乎都是同一個病:metrics 一套 agent、logs 一套 shipper、traces 又另一套,三邊的 ID 對不齊,於是「三支柱」只是三個各自為政的孤島,事故當下還得靠人肉複製時間戳、去三個系統各查一次——一塊玻璃活生生用成三個瀏覽器分頁。所以我把「三種訊號共用同一套 trace context」當成採集層的第一硬需求,比「後端選 Loki 還是別的」重要得多。關聯不是買三個工具就會有的,是你在埋測那一刻,決定讓不讓同一個 ID 流過三種訊號。 這也正是採集層那篇我說「埋測一律走 OTel、綁標準不綁廠商」的真正回報所在——共用 context,就是在這裡兌現。

由粗到細,省的不是資料,是「注意力」

黃金路徑的價值,我一直到帶過幾次事故才想透:它省的不是資料量,是注意力。事故當下人腦的頻寬窄得可怕,而 metric→trace→log 這條由粗到細的收斂,每一步都在縮小範圍,讓你有限的腦力不用花在大海撈針、而是直接落在該看的那一行。這跟我在 K8s 排障講的 get→describe→logs 漏斗、跟告警那篇「叫醒你但不塞原因」是同一種思維——好的排障不是翻得快,是每一步都在替你砍掉不用看的東西。 所以我看一套觀測成不成熟,現在不看它能存多少資料,看一個更狠的指標:從「發現有問題」到「看到那一行根因」,要幾下點擊、幾分鐘? 這個數字,直接就是你的 MTTR。

打通關聯,一塊玻璃才真的是「一條路徑」

第一篇我說「一塊玻璃的價值,是事故當下少一層摩擦」。走到這篇我要把它講到底:沒有關聯,一塊玻璃只是三個剛好開在同一個視窗的分頁。 把 metrics、logs、traces 收進一個 Grafana,只是「擺在一起」;真正把它們串成一條路的,是那個穿過三種訊號的 trace_id。少了它,你還是得在最需要冷靜的時刻,把腦力耗在「切分頁、對時間戳」這種破碎的摩擦上。而這篇也讓整個系列閉環了:看見(三支柱)→ 叫醒(告警)→ 一路點到根因(關聯)→ 行動。這一整套 LGTM,從頭到尾都在回答同一句我押了八篇的話——觀測的終點不是「看到」,是行動;而關聯,就是把「看到」高速接上「行動」的那段變速箱。