From ad2fa9df0ca7584395c526f8a75d0fae09dfe77c Mon Sep 17 00:00:00 2001 From: Brad Davidson Date: Thu, 28 May 2026 06:40:17 +0000 Subject: [PATCH] Fix kine metrics registration Signed-off-by: Brad Davidson --- pkg/cli/server/server.go | 3 +++ pkg/cluster/cluster.go | 14 ++++++++++---- tests/unit.go | 4 ++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/pkg/cli/server/server.go b/pkg/cli/server/server.go index b6e3257b328..5596a9c25f1 100644 --- a/pkg/cli/server/server.go +++ b/pkg/cli/server/server.go @@ -84,6 +84,9 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont // If exiting due to an error, ensure that contexts are cancelled so that the // WaitGroup exits. Otherwise, wait for something else to initiate shutdown. defer func() { + if r := recover(); r != nil { + rerr = fmt.Errorf("server panicked: %v", r) + } if rerr != nil { // do not need to pass the error in here, it will be reported by the CLI error handler signals.RequestShutdown(nil) diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index bcecb861560..819b30beb88 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -182,11 +182,17 @@ func (c *Cluster) startStorage(ctx context.Context, bootstrap bool) error { }() c.storageRunning = true - if !bootstrap { - // only register metrics when not bootstrapping, to prevent - // multiple datastore metrics from being registered. + if !c.config.KineTLS { + // if TLS is not enabled for kine, storage will only be started once, + // so go ahead and register metrics now c.config.Datastore.MetricsRegisterer = metrics.DefaultRegisterer - // set the tls config for the kine storage + } + + if !bootstrap { + // only register metrics after boostrapping is done, to prevent + // multiple datastore metrics from being registered + c.config.Datastore.MetricsRegisterer = metrics.DefaultRegisterer + // set the tls config for the kine storage, once bootstrapped c.config.Datastore.ServerTLSConfig.CAFile = c.config.Runtime.ETCDServerCA c.config.Datastore.ServerTLSConfig.CertFile = c.config.Runtime.ServerETCDCert c.config.Datastore.ServerTLSConfig.KeyFile = c.config.Runtime.ServerETCDKey diff --git a/tests/unit.go b/tests/unit.go index d385815ccc6..949aae6fb52 100644 --- a/tests/unit.go +++ b/tests/unit.go @@ -7,6 +7,8 @@ import ( "github.com/k3s-io/k3s/pkg/daemons/config" "github.com/k3s-io/k3s/pkg/daemons/control/deps" + "github.com/k3s-io/k3s/pkg/metrics" + "github.com/prometheus/client_golang/prometheus" ) // GenerateDataDir creates a temporary directory at "/tmp/k3s//". @@ -43,6 +45,8 @@ func CleanupDataDir(cnf *config.Control) { // GenerateRuntime creates a temporary data dir and configures // config.ControlRuntime with all the appropriate certificate keys. func GenerateRuntime(cnf *config.Control) error { + // reset metrics registerer to avoid panicing if test cover metrics registration + metrics.DefaultRegisterer = prometheus.NewRegistry() // reuse ready channel from existing runtime if set cnf.Runtime = config.NewRuntime() if err := GenerateDataDir(cnf); err != nil {