rpcsrv: provide Prometheus histograms for calls

They're a bit more useful and they're naturally grouped under rpc
prefix. Simple counters will be removed eventually to avoid duplication.
This commit is contained in:
Roman Khimov 2022-11-09 13:26:45 +03:00
parent 57ec67b375
commit d0b1015b2c
2 changed files with 22 additions and 4 deletions

View file

@ -2,14 +2,23 @@ package rpcsrv
import ( import (
"fmt" "fmt"
"strings"
"time"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
// Metrics used in monitoring service. // Metrics used in monitoring service.
var rpcCounter = map[string]prometheus.Counter{} var (
rpcCounter = map[string]prometheus.Counter{}
rpcTimes = map[string]prometheus.Histogram{}
)
func incCounter(name string) { func addReqTimeMetric(name string, t time.Duration) {
hist, ok := rpcTimes[name]
if ok {
hist.Observe(t.Seconds())
}
ctr, ok := rpcCounter[name] ctr, ok := rpcCounter[name]
if ok { if ok {
ctr.Inc() ctr.Inc()
@ -19,13 +28,21 @@ func incCounter(name string) {
func regCounter(call string) { func regCounter(call string) {
ctr := prometheus.NewCounter( ctr := prometheus.NewCounter(
prometheus.CounterOpts{ prometheus.CounterOpts{
Help: fmt.Sprintf("Number of calls to %s rpc endpoint", call), Help: fmt.Sprintf("Number of calls to %s rpc endpoint (obsolete, to be removed)", call),
Name: fmt.Sprintf("%s_called", call), Name: fmt.Sprintf("%s_called", call),
Namespace: "neogo", Namespace: "neogo",
}, },
) )
prometheus.MustRegister(ctr) prometheus.MustRegister(ctr)
rpcCounter[call] = ctr rpcCounter[call] = ctr
rpcTimes[call] = prometheus.NewHistogram(
prometheus.HistogramOpts{
Help: "RPC " + call + " call handling time",
Name: "rpc_" + strings.ToLower(call) + "_time",
Namespace: "neogo",
},
)
prometheus.MustRegister(rpcTimes[call])
} }
func init() { func init() {

View file

@ -501,7 +501,8 @@ func (s *Server) handleIn(req *params.In, sub *subscriber) abstract {
zap.String("method", req.Method), zap.String("method", req.Method),
zap.Stringer("params", reqParams)) zap.Stringer("params", reqParams))
incCounter(req.Method) start := time.Now()
defer func() { addReqTimeMetric(req.Method, time.Since(start)) }()
resErr = neorpc.NewMethodNotFoundError(fmt.Sprintf("method %q not supported", req.Method)) resErr = neorpc.NewMethodNotFoundError(fmt.Sprintf("method %q not supported", req.Method))
handler, ok := rpcHandlers[req.Method] handler, ok := rpcHandlers[req.Method]