cloud/bmaas/bmdb: implement BMDB client metrics

This implements some basic BMDB metrics exported by any client code
using the BMDB.

It also enables their use in the Shepherd and BMSRV.

Change-Id: I1d5e82fd2c34a7bfd42f37fad540d69f7b23f347
Reviewed-on: https://review.monogon.dev/c/monogon/+/1600
Tested-by: Jenkins CI
Reviewed-by: Tim Windelschmidt <tim@monogon.tech>
diff --git a/cloud/shepherd/equinix/manager/BUILD.bazel b/cloud/shepherd/equinix/manager/BUILD.bazel
index 72924f3..1e1cb54 100644
--- a/cloud/shepherd/equinix/manager/BUILD.bazel
+++ b/cloud/shepherd/equinix/manager/BUILD.bazel
@@ -17,6 +17,7 @@
     deps = [
         "//cloud/agent/api",
         "//cloud/bmaas/bmdb",
+        "//cloud/bmaas/bmdb/metrics",
         "//cloud/bmaas/bmdb/model",
         "//cloud/lib/sinbin",
         "//cloud/shepherd/equinix/wrapngo",
diff --git a/cloud/shepherd/equinix/manager/control_loop.go b/cloud/shepherd/equinix/manager/control_loop.go
index 4896c15..b30edbc 100644
--- a/cloud/shepherd/equinix/manager/control_loop.go
+++ b/cloud/shepherd/equinix/manager/control_loop.go
@@ -15,6 +15,7 @@
 	"k8s.io/klog/v2"
 
 	"source.monogon.dev/cloud/bmaas/bmdb"
+	"source.monogon.dev/cloud/bmaas/bmdb/metrics"
 	"source.monogon.dev/cloud/bmaas/bmdb/model"
 )
 
@@ -52,6 +53,7 @@
 
 type processInfo struct {
 	process        model.Process
+	processor      metrics.Processor
 	defaultBackoff bmdb.Backoff
 }
 
@@ -165,7 +167,7 @@
 	var sess *bmdb.Session
 	for {
 		if sess == nil {
-			sess, err = conn.StartSession(ctx)
+			sess, err = conn.StartSession(ctx, bmdb.SessionOption{Processor: pinfo.processor})
 			if err != nil {
 				return fmt.Errorf("could not start BMDB session: %w", err)
 			}
diff --git a/cloud/shepherd/equinix/manager/initializer.go b/cloud/shepherd/equinix/manager/initializer.go
index c90f8d8..2f1721b 100644
--- a/cloud/shepherd/equinix/manager/initializer.go
+++ b/cloud/shepherd/equinix/manager/initializer.go
@@ -21,6 +21,7 @@
 
 	apb "source.monogon.dev/cloud/agent/api"
 	"source.monogon.dev/cloud/bmaas/bmdb"
+	"source.monogon.dev/cloud/bmaas/bmdb/metrics"
 	"source.monogon.dev/cloud/bmaas/bmdb/model"
 	ecl "source.monogon.dev/cloud/shepherd/equinix/wrapngo"
 )
@@ -156,6 +157,7 @@
 			Maximum:  4 * time.Hour,
 			Exponent: 1.2,
 		},
+		processor: metrics.ProcessorShepherdInitializer,
 	}
 }
 
diff --git a/cloud/shepherd/equinix/manager/provisioner.go b/cloud/shepherd/equinix/manager/provisioner.go
index c8ce9b4..03dffa6 100644
--- a/cloud/shepherd/equinix/manager/provisioner.go
+++ b/cloud/shepherd/equinix/manager/provisioner.go
@@ -14,6 +14,7 @@
 	"k8s.io/klog/v2"
 
 	"source.monogon.dev/cloud/bmaas/bmdb"
+	"source.monogon.dev/cloud/bmaas/bmdb/metrics"
 	"source.monogon.dev/cloud/bmaas/bmdb/model"
 	"source.monogon.dev/cloud/lib/sinbin"
 	ecl "source.monogon.dev/cloud/shepherd/equinix/wrapngo"
@@ -116,7 +117,7 @@
 	var err error
 	for {
 		if sess == nil {
-			sess, err = conn.StartSession(ctx)
+			sess, err = conn.StartSession(ctx, bmdb.SessionOption{Processor: metrics.ProcessorShepherdProvisioner})
 			if err != nil {
 				return fmt.Errorf("could not start BMDB session: %w", err)
 			}
diff --git a/cloud/shepherd/equinix/manager/recoverer.go b/cloud/shepherd/equinix/manager/recoverer.go
index 85ec440..72b5588 100644
--- a/cloud/shepherd/equinix/manager/recoverer.go
+++ b/cloud/shepherd/equinix/manager/recoverer.go
@@ -9,6 +9,7 @@
 	"k8s.io/klog/v2"
 
 	"source.monogon.dev/cloud/bmaas/bmdb"
+	"source.monogon.dev/cloud/bmaas/bmdb/metrics"
 	"source.monogon.dev/cloud/bmaas/bmdb/model"
 	ecl "source.monogon.dev/cloud/shepherd/equinix/wrapngo"
 )
@@ -49,6 +50,7 @@
 			Maximum:  1 * time.Hour,
 			Exponent: 1.2,
 		},
+		processor: metrics.ProcessorShepherdRecoverer,
 	}
 }
 
diff --git a/cloud/shepherd/equinix/manager/server/main.go b/cloud/shepherd/equinix/manager/server/main.go
index 14b94bc..21e7e5a 100644
--- a/cloud/shepherd/equinix/manager/server/main.go
+++ b/cloud/shepherd/equinix/manager/server/main.go
@@ -59,6 +59,9 @@
 	c.RegisterFlags()
 	flag.Parse()
 
+	registry := c.Component.PrometheusRegistry()
+	c.BMDB.EnableMetrics(registry)
+
 	ctx := clicontext.WithInterrupt(context.Background())
 	c.Component.StartPrometheus(ctx)
 
diff --git a/cloud/shepherd/equinix/manager/updater.go b/cloud/shepherd/equinix/manager/updater.go
index 6c00b97..dd8c6ff 100644
--- a/cloud/shepherd/equinix/manager/updater.go
+++ b/cloud/shepherd/equinix/manager/updater.go
@@ -12,6 +12,7 @@
 	"k8s.io/klog/v2"
 
 	"source.monogon.dev/cloud/bmaas/bmdb"
+	"source.monogon.dev/cloud/bmaas/bmdb/metrics"
 	"source.monogon.dev/cloud/bmaas/bmdb/model"
 	"source.monogon.dev/cloud/lib/sinbin"
 	ecl "source.monogon.dev/cloud/shepherd/equinix/wrapngo"
@@ -57,7 +58,7 @@
 
 	for {
 		if sess == nil {
-			sess, err = conn.StartSession(ctx)
+			sess, err = conn.StartSession(ctx, bmdb.SessionOption{Processor: metrics.ProcessorShepherdUpdater})
 			if err != nil {
 				return fmt.Errorf("could not start BMDB session: %w", err)
 			}