成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你喜歡的 Go 第三方庫:一步為系統集成可視化實時運行時統計

開發 前端
在 Go 語言中,官方標準庫提供了方法,讓我們能夠獲得內存分配、GC 和 Goroutine 等情況。比如內存、GC 等情況,可以通過 runtime.MemStats 獲取:https://docs.studygolang.com/pkg/runtime/#MemStats,Goroutine 數量可以通過 runtime.NumGoroutine() 函數獲得。

大家好,我是站長 polarisxu。

掌握系統運行狀態,知道系統哪些地方可能存在問題,方便進行優化,這是一個實際系統必備的。裸奔,對系統一無所知,遲早是要出大事的。

在 Go 語言中,官方標準庫提供了方法,讓我們能夠獲得內存分配、GC 和 Goroutine 等情況。比如內存、GC 等情況,可以通過 runtime.MemStats 獲取:https://docs.studygolang.com/pkg/runtime/#MemStats,Goroutine 數量可以通過 runtime.NumGoroutine() 函數獲得。

[[346764]]

一般我們我們需要自己解析 MemStats 信息、做展示,也可以做圖表。

今天我給大家推薦一個庫:https://github.com/arl/statsviz,它是一個在瀏覽器中實時查看 Go 應用程序運行時統計信息(GC,MemStats 等)的庫。

它能展示的信息如下圖:

再看其中 Heap 的實時動圖:

上面這些通過運行下面這段代碼就可以了:

  1. package main 
  2.  
  3. import ( 
  4.  "math/rand" 
  5.  "net/http" 
  6.  "strconv" 
  7.  "time" 
  8.  
  9.  "github.com/arl/statsviz" 
  10.  
  11. func main() { 
  12.  // Force the GC to work to make the plots "move"
  13.  go work() 
  14.  
  15.  // Register statsviz handlers on the default serve mux. 
  16.  statsviz.RegisterDefault() 
  17.  http.ListenAndServe(":8080", nil) 
  18.  
  19. func work() { 
  20.  // Generate some allocations 
  21.  m := map[string][]byte{} 
  22.  
  23.  for { 
  24.   b := make([]byte, 512+rand.Intn(16*1024)) 
  25.   m[strconv.Itoa(len(m)%(10*100))] = b 
  26.  
  27.   if len(m)%(10*100) == 0 { 
  28.    m = make(map[string][]byte) 
  29.   } 
  30.  
  31.   time.Sleep(10 * time.Millisecond) 
  32.  } 

1、如何使用

都 Go1.15.x 了,請使用 go module。

statsviz 的使用很簡單。假設基于 net/http 使用。

  • import "github.com/arl/statsviz”
  • 注冊 statsviz HTTP handlers
  • 啟動程序
  • 打開瀏覽器訪問:http://host:port/debug/statsviz
  • 盡情享受吧~

具體看看實際中怎么集成到項目中,根據可能的情況分別介紹。

基于 net/http

如果你的項目沒有使用框架,直接基于 net/http;或者你的項目并沒有提供 HTTP 服務。集成 statsviz 可以按照下面的方式。

1)一個使用 net/http 的 Web 項目

只需要 import statsviz 包后,在注冊路由的地方加上如下代碼:

  1. statsviz.RegisterDefault() 

這是使用默認的 http.DefaultServeMux,如果你使用的是自定義 Mux,則加上如下類似如下代碼:

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

其中,mux 使用你定義好的。

實際上,statsviz.RegisterDefault() 內部是這么實現的:

  1. func RegisterDefault() { 
  2.  Register(http.DefaultServeMux) 

2)沒有提供 HTTP 服務的項目

這時最簡單的方式就是使用 statsviz.RegisterDefault() ,同時需要啟動一個 HTTP 服務:

  1. go func() { 
  2.   statsviz.RegisterDefault() 
  3.   log.Println(http.ListenAndServe("localhost:8080", nil)) 
  4. }() 

基于兼容 net/http 的框架

因為兼容 net/http 框架,因此可以直接將 statsviz 的 Handler 集成進去。比如對于 gorilla/mux 庫,可以這么做:

  1. r := mux.NewRouter() 
  2. r.Methods("GET").Path("/debug/statsviz/ws").Name("GET /debug/statsviz/ws").HandlerFunc(statsviz.Ws) 
  3. r.Methods("GET").PathPrefix("/debug/statsviz/").Name("GET /debug/statsviz/").Handler(statsviz.Index
  4.  
  5. mux := http.NewServeMux() 
  6. mux.Handle("/", r) 
  7. http.ListenAndServe(":8080", mux) 

這里主要是 statsviz.Ws 和 statsviz.Index,因為 gorilla/mux 庫兼容 net/http,所以可以這么做。

不兼容 net/http 的框架

比如集成進 Gin 框架。做法就是和“沒有提供 HTTP 服務的項目”一樣,另開一個 HTTP 端口。

  1. go func() { 
  2.   statsviz.RegisterDefault() 
  3.   log.Println(http.ListenAndServe("localhost:8080", nil)) 
  4. }() 

因此這里實際上和具體框架沒關系。

最佳實踐

因為 runtime 信息屬于系統內部信息,不適合暴露給公網用戶。因此,實際上中,最佳實踐是,不管什么情況下,都單獨開一個 HTTP 端口,類似下面這樣,對公網不可訪問。

  1. go func() { 
  2.   statsviz.RegisterDefault() 
  3.   log.Println(http.ListenAndServe("localhost:8080", nil)) 
  4. }() 

原理簡單說明

該庫使用 WebSocket 協議,定時將系統的 runtime 數據發送給瀏覽器,瀏覽器接收到之后,利用 JS 繪制圖表,展示出來。Go 核心代碼如下:

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

對客戶端代碼感興趣的請自行閱讀源碼。

總結

如果你需要實時圖表的方式查看系統運行時的一些數據,可以嘗試下它。用類似這樣幾行代碼一步將它集成進你的系統:

  1. go func() { 
  2.   statsviz.RegisterDefault() 
  3.   log.Println(http.ListenAndServe("localhost:8080", nil)) 
  4. }() 


 

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2023-12-06 08:07:13

拖拽庫可視化

2021-10-11 06:38:52

Go開源庫語言

2019-07-30 11:35:54

AndroidRetrofit

2021-09-18 08:02:49

Go程序工具

2015-11-05 16:44:37

第三方登陸android源碼

2021-09-26 10:43:08

注冊Istio集成

2022-01-14 09:57:14

鴻蒙HarmonyOS應用

2020-11-16 19:37:17

物聯網智慧城市IoT

2023-05-16 08:27:12

2014-07-22 10:56:45

Android Stu第三方類庫

2015-04-27 19:32:16

Moxtra

2025-01-06 00:00:01

KratosGo微服務

2017-12-11 15:53:56

2014-07-23 08:55:42

iOSFMDB

2022-06-06 07:50:55

PythonJSON

2013-01-15 13:50:22

iOS開發開源庫

2022-05-21 23:56:16

Python庫搜索Python

2011-07-25 14:14:49

iPhone SQLITE Pldatabase

2010-03-03 15:10:49

第三方Python庫

2013-08-14 09:50:32

iOS類庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕亚洲视频 | 国产精品一区二区不卡 | 日韩一及片| 粉嫩粉嫩芽的虎白女18在线视频 | 超碰成人免费观看 | 亚洲午夜精品 | 亚洲精品中文字幕av | 国产精品美女久久久久久久久久久 | 99亚洲精品视频 | 国产一区二区三区在线 | 亚洲免费在线 | 国产激情小视频 | 91美女在线 | 91伊人| 国产精品特级毛片一区二区三区 | 久草网址 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 97人人澡人人爽91综合色 | 亚洲视频国产视频 | 视频1区 | 精品亚洲永久免费精品 | 日本免费在线观看视频 | 麻豆av免费观看 | 在线观看中文字幕视频 | 亚洲国产成人精品女人久久久 | 欧美日一区二区 | 亚洲一区二区三区免费 | 久久精品a级毛片 | 91佛爷在线观看 | 国产精品国产三级国产aⅴ中文 | 91福利网址 | 99精品在线 | 亚洲一区二区三区四区五区午夜 | 日本高清视频在线播放 | 在线观看视频中文字幕 | 久久久久久久国产精品 | 亚洲一区二区三区免费观看 | 久久高清 | 91 在线| 一区二区在线 | 亚洲欧美国产精品久久 |