互联网技术 / 互联网资讯 · 2024年3月11日 0

Statsviz:Go 程序运行时数据统计的可视化工具改写标题

今天跟大家介绍一款实时可视化 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 程序运行时数据统计的可视化工具 Statsviz

Go 程序运行时数据统计的可视化工具 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 地图。

我们来看一个官网示例,很酷炫

Go 程序运行时数据统计的可视化工具 Statsviz

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

Go 程序运行时数据统计的可视化工具 Statsviz

Go 程序运行时数据统计的可视化工具 Statsviz

Go 程序运行时数据统计的可视化工具 Statsviz

Go 程序运行时数据统计的可视化工具 Statsviz

Go 程序运行时数据统计的可视化工具 Statsviz

Go 程序运行时数据统计的可视化工具 Statsviz