Go語(yǔ)言metrics應(yīng)用監(jiān)控指標(biāo)基本使用說(shuō)明
metrics 是什么?
當(dāng)我們需要為某個(gè)系統(tǒng)某個(gè)服務(wù)做監(jiān)控、做統(tǒng)計(jì),就需要用到Metrics
五種 Metrics 類型
Gauges:最簡(jiǎn)單的度量指標(biāo),只有一個(gè)簡(jiǎn)單的返回值,或者叫瞬時(shí)狀態(tài)Counters:Counter 就是計(jì)數(shù)器,Counter 只是用 Gauge 封裝了 AtomicLongMeters:Meter度量一系列事件發(fā)生的速率(rate),例如TPS。Meters會(huì)統(tǒng)計(jì)最近1分鐘,5分鐘,15分鐘,還有全部時(shí)間的速率。Histograms:Histogram統(tǒng)計(jì)數(shù)據(jù)的分布情況。比如最小值,最大值,中間值,還有中位數(shù),75百分位, 90百分位, 95百分位, 98百分位, 99百分位, 和 99.9百分位的值(percentiles)。Timer其實(shí)是 Histogram 和 Meter 的結(jié)合, histogram 某部分代碼/調(diào)用的耗時(shí), meter統(tǒng)計(jì)TPS。
接下來(lái)我們寫(xiě)代碼實(shí)際使用一下這些功能 就從最簡(jiǎn)單的Gauges 開(kāi)始吧
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++
}
}此時(shí)我們運(yùn)行程序 可以看到如下輸出
在程序中我們?cè)趍etrics.Log 中設(shè)置了 metrics 的輸出頻率為1s 同時(shí)指定了數(shù)據(jù)輸出的目的為 log.New出來(lái)的Logger 設(shè)置為打印在標(biāo)準(zhǔn)輸出

接下counters 與gauges 類似
只不過(guò)在操作上 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í)候 默認(rèn)的時(shí)候數(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ù)的兩個(gè)參數(shù)的含義: 第一是內(nèi)部存儲(chǔ)數(shù)據(jù)的個(gè)數(shù)
第二個(gè)是指數(shù)后乘以的數(shù)值 具體位置
下面來(lái)測(cè)試一下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)
}
}測(cè)試結(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
}
}看以上的代碼 其他地方都不用改動(dòng) 只要改下輸出的地方就可以了
在influx中使用設(shè)置的database 表名則自用生成 使用 是 metrics中register 設(shè)置的名字加上類型 在這里例子中 表名為quux.meter
就可以在influxdb 里面看到如下的一些數(shù)據(jù):

以上就是Go語(yǔ)言metrics應(yīng)用監(jiān)控指標(biāo)基本使用說(shuō)明的詳細(xì)內(nèi)容,更多關(guān)于go語(yǔ)言metrics使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- golang調(diào)試bug及性能監(jiān)控方式實(shí)踐總結(jié)
- golang?pprof?監(jiān)控goroutine?thread統(tǒng)計(jì)原理詳解
- golang?pprof監(jiān)控memory?block?mutex統(tǒng)計(jì)原理分析
- golang?pprof監(jiān)控memory?block?mutex使用指南
- golang?pprof?監(jiān)控系列?go?trace統(tǒng)計(jì)原理與使用解析
- prometheus?client_go為應(yīng)用程序自定義監(jiān)控指標(biāo)
- web項(xiàng)目中g(shù)olang性能監(jiān)控解析
- Skywalking-go自動(dòng)監(jiān)控增強(qiáng)使用探究
相關(guān)文章
golang使用bcrypt包對(duì)密碼進(jìn)行加密的方法實(shí)現(xiàn)
本文主要介紹了golang使用bcrypt包對(duì)密碼進(jìn)行加密的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Go語(yǔ)言開(kāi)發(fā)技巧必知的小細(xì)節(jié)提升效率
這篇文章主要介紹了Go語(yǔ)言開(kāi)發(fā)技巧必知的小細(xì)節(jié)提升效率,分享幾個(gè)你可能不知道的Go語(yǔ)言小細(xì)節(jié),希望能幫助大家更好地學(xué)習(xí)這門(mén)語(yǔ)言2024-01-01
Golang中的new()和make()函數(shù)本質(zhì)區(qū)別
在 Go 語(yǔ)言開(kāi)發(fā)中,new() 和 make() 是兩個(gè)容易讓開(kāi)發(fā)者感到困惑的內(nèi)建函數(shù),盡管它們都用于內(nèi)存分配,但其設(shè)計(jì)目的、適用場(chǎng)景和底層實(shí)現(xiàn)存在本質(zhì)差異,本文將通過(guò)類型系統(tǒng)、內(nèi)存模型和編譯器實(shí)現(xiàn)三個(gè)維度,深入解析這兩個(gè)函數(shù)的本質(zhì)區(qū)別,感興趣的朋友一起看看吧2025-02-02
Go調(diào)度器學(xué)習(xí)之系統(tǒng)調(diào)用詳解
這篇文章腫,將以一個(gè)簡(jiǎn)單的文件打開(kāi)的系統(tǒng)調(diào)用,來(lái)分析一下Go調(diào)度器在系統(tǒng)調(diào)用時(shí)做了什么。文中的示例代碼講解詳細(xì),需要的可以參考一下2023-04-04
使用Go語(yǔ)言實(shí)現(xiàn)接口繼承的方式
在Go語(yǔ)言中,接口(interface)是一種定義方法集合的類型,它并不包含方法的具體實(shí)現(xiàn),只是規(guī)定實(shí)現(xiàn)該接口的類型必須提供這些方法的實(shí)現(xiàn),下面我將通過(guò)示例代碼來(lái)詳細(xì)解釋如何使用Go語(yǔ)言實(shí)現(xiàn)接口組合,以及為什么這種方式可以看作是實(shí)現(xiàn)接口繼承的一種方式2024-05-05
GoLang基于zap日志庫(kù)的封裝過(guò)程詳解
Zap是我個(gè)人比較喜歡的日志庫(kù),是uber開(kāi)源的,有較好的性能,在項(xiàng)目開(kāi)發(fā)中,經(jīng)常需要把程序運(yùn)行過(guò)程中各種信息記錄下來(lái),有了詳細(xì)的日志有助于問(wèn)題排查和功能優(yōu)化,這篇文章主要介紹了GoLang基于zap日志庫(kù)的封裝過(guò)程,想要詳細(xì)了解可以參考下文2023-05-05

