Golang Agent 可觀測性的全面升級與新特性介紹

阿里云云原生發表於2024-10-27

作者:張海彬(古琦)

背景

自 2024 年 6 月 26 日,ARMS 釋出了針對 Golang 應用的可觀測性監控功能以來,阿里雲 ARMS 團隊與程式語言與編譯器團隊一直致力於不斷最佳化和提升該系統的各項功能,旨在為開發者提供更加全面和深入的應用效能監控體驗。

在這段時間內,ARMS 推出了多項關鍵功能,包括:

  • 全鏈路的追蹤: 支援前端、閘道器、後端服務的全鏈路追蹤,實現端到端的全鏈路打通。
  • CPU Profiling: 透過提供詳細的 CPU 使用情況分析,幫助開發者識別效能瓶頸,最佳化程式碼執行效率。
  • 記憶體 Profiling: Golang Agent 引入記憶體使用分析工具,幫助監測記憶體分配和洩漏情況,提高應用的記憶體管理能力,確保服務的穩定性。
  • 本地錯慢全採: 新增的錯慢全採功能使得系統能夠捕捉到應用中的錯誤和延遲事件,從而幫助團隊快速診斷問題,提升使用者體驗。
  • 新增外掛: 為擴充套件監控能力,Golang Agent 新增多個外掛,支援不同場景和需求,使用者可以靈活組合使用,滿足個性化監控需求。
  • 日誌 Trace 關聯: 透過將日誌與執行路徑關聯,提升了問題追蹤的效率,開發者能夠快速定位故障根源,從而減少故障恢復時間。
  • 動態開關: 為了更好地滿足不同環境和使用場景的需求,Golang Agent 實現了動態開關功能,允許使用者靈活控制監控開啟和關閉,提高系統的靈活性和可管理性。
  • 效能提升: 效能上相比 1.0.0 提升了 35%+ 以上,極大的降低了資源的消耗。
  • Windows: 支援 Windows 環境編譯、執行,與 Linux、Mac 上都有相同的體驗。

透過這一系列的功能升級,ARMS 希望能夠幫助開發者更好地理解和最佳化他們的 Golang 應用,從而提升整體服務質量和使用者滿意度。未來,ARMS 將繼續關注使用者反饋,持續改進和擴充套件監控功能,為 Golang 應用的可觀測性提供更強有力的支援。接下來我將逐個介紹一下 Golang Agent 的新增功能。

全鏈路追蹤

為了實現前端 + 閘道器 + 後端服務的全鏈路追蹤,Golang Agent 支援了常見的 Trace 透傳協議如 w3c、b3、jaeger、EagleEye,實現多個不同型別的語言的應用之間 Trace 透傳,Golang 服務內部支援 Span Context 的透傳,無需要手動傳遞 Context,即可實現服務內部鏈路打通,同時還支援跟 OpenTracing SDK、OTel SDK 相容,針對自定義的 Span 同樣可以做到傳遞。

持續剖析

pprof 是 Go 語言內建的效能分析工具,允許開發者分析程式的 CPU 和記憶體使用情況。透過引入 net/http/pprof 包,開發者可以在 HTTP 伺服器中開啟效能分析功能,從而實時獲取程式的執行狀態、堆疊資訊和記憶體分配情況等。

但是手動的在程式碼裡面新增 pprof 的埠,獲取對應的應用執行情況需要請求這個應用,同時需要有圖表展示,使用比較非常麻煩,同時長時間開啟 pprof 可能會有一定的效能開銷,因此 Agent 在功能上支援隨開隨關,可以透過開關動態控制這個採集過程,還支援了 pprof 資料的線上檢視和對比。

CPU Profiling

透過開啟持續剖析的能力,就可以在應用診斷上檢視到對應時間段的 CPU Profiling 資料,同時可以支援 Profiling 資料的對比,透過 CPU Profiling 的檢視可以非常方便找出服務的效能瓶頸。

記憶體 Profiling

除了 CPU Profiling 外,記憶體的 Profiling 同樣重要,對於分析記憶體的異常分配、記憶體洩漏起到關鍵作用,透過開關開啟記憶體熱點後,在效能分析型別下可以看到應用的記憶體分配大小、記憶體分配的次數。

本地錯慢全採

由於取樣率的限制,並非每條呼叫鏈都能被採集和上報,這在遇到問題時常常導致無法追蹤到應用的呼叫鏈路。為了解決這一問題,除了調整取樣率外,在 Agent 中針對錯誤和處理緩慢的請求實施全取樣策略。這一措施確保所有發生的錯誤和緩慢請求都能被及時捕捉到,從而為後續問題的分析提供有效依據。

同時,為了最佳化效能,對如 Redis 等關鍵服務的呼叫進行壓縮處理,以避免過多的 Span 導致 Trace 鏈路變得過於冗長。這一措施不僅減少了上報的資料量,還提升了系統整體的追蹤效率。透過這些改進希望能夠更準確地定位和分析應用中的問題,為開發團隊提供更可靠的支援。

可以看到最佳化前的 Span 展示如下所示(這裡對 Redis 進行了迴圈 10 次的 get、set 請求):

開啟錯慢全採後:

Span 減少非常多,同時對於錯誤和慢的 Span 會全部上報,這樣既保證了問題查詢,又能進行資料壓縮降低成本。

新增外掛

從 1.1.0 版本的 20 款外掛,目前 Golang Agent 的 1.3.0 版本支援了 38 款外掛,新增了很多常用的 SDK 支援,如:

  • 訊息:Kafka
  • RPC:hertz、thrift、iris、fiber、kratos
  • SQL/NoSQL:elasticsearch、redisv8、redisgo(https://github.com/gomodule/redigo
  • 日誌框架:logrus、zap、zerolog,以及 golang 的 log、slog

對於 OpenTracing Go SDK 也做了支援,透過 OpenTracing SDK 的建立 Span、Span End 等操作都可以無需修改即可在 Trace 鏈路進行繫結。

針對函式計算 FCGo 的 SDK(https://github.com/aliyun/fc-runtime-go-sdk),有在函式計算下部署 Golang 應用的場景,針對 FC Event 的接收和處理的監控,使用 Golang Agent 編譯對應的 FC Go 程式,在 FC 執行接收流量後可以在 ARMS 控制檯檢視到應用對應的監控情況。

更多的外掛相關的支援和對應的版本,可以檢視。

日誌 Trace 關聯

透過錯慢全採的能力完善了 Trace 取樣導致的 Span 被丟棄的問題,為了更好的定位到問題的原因,將 TraceId、SpanId 列印到對應的呼叫日誌中,在日誌外掛支援方面支援了 logrus、zap、go 自身 log、slog 以及 zerolog 等日誌框架。

動態開關

針對 Agent 提供的非常多的功能和外掛,為了能實現功能的按需開啟,在應用配置上增加了非常多動態開關能力:

1)針對每個外掛,Agent 提供了外掛的動態開關,預設情況下開啟,如不需要採集某些 SDK 的資料,可以動態關閉。

2)日誌關聯配置,可以將 TraceId、SpanId 關聯到對應的日誌上,並在 ARMS 控制檯實現日誌 Trace 關聯,這裡可以配置對應的日誌採集的 Project、LogStore 等。

3)持續剖析,可以配置 CPU Profiling、記憶體 Profiling 的動態開關。

4)資料庫配置,可以配置是否展示 sql 語句的請求引數、sql 語句的長度配置、sql 超時配置等。

5)介面呼叫配置,設定介面的超時時間、對哪些介面、狀態碼進行過濾。

Windows

之前的版本在 Linux、Mac 上進行編譯執行,在新的 1.3.0 版本中增加了對 Windows 的編譯和執行的支援。

RoadMap

  1. 程式碼熱點,透過持續剖析技術定時採集請求執行緒堆疊快照,真實還原始碼執行的第一現場。

  2. 自定義擴充套件,方便快速定製開發。

  3. Golang 的記憶體洩漏、goroutine 洩漏等異常事件的檢測

....

同時基於 OpenTelemetry 的協議的 Golang Agent 已經開源,目前已經發布到0.2.0 版本,支援了超過 15+ 的外掛。

[1] 《全鏈路追蹤 & 效能監控,GO 應用可觀測全面升級

[2] 應用對應的監控情況

https://help.aliyun.com/zh/arms/application-monitoring/user-guide/use-the-arms-golang-probe-in-function-compute-fc-environment?spm=a2c4g.11186623.0.0.6b821af5fydalG

[3] 更多的外掛相關的支援和對應的版本

https://help.aliyun.com/zh/arms/application-monitoring/developer-reference/go-components-and-frameworks-supported-by-arms-application-monitoring?spm=5176.arms.console-base_help.dexternal.4c0df16735iKF3

[4] Golang Agent 已經開源

https://github.com/alibaba/opentelemetry-go-auto-instrumentation

點選此處立即開通 ARMS - 應用監控,享受每月 50GB 免費額度!加入釘釘群(群號:35568145)獲得線上技術支援。

相關文章