当前位置: 首页 > 科技观察

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

时间:2023-03-15 14:18:26 科技观察

大家好,我是站长polarisxu。一个实际的系统,需要掌握系统的运行状况,知道系统哪里可能存在问题,便于优化。在对系统一无所知的情况下裸奔,迟早要出大事。在Go语言中,官方的标准库提供了一些方法,可以让我们获取内存分配、GC、Goroutine的信息。比如内存,GC等,可以通过runtime.MemStats获取:https://docs.studygolang.com/pkg/runtime/#MemStats,可以通过runtime.NumGoroutine()获取Goroutine的数量功能。一般我们需要自己去分析MemStats的信息,做一个展示,也要做一个图表。今天给大家推荐一个库:https://github.com/arl/statsviz,这是一个在浏览器中实时查看Go应用运行时统计(GC、MemStats等)的库。它可以显示的信息如下:查看Heap的实时动画:上面可以通过运行以下代码来完成:packagemainimport("math/rand""net/http""strconv""time""github...:=map[string][]byte{}for{b:=make([]byte,512+rand.Intn(16*1024))m[strconv.Itoa(len(m)%(10*100))]=biflen(m)%(10*100)==0{m=make(map[string][]byte)}time.Sleep(10*time.Millisecond)}}1.如何使用Go1.15。x,请使用go模块。使用statsviz很简单。假设基于net/http使用。import"github.com/arl/statsviz"RegisterstatsvizHTTPhandlers启动程序打开浏览器访问:http://host:port/debug/statsvizEnjoyit~看看在实践中是如何集成到项目中的,根据可能的情况单独介绍。基于net/http如果你的项目没有使用框架,直接基于net/http;或者你的项目没有提供HTTP服务。可以通过以下方式集成statsviz。1)使用net/http的web项目只需要导入statsviz包,然后在路由注册的地方添加如下代码:statsviz.RegisterDefault()这个使用默认的http.DefaultServeMux,如果你使用一个自定义的Mux,然后添加类似下面的代码:mux:=http.NewServeMux()statsviz.Register(mux)其中,mux使用你定义的。其实statsviz.RegisterDefault()内部实现如下:需要启动一个HTTP服务:gofunc(){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端口。gofunc(){statsviz.RegisterDefault()log.Println(http.ListenAndServe("localhost:8080",nil))}()所以其实和具体的框架没有关系。最佳实践由于运行时信息是系统内部信息,不宜暴露给公网用户。所以,其实最好的做法是无论什么情况都单独开一个HTTP端口,像下面这样,公网是访问不到的。gofunc(){statsviz.RegisterDefault()log.Println(http.ListenAndServe("localhost:8080",nil))}()的原理简单说明了该库使用WebSocket协议定时发送系统的运行时数据到浏览器。接收方收到后,用JS绘制图表显示。Go核心代码如下:&stats.Mem)stats.NumGoroutine=runtime.NumGoroutine()iferr:=conn.WriteJSON(stats);err!=nil{returnerr}}}}如果对客户端代码感兴趣,请自行阅读源码。总结如果需要在实时图表中查看系统运行时的一些数据,可以试试。使用如下几行代码一步将其集成到您的系统中:gofunc(){statsviz.RegisterDefault()log.Println(http.ListenAndServe("localhost:8080",nil))}()