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

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

OpenMagic API

Need more than content? Move into the product flow.

If you are here for model access, pricing, developer docs, or the future API console, the dedicated product path now lives on api.openmagic.ai.

登录免费注册