溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Go第三方庫之怎么一步為系統(tǒng)集成可視化實(shí)時(shí)運(yùn)行時(shí)統(tǒng)計(jì)

發(fā)布時(shí)間:2021-10-26 11:50:29 來源:億速云 閱讀:148 作者:iii 欄目:web開發(fā)

這篇文章主要講解了“Go第三方庫之怎么一步為系統(tǒng)集成可視化實(shí)時(shí)運(yùn)行時(shí)統(tǒng)計(jì)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Go第三方庫之怎么一步為系統(tǒng)集成可視化實(shí)時(shí)運(yùn)行時(shí)統(tǒng)計(jì)”吧!

看其中 Heap 的實(shí)時(shí)動(dòng)圖:

Go第三方庫之怎么一步為系統(tǒng)集成可視化實(shí)時(shí)運(yùn)行時(shí)統(tǒng)計(jì)

上面這些通過運(yùn)行下面這段代碼就可以了:

package main  import (  "math/rand"  "net/http"  "strconv"  "time"   "github.com/arl/statsviz" )  func main() {  // Force the GC to work to make the plots "move".  go work()   // Register statsviz handlers on the default serve mux.  statsviz.RegisterDefault()  http.ListenAndServe(":8080", nil) }  func work() {  // Generate some allocations  m := map[string][]byte{}   for {   b := make([]byte, 512+rand.Intn(16*1024))   m[strconv.Itoa(len(m)%(10*100))] = b    if len(m)%(10*100) == 0 {    m = make(map[string][]byte)   }    time.Sleep(10 * time.Millisecond)  } }

1、如何使用

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

statsviz 的使用很簡單。假設(shè)基于 net/http 使用。

  • import "github.com/arl/statsviz”

  • 注冊 statsviz HTTP handlers

  • 啟動(dòng)程序

  • 打開瀏覽器訪問:http://host:port/debug/statsviz

  • 盡情享受吧~

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

基于 net/http

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

1)一個(gè)使用 net/http 的 Web 項(xiàng)目

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

statsviz.RegisterDefault()

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

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

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

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

func RegisterDefault() {  Register(http.DefaultServeMux) }

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

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

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

基于兼容 net/http 的框架

因?yàn)榧嫒?net/http 框架,因此可以直接將 statsviz 的 Handler 集成進(jìn)去。比如對(duì)于 gorilla/mux  庫,可以這么做:

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

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

不兼容 net/http 的框架

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

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

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

最佳實(shí)踐

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

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

原理簡單說明

該庫使用 WebSocket 協(xié)議,定時(shí)將系統(tǒng)的 runtime 數(shù)據(jù)發(fā)送給瀏覽器,瀏覽器接收到之后,利用 JS 繪制圖表,展示出來。Go  核心代碼如下:

// sendStats indefinitely send runtime statistics on the websocket connection. func sendStats(conn *websocket.Conn) error {  tick := time.NewTicker(defaultSendPeriod)  defer tick.Stop()   var stats stats  for {   select {   case <-tick.C:    runtime.ReadMemStats(&stats.Mem)    stats.NumGoroutine = runtime.NumGoroutine()    if err := conn.WriteJSON(stats); err != nil {     return err    }   }  } }

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

總結(jié)

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

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

感謝各位的閱讀,以上就是“Go第三方庫之怎么一步為系統(tǒng)集成可視化實(shí)時(shí)運(yùn)行時(shí)統(tǒng)計(jì)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Go第三方庫之怎么一步為系統(tǒng)集成可視化實(shí)時(shí)運(yùn)行時(shí)統(tǒng)計(jì)這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

go
AI