prometheus是一個開源的系統(tǒng)監(jiān)控和報警工具,作為新一代的云原生監(jiān)控系統(tǒng),它可以和grafana等開源組件很好的結(jié)合在一起,也為golang提供了對應(yīng)的集成工具
這邊我主要介紹gin框架中如何集成prometheus來實現(xiàn)統(tǒng)計http方法和路徑
一、包依賴
在系統(tǒng)中先安裝好對應(yīng)的prometheus包,如下
go get github.com/gin-gonic/gin
go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promhttp
二、代碼實例
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"net/http"
"time"
)
var (
WebRequestTotal = prometheus.NewCounterVec(prometheus.CounterOpts{
Name: "web_reqeust_total",
Help: "Number of hello requests in total",
}, []string{"method", "path"})
WebRequestDurationHistogram = prometheus.NewHistogramVec(prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "Histogram of the duration of HTTP requests",
Buckets: prometheus.DefBuckets,
}, []string{"method", "path"})
)
func init() {
// 注冊計數(shù)器到 Prometheus
prometheus.MustRegister(WebRequestTotal)
// 注冊直方圖到 Prometheus
prometheus.MustRegister(WebRequestDurationHistogram)
}
func main() {
r := gin.Default() //創(chuàng)建gin
r.Use(func(c *gin.Context) {
start := time.Now()
//處理請求
c.Next()
duration := time.Since(start).Seconds()
//記錄請求次數(shù)
WebRequestTotal.WithLabelValues(c.Request.Method, c.Request.URL.Path).Inc()
//記錄http方法和路徑對應(yīng)的耗時
WebRequestDurationHistogram.WithLabelValues(c.Request.Method, c.Request.URL.Path).Observe(duration)
})
r.GET("/", index) //綁定路由
r.GET("/metrics", gin.WrapH(promhttp.Handler()))
// 定義一個健康檢查的路由
r.GET("/health", func(c *gin.Context) {
c.String(http.StatusOK, "OK")
})
r.POST("/update", func(c *gin.Context) {
c.String(http.StatusOK, "OK")
})
r.Run(":8001") //運行綁定端口
}
func index(c *gin.Context) {
fmt.Println("1111")
c.JSON(200, gin.H{
"message": "go!go!gono!yesyes",
})
}
說明
1、WebRequestTotal這是一個“CounterVec”類型的計數(shù)器,用于統(tǒng)計不同http方法和路徑的請求次數(shù)
2、WebRequestDurationHistogram這是一個“HistogramVe”類型的直方圖,用于記錄不同http方法和路徑的請求持續(xù)時間,使用了“prometheus.DefBucket”提供的默認的桶分布,當然這個也可以自定義
3、采用了中間件
a、使用中間件攔截了請求,當結(jié)束后更新對應(yīng)的計數(shù)器
b、在中間件在請求開始和請求結(jié)束分別記錄了時間,得到請求的耗時,并且記錄到了直方圖中
4、通過訪問http://localhost:8001/metrics來實現(xiàn)對指標的查詢
如下顯示的是不同http方法和路徑的請求次數(shù)
image.png
如下則顯示的是不同http方法和路徑的請求持續(xù)時間,安裝桶進行分布
image.png