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

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

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

大家好,我是站長 polarisxu。

掌握系統(tǒng)運行狀態(tài),知道系統(tǒng)哪些地方可能存在問題,方便進(jìn)行優(yōu)化,這是一個實際系統(tǒng)必備的。裸奔,對系統(tǒng)一無所知,遲早是要出大事的。

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

[[346764]]

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

今天我給大家推薦一個庫:https://github.com/arl/statsviz,它是一個在瀏覽器中實時查看 Go 應(yīng)用程序運行時統(tǒng)計信息(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 的使用很簡單。假設(shè)基于 net/http 使用。

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

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

基于 net/http

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

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

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

  1. statsviz.RegisterDefault() 

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

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

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

實際上,statsviz.RegisterDefault() 內(nèi)部是這么實現(xiàn)的:

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

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

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

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

基于兼容 net/http 的框架

因為兼容 net/http 框架,因此可以直接將 statsviz 的 Handler 集成進(jìn)去。比如對于 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 的框架

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

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

因此這里實際上和具體框架沒關(guān)系。

最佳實踐

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

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

原理簡單說明

該庫使用 WebSocket 協(xié)議,定時將系統(tǒng)的 runtime 數(shù)據(jù)發(fā)送給瀏覽器,瀏覽器接收到之后,利用 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.  } 

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

總結(jié)

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

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


 

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

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應(yīng)用

2020-11-16 19:37:17

物聯(lián)網(wǎng)智慧城市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微服務(wù)

2017-12-11 15:53:56

2014-07-23 08:55:42

iOSFMDB

2022-06-06 07:50:55

PythonJSON

2022-05-21 23:56:16

Python庫搜索Python

2013-01-15 13:50:22

iOS開發(fā)開源庫

2011-07-25 14:14:49

iPhone SQLITE Pldatabase

2010-03-03 15:10:49

第三方Python庫

2013-08-14 09:50:32

iOS類庫
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 91香蕉视频在线观看 | 正在播放国产精品 | 欧美日韩在线一区 | 国产精品一区二区欧美黑人喷潮水 | 欧美成年黄网站色视频 | 日韩成人专区 | 国产精品资源在线观看 | 欧美中文字幕在线 | 欧美伊人久久久久久久久影院 | 日韩久久久久久久久久久 | 99久久婷婷国产综合精品 | 91精品在线播放 | 奇米影视77| 日本电影免费完整观看 | 亚洲视频欧美视频 | 国产色99 | 中日字幕大片在线播放 | 在线亚洲免费视频 | 亚洲精品国产电影 | www.狠狠干| 亚洲一区二区不卡在线观看 | 精品国产一区二区三区性色av | a亚洲精品 | 亚洲日本中文字幕在线 | 看片91 | 欧美美女爱爱 | 一区二区视频在线观看 | 精品国产乱码久久久久久88av | 欧美精品久久久 | 欧美精品一区二区三区四区 在线 | 亚洲高清视频在线观看 | 精精国产视频 | 亚洲三级在线观看 | 国产视频一区二区 | 亚洲 欧美 日韩在线 | 亚洲午夜在线 | 亚洲欧美日韩精品久久亚洲区 | 国产精品区二区三区日本 | 成人午夜精品 | 99精品欧美一区二区三区 | 国产精品久久久久久av公交车 |