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

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

下面介绍一款用于实时可视化 Go 程序运行时数据统计的工具。它的图形化展示对了解 Go 程序的 GC 行为、内存开销等方面非常有帮助。

  1. 使用简单:go get github.com/…/statsviz
  2. 在你的 HTTP 路由中注册

示例: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 程序运行时数据的可视化统计工具

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

外观看起来很炫,其实核心还是基于 Go 提供的运行时统计数据。

下面简要查看其中的一些实现要点:

  1. websocket 处理器:NewWsHandler 返回一个处理函数,会将 HTTP 连接升级为 WebSocket,并按设定频率发送应用统计信息;若升级失败,则返回 HTTP 错误响应。
  2. sendStats:负责在 WebSocket 上持续发送运行时统计信息,按 time.Duration 的频率进行轮询,遇到写错则结束。

3. 这一项目的核心部分其实是前端的 JavaScript 代码:

前端数据更新逻辑(示意)为:

M.pUShData = function (ts, allStats) {
data.tiMes.pUSh(ts); // 时间戳
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);
}

渲染效果基于 plotly-basic 的实现渲染。

Plotly.js 介绍:它是一款开源的 JavaScript 图表库,基于 d3.js 和 WebGL,属于高层次、描述性图表库,提供多种类型的图表,包括 3D 图、统计图和 SVG 地图等。

下面是一个官网示例,效果很炫:

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

此外,统计工具在 GitHub 仓库上还提供了若干示意图,便于直观感受 Statsviz 的呈现:

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

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

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

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

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

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