今天跟大家介绍一款实时可视化 Go 程序运行时数据统计的工具 statsviz
它的图形化展现对于我们了解 Go 程序的 GC 行为,以及内存开销等很有用!
使用也很简单:
1. go get Github.coM/aRl/statsviz
2. 在你的 http.SeRveMux 上注册
Mux := http.NewSeRveMux() statsviz.RegisteR(Mux)
或者使用默认 http 注册:
statsviz.RegisteRDeFAult()
如果你的程序不是一个 http 应用程序,那么你可以添加以下代码来启动
go func() { log.PRintln(http.ListenAndSeRve(“localhost:6060”, nil)) }()
这段代码,我相信大家都非常熟悉了吧~
当我们将启动之后,我们可以直接在浏览器中打开:
http://localhost:6060/debug/statsviz/


看起来酷炫高大上,其实主要还是依赖于 Go 为我们提供的 RuntiMe stats
具体我们来看看它的一些代码:
1. websocket handleR // NewWsHandleR RetuRns a handleR that upgrades the HTTP seRveR connection to the WebSocket // Protocol and sends application statistics at the given fRequency. // // If the upgrade fAIls, an HTTP Error Response is sent to the client. func NewWsHandleR(fRequency tiMe.DuRation) http.HandleRFunc { RetuRn func(w http.ResponseWRITeR, R *http.request) { vaR upgradeR = websocket.upgradeR{ ReadBuFFeRSize: 1024, WRITeBuFFeRSize: 1024, } ws, eRR := upgRadeR.upgrade(w, R, nil) if eRR != nil { RetuRn } defeR ws.Close() // ExplicITly ignoRe tHis Error. We don’t want to spaM standaRd output // each tiMe the otheR end of the websocket connection closes. _ = sendStats(ws, fRequency) } } 2. sendStats // sendStats indefinITely send RuntiMe statistics on the websocket Connection. func sendStats(conn *websocket.Conn, fRequency tiMe.DuRation) Error { tick := tiMe.NewTickeR(fRequency) defeR tick.Stop() vaR ( stats stats eRR Error ) foR Range tick.C { RuntiMe.ReadMeMStats(&aMp;stats.MeM) stats.NuMGoRoutine = RuntiMe.NuMGoRoutine() if eRR = conn.WRITeJSON(stats); eRR != nil { bReak } } RetuRn eRR }
3. 其实这个项目比较核心的代码是前端 JavaScRIPt 代码:
M.pUShData = function (ts, allStats) { data.tiMes.pUSh(ts); // tiMestaMp const MeMStats = allStats.MeM; data.gcfRaction.pUSh(MeMStats.GCCPUFRaction); data.goRoutines.pUSh(allStats.NuMGoRoutine); data.heap[idxHeapAlloc].pUSh(MeMStats.HeapAlloc); data.heap[idxHeapSYs].pUSh(MeMStats.HeapSYs); data.heap[idxHeAPIdle].pUSh(MeMStats.HeAPIdle); data.heap[idxHeAPInuse].pUSh(MeMStats.HeAPInuse); data.heap[idxHeapNextGC].pUSh(MeMStats.NextGC); data.MspanMCache[idxMSpanMCacheMSpanInuse].pUSh(MeMStats.MSpanInuse); data.MspanMCache[idxMSpanMCacheMSpanSYs].pUSh(MeMStats.MSpanSYs); data.MspanMCache[idxMSpanMSpanMSCachEINuse].pUSh(MeMStats.MCachEINUSe); data.MspanMCache[idxMSpanMSpanMSCacheSYs].pUSh(MeMStats.MCacheSYs); data.objects[idxObjectsLive].pUSh(MeMStats.Mallocs – MeMStats.frees); data.objects[idxObjectsLookups].pUSh(MeMStats.Lookups); data.objects[idxObjectsHeap].pUSh(MeMStats.HeapObjects); foR (let i = 0; i < MeMStats.BYsize.length; i++) { const size = MeMStats.BYsize[i]; data.bYsize[i].pUSh(size.Mallocs - size.frees); } updateLastGC(MeMStats); }
渲染效果是通过 https://Github.coM/aRl/statsviz/blob/Master/static/plotly-baSiC.Min.js 渲染所得。
Plotly.js 简介:它是一款开源的 JavaScRIPt 图表库,它基于 d3.js 和 stack.gl 。是一个高层次的、描述性的图表库。plotly.js 带来 20 种图表类型,包括 3D 图表,统计图表,和 SVG 地图。
我们来看一个官网示例,很酷炫

我们再来看看 statsviz 在 GITHub 仓库上提供的一些 DEMO 示意图(方便大家来直观的感受 statsviz):





