当前位置:首页 >百科 >Go 程序运行时数据统计的可视化工具 Statsviz 它基于 d3.js 和 stack.gl

Go 程序运行时数据统计的可视化工具 Statsviz 它基于 d3.js 和 stack.gl

2024-06-29 07:10:42 [百科] 来源:避面尹邢网

Go 程序运行时数据统计的程序可视化工具 Statsviz

作者:Go 夜读 开发 后端 大数据 今天跟大家介绍一款实时可视化 Go 程序运行时数据统计的工具 statsviz。

 [[424685]]

本文转载自微信公众号「 Go 夜读」,运行作者 Go 夜读 。时数转载本文请联系 Go 夜读公众号。据统计的具

Go 程序运行时数据统计的可视化工具 Statsviz 它基于 d3.js 和 stack.gl

今天跟大家介绍一款实时可视化 Go 程序运行时数据统计的可视工具 statsviz

Go 程序运行时数据统计的可视化工具 Statsviz 它基于 d3.js 和 stack.gl

https://github.com/arl/statsviz 

Go 程序运行时数据统计的可视化工具 Statsviz 它基于 d3.js 和 stack.gl

它的图形化展现对于我们了解 Go 程序的 GC 行为,以及内存开销等很有用!

使用也很简单:

1. go get github.com/arl/statsviz

2. 在你的化工 http.ServeMux 上注册

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

或者使用默认 http 注册:

  1. statsviz.RegisterDefault() 

如果你的程序不是一个 http 应用程序,那么你可以添加以下代码来启动

  1. go func() {  
  2.     log.Println(http.ListenAndServe("localhost:6060",程序 nil)) 
  3. }() 

这段代码,我相信大家都非常熟悉了吧~

当我们将启动之后,运行我们可以直接在浏览器中打开:

http://localhost:6060/debug/statsviz/

看起来酷炫高大上,时数其实主要还是据统计的具依赖于 Go 为我们提供的 runtime stats

具体我们来看看它的一些代码:

1. websocket handler

  1. // NewWsHandler returns a handler that upgrades the HTTP server connection to the WebSocket 
  2. // protocol and sends application statistics at the given frequency. 
  3. // 
  4. // If the upgrade fails, an HTTP error response is sent to the client. 
  5. func NewWsHandler(frequency time.Duration) http.HandlerFunc {  
  6.  return func(w http.ResponseWriter, r *http.Request) {  
  7.   var upgrader = websocket.Upgrader{  
  8.    ReadBufferSize:  1024, 
  9.    WriteBufferSize: 1024, 
  10.   } 
  11.  
  12.   ws, err := upgrader.Upgrade(w, r, nil) 
  13.   if err != nil {  
  14.    return 
  15.   } 
  16.   defer ws.Close() 
  17.  
  18.   // Explicitly ignore this error. We don't want to spam standard output 
  19.   // each time the other end of the websocket connection closes. 
  20.   _ = sendStats(ws, frequency) 
  21.  } 

2. sendStats

  1. // sendStats indefinitely send runtime statistics on the websocket connection. 
  2. func sendStats(conn *websocket.Conn, frequency time.Duration) error {  
  3.  tick := time.NewTicker(frequency) 
  4.  defer tick.Stop() 
  5.  
  6.  var ( 
  7.   stats stats 
  8.   err   error 
  9.  ) 
  10.  for range tick.C {  
  11.   runtime.ReadMemStats(&stats.Mem) 
  12.   stats.NumGoroutine = runtime.NumGoroutine() 
  13.   if err = conn.WriteJSON(stats); err != nil {  
  14.    break 
  15.   } 
  16.  } 
  17.  
  18.  return err 

3. 其实这个项目比较核心的代码是前端 JavaScript 代码:

  1. m.pushData = function (ts, allStats) {  
  2.         data.times.push(ts); // timestamp 
  3.  
  4.         const memStats = allStats.Mem; 
  5.  
  6.         data.gcfraction.push(memStats.GCCPUFraction); 
  7.         data.goroutines.push(allStats.NumGoroutine); 
  8.  
  9.         data.heap[idxHeapAlloc].push(memStats.HeapAlloc); 
  10.         data.heap[idxHeapSys].push(memStats.HeapSys); 
  11.         data.heap[idxHeapIdle].push(memStats.HeapIdle); 
  12.         data.heap[idxHeapInuse].push(memStats.HeapInuse); 
  13.         data.heap[idxHeapNextGC].push(memStats.NextGC); 
  14.  
  15.         data.mspanMCache[idxMSpanMCacheMSpanInUse].push(memStats.MSpanInuse); 
  16.         data.mspanMCache[idxMSpanMCacheMSpanSys].push(memStats.MSpanSys); 
  17.         data.mspanMCache[idxMSpanMSpanMSCacheInUse].push(memStats.MCacheInuse); 
  18.         data.mspanMCache[idxMSpanMSpanMSCacheSys].push(memStats.MCacheSys); 
  19.  
  20.         data.objects[idxObjectsLive].push(memStats.Mallocs - memStats.Frees); 
  21.         data.objects[idxObjectsLookups].push(memStats.Lookups); 
  22.         data.objects[idxObjectsHeap].push(memStats.HeapObjects); 
  23.  
  24.         for (let i = 0; i < memStats.BySize.length; i++) {  
  25.             const size = memStats.BySize[i]; 
  26.             data.bySize[i].push(size.Mallocs - size.Frees); 
  27.         } 
  28.  
  29.         updateLastGC(memStats); 
  30.     } 

渲染效果是通过 https://github.com/arl/statsviz/blob/master/static/plotly-basic.min.js 渲染所得。

Plotly.js 简介:它是可视一款开源的 JavaScript 图表库,它基于 d3.js 和 stack.gl 。化工是程序一个高层次的、描述性的运行图表库。plotly.js 带来 20 种图表类型,时数包括 3D 图表,统计图表,和 SVG 地图。

我们来看一个官网示例,很酷炫

我们再来看看 statsviz 在 GitHub 仓库上提供的一些 demo 示意图(方便大家来直观的感受 statsviz):

如果你已经用过它或者有其他可视化工具,欢迎你来评论。

 

责任编辑:武晓燕 来源: Go夜读 Go程序工具

(责任编辑:探索)

    推荐文章
    • 华润集团一季度经营业绩实现稳步开局 新动能业务加速发力

      华润集团一季度经营业绩实现稳步开局 新动能业务加速发力2022年第一季度,华润集团营业收入和净利润继续保持增长,经营质量持续提升,新动能业务加速发力,一季度华润集团营业额增长8%,净利润在央企排名第10位。今年以来,华润集团坚持稳字当头、稳中求进总基调, ...[详细]
    • 车辆轨迹监控系统提升进境动物检疫监管效能

      车辆轨迹监控系统提升进境动物检疫监管效能    科技日报讯 记者陈曦 通讯员祁喜柯)“两批种牛同时集中进境,运输时间长,多亏了车辆轨迹监控系统的帮助,我们顺利完成任务。”1月26日,天津海关所属宁河海关动检一科科长李富文对记者说。    前 ...[详细]
    • 城市绿地与学龄儿童视力水平呈正相关

      城市绿地与学龄儿童视力水平呈正相关本报讯记者朱汉斌)近日,中山大学公共卫生学院教授陈亚军课题组研究发现,城市绿地与学龄儿童视力水平呈正相关,与视力受损风险呈负相关。相关成果发表于《环境国际》。“该研究是一项以中国大样本学龄儿童人群为对 ...[详细]
    • 湖北大学举办楚才学院拔尖创新人才培养论坛

      湖北大学举办楚才学院拔尖创新人才培养论坛    科技日报讯 记者吴纯新 通讯员刘怀元 肖勇)1月下旬,记者从湖北大学获悉,该校日前举办楚才学院建院十五周年拔尖创新人才培养论坛。    自2008年成立以来,湖北大学楚才学院全面探索并构建具有 ...[详细]
    • 闲鱼多久自动确认收货 收货后可以退款退货吗?

      闲鱼多久自动确认收货 收货后可以退款退货吗?网购现如今是最受欢迎的一种购物方式了,不同的网购平台有很多,其中二手的网购平台也层出不穷,闲鱼就是知名的二手平台之一,那么闲鱼多久自动确认收货呢?还有闲鱼上买东西,如果不喜欢可以退款退货吗?闲鱼是阿里 ...[详细]
    • 显著提高头颈部不明肿瘤原发灶诊断准确率

      显著提高头颈部不明肿瘤原发灶诊断准确率本报讯见习记者江庆龄)复旦大学附属肿瘤医院核医学科主任宋少莉团队发现,利用68Ga-FAPI PET/CT显像可显著提高头颈部原发不明肿瘤原发灶的诊断准确率。团队通过靶向成纤维活化蛋白的新型分子影像来 ...[详细]
    • 糖脂代谢研究重点专项启动

      糖脂代谢研究重点专项启动本报讯记者朱汉斌 通讯员刘小龙)近日,由广东药科大学牵头,国内多家科研机构、高校及企业共同承担的国家重点研发计划“主动健康和人口老龄化科技应对”重点专项“糖脂代谢异常亚健康状态预警及系统有效干预措施研 ...[详细]
    • 国内大模型与GPT

      国内大模型与GPT1月30日,上海人工智能实验室发布了大模型开源开放评测体系司南OpenCompass2.0),同时在对部分主流大模型评测诊断的基础上,揭晓了年度大模型评测榜单,提到了国内大模型的优势与短板。根据评测, ...[详细]
    • 怎么修改花呗还款日期 花呗还款日期可以修改几次?

      怎么修改花呗还款日期 花呗还款日期可以修改几次?花呗还款日期由系统确定,以前是完全无法修改的,但自从支付宝调整了花呗还款日之后,目前针对开通签约满1年的花呗老用户开放了一个预约设置花呗还款日的功能,便可以实现修改。那么,具体怎么修改花呗还款日期呢? ...[详细]
    • 丰田系造假丑闻频出,丰田章男鞠躬道歉

      丰田系造假丑闻频出,丰田章男鞠躬道歉21世纪经济报道记者 宋豆豆 报道“丰田在最应该重视的价值观及优先顺序方面出现了迷失。集团旗下的丰田自动织机公司和大发工业公司等相继发生造假事件,在认证测试中作弊,向市场交付了大量本不该出售的商品。” ...[详细]
    热点阅读