Go第三方库之怎么一步为系统集成可视化实时运行时统计
这篇文章主要讲解了"Go第三方库之怎么一步为系统集成可视化实时运行时统计",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Go第三方库之怎么一步为系统集成可视化实时运行时统计"吧!
看其中 Heap 的实时动图:
上面这些通过运行下面这段代码就可以了:
package main import ( "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))] = b if 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 库,可以这么做:
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)
这里主要是 statsviz.Ws 和 statsviz.Index,因为 gorilla/mux 库兼容 net/http,所以可以这么做。
不兼容 net/http 的框架
比如集成进 Gin 框架。做法就是和"没有提供 HTTP 服务的项目"一样,另开一个 HTTP 端口。
go func() { statsviz.RegisterDefault() log.Println(http.ListenAndServe("localhost:8080", nil)) }()
因此这里实际上和具体框架没关系。
最佳实践
因为 runtime 信息属于系统内部信息,不适合暴露给公网用户。因此,实际上中,最佳实践是,不管什么情况下,都单独开一个 HTTP 端口,类似下面这样,对公网不可访问。
go func() { statsviz.RegisterDefault() log.Println(http.ListenAndServe("localhost:8080", nil)) }()
原理简单说明
该库使用 WebSocket 协议,定时将系统的 runtime 数据发送给浏览器,浏览器接收到之后,利用 JS 绘制图表,展示出来。Go 核心代码如下:
// sendStats indefinitely send runtime statistics on the websocket connection. func sendStats(conn *websocket.Conn) error { tick := time.NewTicker(defaultSendPeriod) defer tick.Stop() var stats stats for { select { case <-tick.C: runtime.ReadMemStats(&stats.Mem) stats.NumGoroutine = runtime.NumGoroutine() if err := conn.WriteJSON(stats); err != nil { return err } } } }
对客户端代码感兴趣的请自行阅读源码。
总结
如果你需要实时图表的方式查看系统运行时的一些数据,可以尝试下它。用类似这样几行代码一步将它集成进你的系统:
go func() { statsviz.RegisterDefault() log.Println(http.ListenAndServe("localhost:8080", nil)) }()
感谢各位的阅读,以上就是"Go第三方库之怎么一步为系统集成可视化实时运行时统计"的内容了,经过本文的学习后,相信大家对Go第三方库之怎么一步为系统集成可视化实时运行时统计这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!