你喜欢的 Go 第三方库:一步为系统集成可视化实时运行时统计

大家好 , 我是站长 polarisxu 。
掌握系统运行状态 , 知道系统哪些地方可能存在问题 , 方便进行优化 , 这是一个实际系统必备的 。 裸奔 , 对系统一无所知 , 迟早是要出大事的 。
在 Go 语言中 , 官方标准库提供了方法 , 让我们能够获得内存分配、GC 和 Goroutine 等情况 。 比如内存、GC 等情况 , 可以通过 runtime.MemStats 获取:#MemStats , Goroutine 数量可以通过 runtime.NumGoroutine() 函数获得 。
一般我们我们需要自己解析 MemStats 信息、做展示 , 也可以做图表 。
今天我给大家推荐一个库: , 它是一个在浏览器中实时查看 Go 应用程序运行时统计信息(GC , MemStats 等)的库 。
它能展示的信息如下图:
你喜欢的 Go 第三方库:一步为系统集成可视化实时运行时统计文章插图
再看其中 Heap 的实时动图:
你喜欢的 Go 第三方库:一步为系统集成可视化实时运行时统计文章插图
上面这些通过运行下面这段代码就可以了:
package mainimport ( "math/rand" "net/http" "strconv" "time" "github.com/arl/statsviz")func main() { // Force the GC to work to make the plots "move". go work() // Register statsviz handlers on the default serve mux. statsviz.RegisterDefault() http.ListenAndServe(":8080", nil)}func work() { // Generate some allocations m := map[string][]byte{} for {b := make([]byte, 512+rand.Intn(16*1024))m[strconv.Itoa(len(m)%(10*100))] = bif len(m)%(10*100) == 0 {m = make(map[string][]byte)}time.Sleep(10 * time.Millisecond) }}1、如何使用都 Go1.15.x 了 , 请使用 go module 。
statsviz 的使用很简单 。 假设基于 net/http 使用 。

  • import "github.com/arl/statsviz”
  • 注册 statsviz HTTP handlers
  • 启动程序
  • 打开浏览器访问:http://host:port/debug/statsviz
  • 尽情享受吧~
具体看看实际中怎么集成到项目中 , 根据可能的情况分别介绍 。
基于 net/http如果你的项目没有使用框架 , 直接基于 net/http;或者你的项目并没有提供 HTTP 服务 。 集成 statsviz 可以按照下面的方式 。
1)一个使用 net/http 的 Web 项目
只需要 import statsviz 包后 , 在注册路由的地方加上如下代码:
statsviz.RegisterDefault()这是使用默认的 http.DefaultServeMux , 如果你使用的是自定义 Mux , 则加上如下类似如下代码:
mux := http.NewServeMux()statsviz.Register(mux)其中 , mux 使用你定义好的 。
实际上 , statsviz.RegisterDefault() 内部是这么实现的:
func RegisterDefault() { Register(http.DefaultServeMux)}2)没有提供 HTTP 服务的项目
这时最简单的方式就是使用 statsviz.RegisterDefault(), 同时需要启动一个 HTTP 服务:
go func() {statsviz.RegisterDefault()log.Println(http.ListenAndServe("localhost:8080", nil))}()基于兼容 net/http 的框架因为兼容 net/http 框架 , 因此可以直接将 statsviz 的 Handler 集成进去 。 比如对于 gorilla/mux 库 , 可以这么做:
【你喜欢的 Go 第三方库:一步为系统集成可视化实时运行时统计】r := mux.NewRouter()r.Methods("GET").Path("/debug/statsviz/ws").Name("GET /debug/statsviz/ws").HandlerFunc(statsviz.Ws)r.Methods("GET").PathPrefix("/debug/statsviz/").Name("GET /debug/statsviz/").Handler(statsviz.Index)mux := http.NewServeMux()mux.Handle("/", r)http.ListenAndServe(":8080", mux)


推荐阅读