112 lines
2.2 KiB
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)
|
|
}
|
|
|
|
}
|