diff options
author | Zeger-Jan van de Weg <git@zjvandeweg.nl> | 2020-02-19 10:41:49 +0300 |
---|---|---|
committer | Zeger-Jan van de Weg <git@zjvandeweg.nl> | 2020-02-19 10:41:49 +0300 |
commit | fde7ec76313edd43f55704239b5ad50dac6af663 (patch) | |
tree | 9c80eb30426a9ca36c7481e0caec933d33d9145a | |
parent | 9ded83a849c8a84a43624701ce4537021deb6706 (diff) | |
parent | 120effe85ff78b5d92652aa54ed97cd01b3a95cb (diff) |
Merge branch 'jc-add-praefect-optype-metric' into 'master'
Add praefect prometheus metric for method types
See merge request gitlab-org/gitaly!1835
-rw-r--r-- | internal/praefect/metrics/prometheus.go | 21 | ||||
-rw-r--r-- | internal/praefect/middleware/methodtype.go | 51 |
2 files changed, 72 insertions, 0 deletions
diff --git a/internal/praefect/metrics/prometheus.go b/internal/praefect/metrics/prometheus.go index fb53fe277..2a8981750 100644 --- a/internal/praefect/metrics/prometheus.go +++ b/internal/praefect/metrics/prometheus.go @@ -33,6 +33,27 @@ func RegisterReplicationJobsInFlight() (Gauge, error) { return replicationJobsInFlight, prometheus.Register(replicationJobsInFlight) } +var MethodTypeCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: "gitaly", + Subsystem: "praefect", + Name: "method_types", + }, []string{"method_type"}, +) + +var PrimaryGauge = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "gitaly", + Subsystem: "praefect", + Name: "primaries", + }, []string{"storage"}, +) + +func init() { + prometheus.MustRegister(MethodTypeCounter) + prometheus.MustRegister(PrimaryGauge) +} + // Gauge is a subset of a prometheus Gauge type Gauge interface { Inc() diff --git a/internal/praefect/middleware/methodtype.go b/internal/praefect/middleware/methodtype.go new file mode 100644 index 000000000..6143ff7ba --- /dev/null +++ b/internal/praefect/middleware/methodtype.go @@ -0,0 +1,51 @@ +package middleware + +import ( + "context" + + "github.com/sirupsen/logrus" + "gitlab.com/gitlab-org/gitaly/internal/praefect/metrics" + "gitlab.com/gitlab-org/gitaly/internal/praefect/protoregistry" + "google.golang.org/grpc" +) + +// MethodTypeUnaryInterceptor returns a Unary Interceptor that records the method type of incoming RPC requests +func MethodTypeUnaryInterceptor(r *protoregistry.Registry) grpc.UnaryServerInterceptor { + return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + observeMethodType(r, info.FullMethod) + + res, err := handler(ctx, req) + + return res, err + } +} + +// MethodTypeStreamInterceptor returns a Stream Interceptor that records the method type of incoming RPC requests +func MethodTypeStreamInterceptor(r *protoregistry.Registry) grpc.StreamServerInterceptor { + return func(srv interface{}, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { + observeMethodType(r, info.FullMethod) + + err := handler(srv, stream) + + return err + } +} + +func observeMethodType(registry *protoregistry.Registry, fullMethod string) { + mi, err := registry.LookupMethod(fullMethod) + if err != nil { + logrus.WithField("full_method_name", fullMethod).WithError(err).Warn("error when looking up method info") + } + + var opType string + switch mi.Operation { + case protoregistry.OpAccessor: + opType = "accessor" + case protoregistry.OpMutator: + opType = "mutator" + default: + return + } + + metrics.MethodTypeCounter.WithLabelValues(opType).Inc() +} |