[#137] Refactor unused metrics code

Signed-off-by: Denis Kirillov <denis@nspcc.ru>
This commit is contained in:
Denis Kirillov 2022-03-25 16:12:26 +03:00 committed by Alex Vanin
parent d891c13cb3
commit 9475786df8

View file

@ -1,22 +1,19 @@
package main package main
import ( import (
"fmt"
"github.com/fasthttp/router" "github.com/fasthttp/router"
"github.com/nspcc-dev/neofs-http-gw/response" "github.com/nspcc-dev/neofs-http-gw/response"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/prometheus/common/expfmt" "github.com/prometheus/common/expfmt"
"github.com/valyala/fasthttp" "github.com/valyala/fasthttp"
"go.uber.org/zap" "go.uber.org/zap"
) )
func attachMetrics(r *router.Router, l *zap.Logger) { func attachMetrics(r *router.Router, l *zap.Logger) {
r.GET("/metrics/", metricsHandler(prometheus.DefaultGatherer, l, promhttp.HandlerOpts{})) r.GET("/metrics/", metricsHandler(prometheus.DefaultGatherer, l))
} }
func metricsHandler(reg prometheus.Gatherer, logger *zap.Logger, opts promhttp.HandlerOpts) fasthttp.RequestHandler { func metricsHandler(reg prometheus.Gatherer, logger *zap.Logger) fasthttp.RequestHandler {
var ( var (
inFlightSem chan struct{} inFlightSem chan struct{}
errCnt = prometheus.NewCounterVec( errCnt = prometheus.NewCounterVec(
@ -28,32 +25,13 @@ func metricsHandler(reg prometheus.Gatherer, logger *zap.Logger, opts promhttp.H
) )
) )
if opts.MaxRequestsInFlight > 0 {
inFlightSem = make(chan struct{}, opts.MaxRequestsInFlight)
}
if opts.Registry != nil {
// Initialize all possibilites that can occur below.
errCnt.WithLabelValues("gathering")
errCnt.WithLabelValues("encoding")
if err := opts.Registry.Register(errCnt); err != nil {
if are, ok := err.(prometheus.AlreadyRegisteredError); ok {
errCnt = are.ExistingCollector.(*prometheus.CounterVec)
} else {
panic(err)
}
}
}
h := fasthttp.RequestHandler(func(c *fasthttp.RequestCtx) { h := fasthttp.RequestHandler(func(c *fasthttp.RequestCtx) {
if inFlightSem != nil { if inFlightSem != nil {
select { select {
case inFlightSem <- struct{}{}: // All good, carry on. case inFlightSem <- struct{}{}: // All good, carry on.
defer func() { <-inFlightSem }() defer func() { <-inFlightSem }()
default: default:
response.Error(c, "Limit of concurrent requests reached, try again later.", fasthttp.StatusServiceUnavailable)
response.Error(c, fmt.Sprintf(
"Limit of concurrent requests reached (%d), try again later.", opts.MaxRequestsInFlight,
), fasthttp.StatusServiceUnavailable)
return return
} }
} }
@ -64,20 +42,9 @@ func metricsHandler(reg prometheus.Gatherer, logger *zap.Logger, opts promhttp.H
} }
errCnt.WithLabelValues("gathering").Inc() errCnt.WithLabelValues("gathering").Inc()
switch opts.ErrorHandling {
case promhttp.PanicOnError:
panic(err)
case promhttp.ContinueOnError:
if len(mfs) == 0 {
// Still report the error if no metrics have been gathered.
response.Error(c, err.Error(), fasthttp.StatusServiceUnavailable) response.Error(c, err.Error(), fasthttp.StatusServiceUnavailable)
return return
} }
case promhttp.HTTPErrorOnError:
response.Error(c, err.Error(), fasthttp.StatusServiceUnavailable)
return
}
}
contentType := expfmt.FmtText contentType := expfmt.FmtText
c.SetContentType(string(contentType)) c.SetContentType(string(contentType))
@ -96,16 +63,8 @@ func metricsHandler(reg prometheus.Gatherer, logger *zap.Logger, opts promhttp.H
logger.Error("encoding and sending metric family", zap.Error(err)) logger.Error("encoding and sending metric family", zap.Error(err))
} }
errCnt.WithLabelValues("encoding").Inc() errCnt.WithLabelValues("encoding").Inc()
switch opts.ErrorHandling {
case promhttp.PanicOnError:
panic(err)
case promhttp.HTTPErrorOnError:
response.Error(c, err.Error(), fasthttp.StatusServiceUnavailable) response.Error(c, err.Error(), fasthttp.StatusServiceUnavailable)
return true return true
default:
// Do nothing in all other cases, including ContinueOnError.
return false
}
} }
for _, mf := range mfs { for _, mf := range mfs {
@ -123,12 +82,5 @@ func metricsHandler(reg prometheus.Gatherer, logger *zap.Logger, opts promhttp.H
handleError(lastErr) handleError(lastErr)
}) })
if opts.Timeout <= 0 {
return h return h
} }
return fasthttp.TimeoutHandler(h, opts.Timeout, fmt.Sprintf(
"Exceeded configured timeout of %v.\n",
opts.Timeout,
))
}