实时可视化Go Runtime指标,这个Go库超赞

我是一只可爱的土拨鼠,专注于分享 Go 职场、招聘和求职,解 Gopher 之忧!欢迎关注我。

欢迎大家加入Go招聘交流群,来这里找志同道合的小伙伴!跟土拨鼠们一起交流学习。

前言

小土之前分享过一篇如何监控 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/statsviz@latest

Example

可以在HTTP服务 http.ServeMux[1] 注册statsviz

mux := http.NewServeMux()
statsviz.Register(mux)

或者使用 http.DefaultServeMux注册:

statsviz.RegisterDefault()

默认情况下statsviz的服务路由地址是在 /debug/statsviz/下。

下面我们来一个实例

package main

import (
 "log"
 "net/http"

 "github.com/arl/statsviz"
)

func main() {
 statsviz.RegisterDefault()
 log.Println(http.ListenAndServe(":6060", nil))
}

UI页面介绍

  1. 服务启动成功,我们可以访问http://localhost:6060/debug/statsviz/,看到如下页面,可以看出如下的图表信息

  • 堆栈信息

  • 堆栈中存活的对象和字节数

  • mspan和mcache信息

  • 不同大小级别对象的信息

  • STW的延迟

  • 在runnable状态中的goroutine花费的时间

    bf7ed1b1e9b6312934205e412f706d57.jpeg

statsviz
  1. 页面顶部的控件作用于所有的图表:

7d44696ce40004ea531848d88d0ea061.png
菜单
  • 毛刷的图标是显示/隐藏代表GC的垂直线

  • 时间范围选择器是定义了可视化的时间跨度。有1、5、10min的区间

  • 播放/暂停的图标可以停止和刷新图表

  1. 在每个图的顶部,你会发现 2 个图标:

    b5db77a7c4eea6177de19d281797a06c.png

菜单
  • 相机图标可以将绘图下载为 PNG 图像。

  • 信息图标会显示有关当前绘图的信息。

statsviz是如何运作的呢?

那么你想知道statsviz是怎么工作的呢?让我们来一探究竟。

Statsviz 主要有 2 个 HTTP 接口服务:

  • 第一个 ( /debug/statsviz) 是提供带有 statsviz 用户界面的网页,最初显示是一页空白的图。

  • 第二个 HTTP 处理程序 ( /debug/statsviz/ws) 是监听的WebSocket 连接,该连接会在 statsviz 网页加载到您的浏览器后立即启动。

程序会每隔一秒将所有运行时/指标[2] 数据指标信息发送到网页。数据存储在浏览器中的循环缓冲区中,该缓冲区只会保存预先设置的数量的数据信息。

statsviz如何集成到各不同的web框架中呢?

假如你也想接入statsviz,用的不是标准库,也可以看下statsviz在各个web框架和标准库中编写的例子,https://github.com/arl/statsviz/blob/v0.5.1/_example/README.md。如没有你用的框架的实例,你也可以按需编写。这儿我们简单看一下常用web框架gin的例子

package main

import (
 "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的工作任务。

参考资料

[1]

http.ServeMux: https://pkg.go.dev/net/http?tab=doc#ServeMux

[2]

运行时/指标: https://pkg.go.dev/runtime/metrics


资料下载

点击下方卡片关注公众号,发送特定关键字获取对应精品资料!

  • 回复「电子书」,获取入门、进阶 Go 语言必看书籍。

  • 回复「视频」,获取价值 5000 大洋的视频资料,内含实战项目(不外传)!

  • 回复「路线」,获取最新版 Go 知识图谱及学习、成长路线图。

  • 回复「面试题」,获取四哥精编的 Go 语言面试题,含解析。

  • 回复「后台」,获取后台开发必看 10 本书籍。

对了,看完文章,记得点击下方的卡片。关注我哦~ 👇👇👇

如果您的朋友也在学习 Go 语言,相信这篇文章对 TA 有帮助,欢迎转发分享给 TA,非常感谢!f03aea123df5bd06ac9c68548990a9ec.png

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值