mycommon/mymetric/prometheus.go

112 lines
2.2 KiB
Go

package mymetric
import (
"github.com/gin-gonic/gin"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"log"
"net/http"
"time"
)
type (
HistogramVec struct {
*prometheus.HistogramVec
Labels []string
}
CounterVec struct {
*prometheus.CounterVec
Labels []string
}
)
func NewQPSHistogram(name string, labels ...string) *HistogramVec {
name = HistogramKey(name)
v := prometheus.NewHistogramVec(prometheus.HistogramOpts{
Name: name,
Buckets: []float64{5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 95, 100, 200, 300, 500, 600, 700, 800, 900, 1000, 1500, 2000, 5000}, // 统计区间 单位毫秒
}, labels)
wrapMetric := &HistogramVec{
HistogramVec: v,
Labels: labels,
}
RegisterPrometheus(wrapMetric)
return wrapMetric
}
func NewHistogram(name string, buckets []float64, labels ...string) *HistogramVec {
name = HistogramKey(name)
v := prometheus.NewHistogramVec(prometheus.HistogramOpts{
Name: name,
Buckets: buckets,
}, labels)
wrapMetric := &HistogramVec{
HistogramVec: v,
Labels: labels,
}
RegisterPrometheus(wrapMetric)
return wrapMetric
}
func NewCounter(name string, labels ...string) *CounterVec {
name = CounterKey(name)
v := prometheus.NewCounterVec(prometheus.CounterOpts{
Name: name,
}, labels)
wrapMetric := &CounterVec{
CounterVec: v,
Labels: labels,
}
RegisterPrometheus(wrapMetric)
return wrapMetric
}
const (
MetricsRoute = "/metrics"
)
// 监控指标路由
func GinExport(authKey string) gin.HandlerFunc {
pm := promhttp.HandlerFor(
prometheus.DefaultGatherer,
promhttp.HandlerOpts{Timeout: time.Second * 3},
)
return func(ctx *gin.Context) {
if authKey != "" {
value := ctx.Query("key")
if authKey != value {
ctx.String(http.StatusForbidden, "metric auth key is empty")
return
}
}
pm.ServeHTTP(ctx.Writer, ctx.Request)
}
}
func HistogramKey(name string) string {
return name + "_h"
}
func CounterKey(name string) string {
return name + "_c"
}
func RegisterPrometheus(c prometheus.Collector) {
err := prometheus.Register(c)
if err != nil {
log.Printf("register err: %s", err)
}
}