2022-09-07 23:34:37 +08:00
|
|
|
package metrics
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/WHUPRJ/woj-server/internal/e"
|
|
|
|
"github.com/WHUPRJ/woj-server/internal/pkg/cast"
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Metrics struct {
|
|
|
|
namespace string
|
|
|
|
subsystem string
|
|
|
|
|
|
|
|
counter *prometheus.CounterVec
|
|
|
|
hist *prometheus.HistogramVec
|
|
|
|
|
|
|
|
logPaths []string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *Metrics) Setup(namespace string, subsystem string) {
|
|
|
|
m.namespace = namespace
|
|
|
|
m.subsystem = subsystem
|
|
|
|
|
|
|
|
m.counter = prometheus.NewCounterVec(
|
|
|
|
prometheus.CounterOpts{
|
|
|
|
Namespace: namespace,
|
|
|
|
Subsystem: subsystem,
|
|
|
|
Name: "requests_total",
|
|
|
|
Help: "Total number of requests",
|
|
|
|
},
|
|
|
|
[]string{"method", "url"},
|
|
|
|
)
|
|
|
|
|
|
|
|
m.hist = prometheus.NewHistogramVec(
|
|
|
|
prometheus.HistogramOpts{
|
|
|
|
Namespace: namespace,
|
|
|
|
Subsystem: subsystem,
|
|
|
|
Name: "requests_details",
|
|
|
|
Help: "Details of each request",
|
|
|
|
Buckets: []float64{0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, 25, 50, 100, 250, 500, 1000},
|
|
|
|
},
|
|
|
|
[]string{"method", "url", "success", "http_code", "err_code"},
|
|
|
|
)
|
|
|
|
|
|
|
|
prometheus.MustRegister(m.counter, m.hist)
|
|
|
|
}
|
|
|
|
|
2022-09-20 14:15:21 +08:00
|
|
|
func (m *Metrics) Record(method, url string, success bool, httpCode int, errCode e.Status, elapsed float64) {
|
2022-09-07 23:34:37 +08:00
|
|
|
m.counter.With(prometheus.Labels{
|
|
|
|
"method": method,
|
|
|
|
"url": url,
|
|
|
|
}).Inc()
|
|
|
|
|
|
|
|
m.hist.With(prometheus.Labels{
|
|
|
|
"method": method,
|
|
|
|
"url": url,
|
|
|
|
"success": cast.ToString(success),
|
|
|
|
"http_code": cast.ToString(httpCode),
|
|
|
|
"err_code": cast.ToString(errCode),
|
|
|
|
}).Observe(elapsed)
|
|
|
|
}
|