Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeger-Jan van de Weg <git@zjvandeweg.nl>2020-02-19 10:41:49 +0300
committerZeger-Jan van de Weg <git@zjvandeweg.nl>2020-02-19 10:41:49 +0300
commitfde7ec76313edd43f55704239b5ad50dac6af663 (patch)
tree9c80eb30426a9ca36c7481e0caec933d33d9145a
parent9ded83a849c8a84a43624701ce4537021deb6706 (diff)
parent120effe85ff78b5d92652aa54ed97cd01b3a95cb (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.go21
-rw-r--r--internal/praefect/middleware/methodtype.go51
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()
+}