woj-server/internal/web/metrics/prometheus.go

86 lines
2.0 KiB
Go
Raw Normal View History

2022-09-07 23:34:37 +08:00
package metrics
import (
2023-07-14 21:47:11 +08:00
"git.0x7f.app/WOJ/woj-server/internal/e"
2023-07-15 16:19:49 +08:00
"git.0x7f.app/WOJ/woj-server/internal/misc/config"
2023-07-14 21:47:11 +08:00
"git.0x7f.app/WOJ/woj-server/internal/pkg/cast"
2023-07-15 16:19:49 +08:00
"github.com/gin-gonic/gin"
2022-09-07 23:34:37 +08:00
"github.com/prometheus/client_golang/prometheus"
2023-07-15 16:19:49 +08:00
"github.com/samber/do"
2022-09-07 23:34:37 +08:00
)
2023-07-15 16:19:49 +08:00
var _ Service = (*service)(nil)
type Service interface {
Record(method, url string, success bool, httpCode int, errCode e.Status, elapsed float64)
SetLogPaths(paths []string)
Handler() gin.HandlerFunc
HealthCheck() error
}
func NewService(i *do.Injector) (Service, error) {
srv := &service{}
conf := do.MustInvoke[config.Service](i).GetConfig()
srv.setup(conf.Metrics.Namespace, conf.Metrics.Subsystem)
return srv, nil
}
type service struct {
2022-09-07 23:34:37 +08:00
namespace string
subsystem string
counter *prometheus.CounterVec
hist *prometheus.HistogramVec
logPaths []string
}
2023-07-15 16:19:49 +08:00
func (s *service) HealthCheck() error {
return nil
}
func (s *service) setup(namespace string, subsystem string) {
s.namespace = namespace
s.subsystem = subsystem
2022-09-07 23:34:37 +08:00
2023-07-15 16:19:49 +08:00
s.counter = prometheus.NewCounterVec(
2022-09-07 23:34:37 +08:00
prometheus.CounterOpts{
Namespace: namespace,
Subsystem: subsystem,
Name: "requests_total",
Help: "Total number of requests",
},
[]string{"method", "url"},
)
2023-07-15 16:19:49 +08:00
s.hist = prometheus.NewHistogramVec(
2022-09-07 23:34:37 +08:00
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"},
)
2023-07-15 16:19:49 +08:00
prometheus.MustRegister(s.counter, s.hist)
2022-09-07 23:34:37 +08:00
}
2023-07-15 16:19:49 +08:00
func (s *service) Record(method, url string, success bool, httpCode int, errCode e.Status, elapsed float64) {
s.counter.With(prometheus.Labels{
2022-09-07 23:34:37 +08:00
"method": method,
"url": url,
}).Inc()
2023-07-15 16:19:49 +08:00
s.hist.With(prometheus.Labels{
2022-09-07 23:34:37 +08:00
"method": method,
"url": url,
"success": cast.ToString(success),
"http_code": cast.ToString(httpCode),
"err_code": cast.ToString(errCode),
}).Observe(elapsed)
}