小土之前分享过一篇如何监控 Go Runtime的文章,主要是通过Grafana,Graphite,Statsd等组件来采用UDP协议采集metrics上报到Grafana来进行一系列的展示。相对比较繁琐。今天小土带来一个Go库statsviz-https://github.com/arl/statsviz可以一键集成到你的HTTP服务中,并且在浏览器中可以实时看到服务的runtime指标信息。感兴趣的同学可以跟着小土一起试一下。开整。
在Web浏览器中可以实时可视化Go程序的runtime
-运行时指标数据:堆、对象、goroutine、GC暂停、调度器等。如何监控 Go Runtime
go get github.com/arl/[email protected]
可以在HTTP服务 http.ServeMux[1] 注册statsviz
mux := http.NewServeMux()
statsviz.Register(mux)
或者使用 http.DefaultServeMux
注册:
statsviz.RegisterDefault()
默认情况下statsviz的服务路由地址是在 /debug/statsviz/
下。
下面我们来一个实例
package mainimport (
"log"
"net/http"
"github.com/arl/statsviz"
)
func main() {
statsviz.RegisterDefault()
log.Println(http.ListenAndServe(":6060", nil))
}
那么你想知道statsviz是怎么工作的呢?让我们来一探究竟。
Statsviz 主要有 2 个 HTTP 接口服务:
/debug/statsviz
) 是提供带有 statsviz 用户界面的网页,最初显示是一页空白的图。/debug/statsviz/ws
) 是监听的WebSocket 连接,该连接会在 statsviz 网页加载到您的浏览器后立即启动。程序会每隔一秒将所有运行时/指标[2] 数据指标信息发送到网页。数据存储在浏览器中的循环缓冲区中,该缓冲区只会保存预先设置的数量的数据信息。
假如你也想接入statsviz,用的不是标准库,也可以看下statsviz在各个web框架和标准库中编写的例子,https://github.com/arl/statsviz/blob/v0.5.1/_example/README.md。如没有你用的框架的实例,你也可以按需编写。这儿我们简单看一下常用web框架gin的例子
package mainimport (
"fmt"
"github.com/gin-gonic/gin"
"github.com/arl/statsviz"
example "github.com/arl/statsviz/_example"
)
func main() {
// Force the GC to work to make the plots "move".
go example.Work()
fmt.Println("Point your browser to http://localhost:8085/debug/statsviz/\n\n")
router := gin.New()
router.GET("/debug/statsviz/*filepath", func(context *gin.Context) {
if context.Param("filepath") == "/ws" {
statsviz.Ws(context.Writer, context.Request)
return
}
statsviz.IndexAtRoot("/debug/statsviz").ServeHTTP(context.Writer, context.Request)
})
router.Run(":8085")
}
例子中可以看出,主要实现了/debug/statsviz/路由下的GET请求,并实现了websocket的监听处理,另外后台强制开启了一个GC的工作任务。
http.ServeMux: https://pkg.go.dev/net/http?tab=doc#ServeMux
[2]运行时/指标: https://pkg.go.dev/runtime/metrics
推荐阅读