Prometheus Go client library使用方式詳解
介紹
Prometheus 支持 4 種 指標(biāo)類型,分別是 Counter、Gauge、Histogram 和 Summary。
Counter 指標(biāo)類型,指標(biāo)值是只能遞增,不能遞減的數(shù)值。需要注意的是,當(dāng) Prometheus server 重啟時(shí),指標(biāo)值會(huì)被重置為 0。該指標(biāo)類型可用于統(tǒng)計(jì)接口的請(qǐng)求數(shù)、錯(cuò)誤數(shù)等使用場(chǎng)景。
Gauge 指標(biāo)類型,指標(biāo)值是可增可減的數(shù)值。該指標(biāo)類型可用于統(tǒng)計(jì) CPU、內(nèi)存和硬盤(pán)的使用情況,goroutine 的數(shù)量等使用場(chǎng)景。
Histogram 指標(biāo)類型,指標(biāo)值基于桶分布。開(kāi)發(fā)者可以自定義桶的區(qū)間。該指標(biāo)類型可用于統(tǒng)計(jì)接口的延時(shí)請(qǐng)求數(shù)等使用場(chǎng)景。
Summary 指標(biāo)類型,與 Histogram 類似,區(qū)別是 Histogram 直接統(tǒng)計(jì)了不同區(qū)間中的指標(biāo)數(shù)值,而 Summary 是基于客戶端級(jí)別,因此不能統(tǒng)計(jì)多個(gè)實(shí)例的聚合數(shù)據(jù)。該指標(biāo)類型可用于預(yù)先不知道指標(biāo)桶劃分區(qū)間的場(chǎng)景。
使用方式
一般在實(shí)際應(yīng)用場(chǎng)景中,通常一個(gè)指標(biāo)需要對(duì)應(yīng)多條時(shí)序數(shù)據(jù)(Label Name 為維度),此時(shí)就需要使用支持標(biāo)簽的指標(biāo)類型。
Prometheus 有 4 種支持標(biāo)簽的指標(biāo)類型,分別是 ConterVec、GaugeVec、HistogramVec、SummaryVec。
CounterVec
CounterVec 與 Counter 的區(qū)別是,它支持 Label,我們可以按照 Lable 維度,將同一個(gè)指標(biāo)的數(shù)據(jù)按照 Lable 分組統(tǒng)計(jì)。例如,同一個(gè) Api 接口的請(qǐng)求數(shù),我們可以定義 Lable (Code、Method),按照狀態(tài)碼和 HTTP 請(qǐng)求方式,分組統(tǒng)計(jì)同一個(gè) Api 接口的請(qǐng)求數(shù)。
示例代碼:
var ( // 標(biāo)簽名 labelNames = []string{"host", "code", "path", "method"} // HttpReqs 實(shí)例化 CounterVec HttpReqs *prometheus.CounterVec = prometheus.NewCounterVec(prometheus.CounterOpts{ Name: "http_requests_total", Help: "How many HTTP requests processed, partitioned by status code and HTTP method.", }, labelNames, ) )
閱讀上面這段代碼,我們使用 NewCounterVec
創(chuàng)建一個(gè)實(shí)例,它支持多個(gè)方法,我們可以使用其中一個(gè)性能相對(duì)較高的方法 WithLabelValues
,返回一個(gè) Counter
。
示例代碼:
func Metrics() gin.HandlerFunc { return func(c *gin.Context) { c.Next() host := c.RemoteIP() code := fmt.Sprintf("%d", c.Writer.Status()) method := c.Request.Method labelsByHttpReqs := []string{host, code, c.FullPath(), method} prometheus_metrics.HttpReqs.WithLabelValues(labelsByHttpReqs...).Inc() } }
Counter
支持兩個(gè)方法,分別是 Inc()
和 Add()
,其中 Inc()
將 Counter
增加 1,Add()
將 Counter
增加給定值,需要注意的是,給定值必須為非負(fù)值,否則會(huì)引發(fā) panic。
需要注意的是,在我們創(chuàng)建指標(biāo)之后,還需要使用 Register()
接口的 Register()
方法,注冊(cè)之后才可以被收集到指標(biāo)數(shù)據(jù)。如果需要注冊(cè)多個(gè)指標(biāo),可以使用 MustRegister()
方法。
示例代碼:
reg := prometheus.NewRegistry() reg.MustRegister(prometheus_metrics.HttpReqs, prometheus_metrics.OpsQueued, prometheus_metrics.Latencies, prometheus_metrics.Temps)
GaugeVec
GaugeVec 與 Gauge 的區(qū)別是,它支持 Label,我們可以按照 Lable 維度,將同一個(gè)指標(biāo)的數(shù)據(jù)按照 Lable 分組統(tǒng)計(jì)。
示例代碼:
var ( labelNamesByOpsQueued = []string{ "user", "type", } OpsQueued = prometheus.NewGaugeVec( prometheus.GaugeOpts{ Name: "ops_queued", Help: "Number of blob storage operations waiting to be processed, partitioned by user and type.", }, labelNamesByOpsQueued, ) )
閱讀上面這段代碼,我們使用 NewGaugeVec
創(chuàng)建實(shí)例。
HistogramVec
HistogramVec 與 Histogram 的區(qū)別是,它支持 Label,我們可以按照 Lable 維度,將同一個(gè)指標(biāo)的數(shù)據(jù)按照 Lable 分組統(tǒng)計(jì)。
示例代碼:
var ( labelNamesByLatencies = []string{"method", "code"} Latencies = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "Tracks the latencies for HTTP requests.", Buckets: []float64{0.99, 0.9, 0.5}, }, labelNamesByLatencies, ) )
SummaryVec
SummaryVec 與 Summary 的區(qū)別是,它支持 Label,我們可以按照 Lable 維度,將同一個(gè)指標(biāo)的數(shù)據(jù)按照 Lable 分組統(tǒng)計(jì)。
示例代碼:
var ( labelNamesByTemps = []string{"species"} Temps = prometheus.NewSummaryVec( prometheus.SummaryOpts{ Name: "pond_temperature_celsius", Help: "The temperature of the frog pond.", Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, }, labelNamesByTemps, ) )
閱讀上面這段代碼,使用 NewSummaryVec
創(chuàng)建實(shí)例。
總結(jié)
本文我們主要介紹 4 種指標(biāo)類型的含義,通過(guò) Label 可以將 4 種類型的指標(biāo)數(shù)據(jù),按照 Label 的維度分組統(tǒng)計(jì),我們以支持 Label 的 CounterVec
為例,介紹了它的使用方式,其余 3 種支持 Label 的指標(biāo)也提供了簡(jiǎn)單的使用示例。
感興趣的讀者朋友們可以通過(guò)閱讀源碼,了解更多關(guān)于其它 3 種支持 Label 的指標(biāo)。
更多關(guān)于Prometheus Go client library的資料請(qǐng)也可以關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go語(yǔ)言yaml轉(zhuǎn)map、map遍歷的實(shí)現(xiàn)
本文主要介紹了go語(yǔ)言yaml轉(zhuǎn)map、map遍歷的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09???????Golang實(shí)現(xiàn)RabbitMQ中死信隊(duì)列幾種情況
本文主要介紹了???????Golang實(shí)現(xiàn)RabbitMQ中死信隊(duì)列幾種情況,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Go語(yǔ)言實(shí)現(xiàn)冒泡排序、選擇排序、快速排序及插入排序的方法
這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)冒泡排序、選擇排序、快速排序及插入排序的方法,以實(shí)例形式詳細(xì)分析了幾種常見(jiàn)的排序技巧與實(shí)現(xiàn)方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02Golang設(shè)計(jì)模式之責(zé)任鏈模式講解和代碼示例
責(zé)任鏈?zhǔn)且环N行為設(shè)計(jì)模式, 允許你將請(qǐng)求沿著處理者鏈進(jìn)行發(fā)送, 直至其中一個(gè)處理者對(duì)其進(jìn)行處理,本文就詳細(xì)給大家介紹一下Golang 責(zé)任鏈模式,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-06-06Go語(yǔ)言中程序是怎么編譯的實(shí)現(xiàn)
本文主要介紹了Go語(yǔ)言中程序是怎么編譯的實(shí)現(xiàn),深入探討Go語(yǔ)言的編譯機(jī)制和最新的模塊管理系統(tǒng)Go Modules的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06golang中package?is?not?in?GOROOT報(bào)錯(cuò)的真正解決辦法
這篇文章主要給大家介紹了關(guān)于golang中package?is?not?in?GOROOT報(bào)錯(cuò)的真正解決辦法,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)同樣遇到這個(gè)問(wèn)題的朋友具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03