Go語言metrics應(yīng)用監(jiān)控指標基本使用說明
metrics 是什么?
當我們需要為某個系統(tǒng)某個服務(wù)做監(jiān)控、做統(tǒng)計,就需要用到Metrics
五種 Metrics 類型
Gauges
:最簡單的度量指標,只有一個簡單的返回值,或者叫瞬時狀態(tài)Counters
:Counter 就是計數(shù)器,Counter 只是用 Gauge 封裝了 AtomicLongMeters
:Meter度量一系列事件發(fā)生的速率(rate),例如TPS。Meters會統(tǒng)計最近1分鐘,5分鐘,15分鐘,還有全部時間的速率。Histograms
:Histogram統(tǒng)計數(shù)據(jù)的分布情況。比如最小值,最大值,中間值,還有中位數(shù),75百分位, 90百分位, 95百分位, 98百分位, 99百分位, 和 99.9百分位的值(percentiles)。Timer
其實是 Histogram 和 Meter 的結(jié)合, histogram 某部分代碼/調(diào)用的耗時, meter統(tǒng)計TPS。
接下來我們寫代碼實際使用一下這些功能 就從最簡單的Gauges 開始吧
package main import ( "github.com/rcrowley/go-metrics" "time" "os" "log" ) func main(){ g := metrics.NewGauge() metrics.Register("bar", g) g.Update(1) go metrics.Log(metrics.DefaultRegistry, 1 * time.Second, log.New(os.Stdout, "metrics: ", log.Lmicroseconds)) var j int64 j = 1 for true { time.Sleep(time.Second * 1) g.Update(j) j++ } }
此時我們運行程序 可以看到如下輸出
在程序中我們在metrics.Log 中設(shè)置了 metrics 的輸出頻率為1s 同時指定了數(shù)據(jù)輸出的目的為 log.New出來的Logger 設(shè)置為打印在標準輸出
接下counters 與gauges 類似
只不過在操作上 gauges 是 update 而 counter 是 inc 做加法 增加參數(shù)市值 dec 做減法
g := metrics.NewGauge() metrics.Register("bar", g) g.Update(1) c := metrics.NewCounter() metrics.Register("foo", c) c.Inc(45) c.Dec(3)
以上代碼可以看到區(qū)別 在New 的時候 默認的時候數(shù)值都為0
package main import ( "github.com/rcrowley/go-metrics" "time" "os" "log" ) func main(){ s := metrics.NewExpDecaySample(1024, 0.015) // or metrics.NewUniformSample(1028) h := metrics.NewHistogram(s) metrics.Register("baz", h) h.Update(1) go metrics.Log(metrics.DefaultRegistry, 1 * time.Second, log.New(os.Stdout, "metrics: ", log.Lmicroseconds)) var j int64 j = 1 for true { time.Sleep(time.Second * 1) j++ h.Update(j) } }
metrics.NewExpDecaySample這函數(shù)的兩個參數(shù)的含義: 第一是內(nèi)部存儲數(shù)據(jù)的個數(shù)
第二個是指數(shù)后乘以的數(shù)值 具體位置
下面來測試一下meters
package main import ( "time" "os" "github.com/rcrowley/go-metrics" "log" ) func main(){ m := metrics.NewMeter() metrics.Register("quux", m) m.Mark(1) go metrics.Log(metrics.DefaultRegistry, 1 * time.Second, log.New(os.Stdout, "metrics: ", log.Lmicroseconds)) var j int64 j = 1 for true { time.Sleep(time.Second * 1) j++ m.Mark(j) } }
測試結(jié)果
輸出到influxdb
influxdb的安裝和基本使用這里不做介紹
使用下面工作
vrischmann/go-metrics-influxdb
package main import ( "github.com/rcrowley/go-metrics" "time" "github.com/vrischmann/go-metrics-influxdb" ) func main(){ m := metrics.NewMeter() metrics.Register("quux", m) m.Mark(1) go influxdb.InfluxDB(metrics.DefaultRegistry, time.Second * 5, "http://192.168.150.74:8086", "mydb", "", "") var j int64 j = 1 for true { time.Sleep(time.Second*1) m.Mark(j) j += 1 } }
看以上的代碼 其他地方都不用改動 只要改下輸出的地方就可以了
在influx中使用設(shè)置的database 表名則自用生成 使用 是 metrics中register 設(shè)置的名字加上類型 在這里例子中 表名為quux.meter
就可以在influxdb 里面看到如下的一些數(shù)據(jù):
以上就是Go語言metrics應(yīng)用監(jiān)控指標基本使用說明的詳細內(nèi)容,更多關(guān)于go語言metrics使用的資料請關(guān)注腳本之家其它相關(guān)文章!
- golang調(diào)試bug及性能監(jiān)控方式實踐總結(jié)
- golang?pprof?監(jiān)控goroutine?thread統(tǒng)計原理詳解
- golang?pprof監(jiān)控memory?block?mutex統(tǒng)計原理分析
- golang?pprof監(jiān)控memory?block?mutex使用指南
- golang?pprof?監(jiān)控系列?go?trace統(tǒng)計原理與使用解析
- prometheus?client_go為應(yīng)用程序自定義監(jiān)控指標
- web項目中g(shù)olang性能監(jiān)控解析
- Skywalking-go自動監(jiān)控增強使用探究
相關(guān)文章
Go 結(jié)構(gòu)體、數(shù)組、字典和 json 字符串的相互轉(zhuǎn)換方法
今天小編就為大家分享一篇Go 結(jié)構(gòu)體、數(shù)組、字典和 json 字符串的相互轉(zhuǎn)換方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08