Go語言metrics應(yīng)用監(jiān)控指標(biāo)基本使用說明
metrics 是什么?
當(dāng)我們需要為某個系統(tǒng)某個服務(wù)做監(jiān)控、做統(tǒng)計,就需要用到Metrics
五種 Metrics 類型
Gauges:最簡單的度量指標(biāo),只有一個簡單的返回值,或者叫瞬時狀態(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è)置為打印在標(biāo)準(zhǔn)輸出

接下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 的時候 默認(rèn)的時候數(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)控指標(biāo)基本使用說明的詳細內(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)控指標(biāo)
- web項目中g(shù)olang性能監(jiān)控解析
- Skywalking-go自動監(jiān)控增強使用探究
相關(guān)文章
golang使用bcrypt包對密碼進行加密的方法實現(xiàn)
本文主要介紹了golang使用bcrypt包對密碼進行加密的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Golang中的new()和make()函數(shù)本質(zhì)區(qū)別
在 Go 語言開發(fā)中,new() 和 make() 是兩個容易讓開發(fā)者感到困惑的內(nèi)建函數(shù),盡管它們都用于內(nèi)存分配,但其設(shè)計目的、適用場景和底層實現(xiàn)存在本質(zhì)差異,本文將通過類型系統(tǒng)、內(nèi)存模型和編譯器實現(xiàn)三個維度,深入解析這兩個函數(shù)的本質(zhì)區(qū)別,感興趣的朋友一起看看吧2025-02-02
Go調(diào)度器學(xué)習(xí)之系統(tǒng)調(diào)用詳解
這篇文章腫,將以一個簡單的文件打開的系統(tǒng)調(diào)用,來分析一下Go調(diào)度器在系統(tǒng)調(diào)用時做了什么。文中的示例代碼講解詳細,需要的可以參考一下2023-04-04

