一句话描述

runtime

安装

go get github.com/arl/statsviz@latest

Example

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

mux := http.NewServeMux()
statsviz.Register(mux)
http.DefaultServeMux
statsviz.RegisterDefault()
/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花费的时间


statsviz

  1. 页面顶部的控件作用于所有的图表:
  • 毛刷的图标是显示/隐藏代表GC的垂直线
  • 时间范围选择器是定义了可视化的时间跨度。有1、5、10min的区间
  • 播放/暂停的图标可以停止和刷新图表
  1. 在每个图的顶部,你会发现 2 个图标:


菜单

  • 相机图标可以将绘图下载为 PNG 图像。
  • 信息图标会显示有关当前绘图的信息。

statsviz是如何运作的呢?

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

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

/debug/statsviz/debug/statsviz/ws

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

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