metropolis/node/core/metrics: implement http_sd discovery endpoint

We provide prometheus metrics but dont have a way to discover all nodes,
this change implements a new http endpoint: /discovery. It implements the
http_sd api and returns all current cluster nodes including their roles as
label.

Change-Id: I931a88e2afb285482d122dd059c96f9ebfab4052
Reviewed-on: https://review.monogon.dev/c/monogon/+/1934
Tested-by: Jenkins CI
Reviewed-by: Serge Bazanski <serge@monogon.tech>
diff --git a/metropolis/node/core/roleserve/roleserve.go b/metropolis/node/core/roleserve/roleserve.go
index ddc5811..02bc510 100644
--- a/metropolis/node/core/roleserve/roleserve.go
+++ b/metropolis/node/core/roleserve/roleserve.go
@@ -167,6 +167,7 @@
 
 	s.metrics = &workerMetrics{
 		curatorConnection: &s.CuratorConnection,
+		localRoles:        &s.localRoles,
 	}
 
 	return s
diff --git a/metropolis/node/core/roleserve/worker_metrics.go b/metropolis/node/core/roleserve/worker_metrics.go
index 78c62d6..a9add88 100644
--- a/metropolis/node/core/roleserve/worker_metrics.go
+++ b/metropolis/node/core/roleserve/worker_metrics.go
@@ -3,9 +3,13 @@
 import (
 	"context"
 
+	cpb "source.monogon.dev/metropolis/proto/common"
+
 	"source.monogon.dev/metropolis/node/core/metrics"
 	"source.monogon.dev/metropolis/pkg/event/memory"
 	"source.monogon.dev/metropolis/pkg/supervisor"
+
+	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 )
 
 // workerMetrics runs the Metrics Service, which runs local Prometheus collectors
@@ -14,6 +18,7 @@
 // over HTTPS using the Cluster CA.
 type workerMetrics struct {
 	curatorConnection *memory.Value[*curatorConnection]
+	localRoles        *memory.Value[*cpb.NodeRoles]
 }
 
 func (s *workerMetrics) run(ctx context.Context) error {
@@ -29,6 +34,8 @@
 
 	svc := metrics.Service{
 		Credentials: cc.credentials,
+		Curator:     ipb.NewCuratorClient(cc.conn),
+		LocalRoles:  s.localRoles,
 	}
 	return svc.Run(ctx)
 }