實時可視化 Go Runtime 指標,這個 Go 庫超讚
前言
小土之前分享過一篇如何監控 Go Runtime 的文章,主要是通過 Grafana,Graphite,Statsd 等組件來採用 UDP 協議採集 metrics 上報到 Grafana 來進行一系列的展示。相對比較繁瑣。今天小土帶來一個 Go 庫 statsviz-https://github.com/arl/statsviz 可以一鍵集成到你的 HTTP 服務中,並且在瀏覽器中可以實時看到服務的 runtime 指標信息。感興趣的同學可以跟着小土一起試一下。開整。
一句話描述
在 Web 瀏覽器中可以實時可視化 Go 程序的runtime
- 運行時指標數據:堆、對象、goroutine、GC 暫停、調度器等。
安裝
go get github.com/arl/statsviz@latest
Example
可以在 HTTP 服務 http.ServeMux[1] 註冊 statsviz
mux := http.NewServeMux()
statsviz.Register(mux)
或者使用 http.DefaultServeMux
註冊:
statsviz.RegisterDefault()
默認情況下 statsviz 的服務路由地址是在 /debug/statsviz/
下。
下面我們來一個實例
package main
import (
"log"
"net/http"
"github.com/arl/statsviz"
)
func main() {
statsviz.RegisterDefault()
log.Println(http.ListenAndServe(":6060", nil))
}
UI 頁面介紹
- 服務啓動成功,我們可以訪問 http://localhost:6060/debug/statsviz/,看到如下頁面,可以看出如下的圖表信息
-
堆棧信息
-
堆棧中存活的對象和字節數
-
mspan 和 mcache 信息
-
不同大小級別對象的信息
-
STW 的延遲
-
在 runnable 狀態中的 goroutine 花費的時間
- 頁面頂部的控件作用於所有的圖表:
-
毛刷的圖標是顯示 / 隱藏代表 GC 的垂直線。
-
時間範圍選擇器是定義了可視化的時間跨度。有 1、5、10min 的區間。
-
播放 / 暫停的圖標可以停止和刷新圖表。
-
在每個圖的頂部,你會發現 2 個圖標:
-
相機圖標可以將繪圖下載爲 PNG 圖像。
-
信息圖標會顯示有關當前繪圖的信息。
statsviz 是如何運作的呢?
那麼你想知道 statsviz 是怎麼工作的呢?讓我們來一探究竟。
Statsviz 主要有 2 個 HTTP 接口服務:
-
第一個 (
/debug/statsviz
) 是提供帶有 statsviz 用戶界面的網頁,最初顯示是一頁空白的圖。 -
第二個 HTTP 處理程序 (
/debug/statsviz/ws
) 是監聽的 WebSocket 連接,該連接會在 statsviz 網頁加載到您的瀏覽器後立即啓動。
程序會每隔一秒將所有運行時 / 指標 [2] 數據指標信息發送到網頁。數據存儲在瀏覽器中的循環緩衝區中,該緩衝區只會保存預先設置的數量的數據信息。
statsviz 如何集成到各不同的 web 框架中呢?
假如你也想接入 statsviz,用的不是標準庫,也可以看下 statsviz 在各個 web 框架和標準庫中編寫的例子,https://github.com/arl/statsviz/blob/v0.5.1/_example/README.md。如沒有你用的框架的實例,你也可以按需編寫。這兒我們簡單看一下常用 web 框架 gin 的例子
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/arl/statsviz"
example "github.com/arl/statsviz/_example"
)
func main() {
// Force the GC to work to make the plots "move".
go example.Work()
fmt.Println("Point your browser to http://localhost:8085/debug/statsviz/\n\n")
router := gin.New()
router.GET("/debug/statsviz/*filepath", func(context *gin.Context) {
if context.Param("filepath") == "/ws" {
statsviz.Ws(context.Writer, context.Request)
return
}
statsviz.IndexAtRoot("/debug/statsviz").ServeHTTP(context.Writer, context.Request)
})
router.Run(":8085")
}
例子中可以看出,主要實現了 / debug/statsviz / 路由下的 GET 請求,並實現了 websocket 的監聽處理,另外後臺強制開啓了一個 GC 的工作任務。
參考資料
[1]
http.ServeMux: https://pkg.go.dev/net/http?tab=doc#ServeMux
[2]
運行時 / 指標: https://pkg.go.dev/runtime/metrics
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/rDSKItZ8hvgjvpp4f4VzCQ