自架 Grafana Tempo (1) 介紹

外行人使用 Grafana Tempo 在本機建置APM服務。

起因

其實原因很簡單,就只是想玩玩看如何建置APM服務,看看那精美的圖表,「嘗試」看自己的服務哪邊可以再優化(我這菜鳥能看得出來和成功改善就要偷笑了),另一方面其實是想看有沒有辦法取代 CoreProfiler。因為這工具算是比較簡易、好裝好用,但是只能存在記憶體裡,會為了節省記憶體使用量而減少紀錄留存的筆數,變成看不到以前的紀錄,也沒辦法統計某時段內服務的效能等問題。原本是想用 Elastic APM,後來想到之前裝過 Elasticsearch 時覺得有點麻煩,不想再試了,所以 Google 搜一搜就看到了這個 - Grafana Tempo。

這裡面的知識量很多,我只能提供目前所知道的粗淺內容,每一項服務/工具的水都很深,短時間內無法參透,如果有什麼問題歡迎隨時糾正。

用途

用來查詢一個服務的執行時間,以及每個執行步驟的執行時間、呼叫了哪個API,來找出效能瓶頸。

架構

圖1:架構。資料來源:https://grafana.com/docs/tempo/latest/getting-started/

功能分別是:

遙測 -> pipeline (資料處理) -> 服務後端 -> 視覺化

OpenTelemetry

應用程式端的遙測工具,專門用來蒐集應用程式的各項數據,例如 logs, metrics 和 traces,讓服務可以被觀測。你沒聽錯,這個工具提供這三項數據,簡單省事,但是格式需要符合它的規範。蒐集完後會透過OTLP協議發送到目的地,裡面有提供 gRPC 或 HTTP 的方式傳送。

.Net 有套件支援,還可以自動遙測 WebApi, SqlClient, HttpClient 和 Redis,意思是這些不用自己埋點遙測。埋點時使用 System.Diagnostics 裡面的 Activity,這裡面內容很多,good luck。

Grafana Agent

類似中轉站,可以緩衝接收到資料、過濾不要記錄的資料等各種資料處理後,再轉送到APM的伺服器。它有支援多個資料來源,例如 Jaeger, Kafka, OpenCensus, OTLP 和 Zipkin。當然也是可以不經過 pipeline 處理,直接送到 Tempo,但是資料量大或服務多的時候還是建議要使用。

其他選擇:

選擇原因:最初 OpenTelemetry Collector 裝了之後不知道為什麼一直收不到資料,懶得除錯就換了 Grafana Agent。結果發現換了也不行,除錯後發現設定有誤,現在看來用 OpenTelemetry Collector 也是沒問題。

Grafana Tempo

Grafana 旗下的一款分散式 tracing 後端工具,主要負責搜尋、儲存資料,內建 TempoDB。這裡面的設定比較複雜,如果以嘗試的角度來用,先以範例的設定檔來配置就好。目前只知道它的資料儲存會先在 wal 建立一份,到一定大小或時間後會搬到 wal/data 裡,同時會寫一份到指定路徑中儲存。裡面的資料到一定的時間後會被壓縮,以節省空間。

Grafana

視覺化工具,設定資料來源後就可以搜尋資料和建立報表。需要學習怎麼建立報表和搜尋的語法,內容也是很多,簡單用的話可以先不學語法和建報表,用裡面搜尋後的結果報表就足夠了,但有些功能還是 beta 版。內建的報表像是各服務的關聯圖(包含流量、時間)、指定時間範圍內的平均回應時間,當然還有最重要的服務追蹤。

待學技能

看了這麼多,應該會知道裡面需要學什麼,簡直像掉進了無底洞一樣,快逃啊…

  • OpenTelemetry
  • System.Diagnostics 埋點
  • Tempo 資料儲存的方式
  • Grafana 查詢語法
  • Grafana 製作報表
  • Agent, Tempo, Grafana 的設定

懶得看我的文章

那就直接去看我 GitHub 的 Repository 吧:zamhsu/GrafanaTempo

相關資料