From debb78167ba4f77efc185064ece43b7d78aee657 Mon Sep 17 00:00:00 2001 From: chahatsagarmain Date: Sat, 7 Dec 2024 05:02:08 +0530 Subject: [PATCH 1/9] otel helper Signed-off-by: chahatsagarmain --- cmd/internal/flags/admin.go | 24 +++++++++--------------- cmd/internal/flags/admin_test.go | 4 ++-- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/cmd/internal/flags/admin.go b/cmd/internal/flags/admin.go index e868eff7f3b..535943f3974 100644 --- a/cmd/internal/flags/admin.go +++ b/cmd/internal/flags/admin.go @@ -9,7 +9,6 @@ import ( "errors" "flag" "fmt" - "io" "net" "net/http" "net/http/pprof" @@ -35,13 +34,12 @@ var tlsAdminHTTPFlagsConfig = tlscfg.ServerFlagsConfig{ // AdminServer runs an HTTP server with admin endpoints, such as healthcheck at /, /metrics, etc. type AdminServer struct { - logger *zap.Logger - adminHostPort string - hc *healthcheck.HealthCheck - mux *http.ServeMux - server *http.Server - tlsCfg *tls.Config - tlsCertWatcherCloser io.Closer + logger *zap.Logger + adminHostPort string + hc *healthcheck.HealthCheck + mux *http.ServeMux + server *http.Server + tlsCfg *tls.Config } // NewAdminServer creates a new admin server. @@ -76,20 +74,17 @@ func (s *AdminServer) initFromViper(v *viper.Viper, logger *zap.Logger) error { s.setLogger(logger) s.adminHostPort = v.GetString(adminHTTPHostPort) - var tlsAdminHTTP tlscfg.Options tlsAdminHTTP, err := tlsAdminHTTPFlagsConfig.InitFromViper(v) + tlsAdminHTTPConfig := tlsAdminHTTP.ToOtelServerConfig() if err != nil { return fmt.Errorf("failed to parse admin server TLS options: %w", err) } - if tlsAdminHTTP.Enabled { - tlsCfg, err := tlsAdminHTTP.Config(s.logger) // This checks if the certificates are correctly provided + if tlsAdminHTTPConfig != nil { + tlsCfg, err := tlsAdminHTTPConfig.LoadTLSConfig(context.Background()) // This checks if the certificates are correctly provided if err != nil { return err } s.tlsCfg = tlsCfg - s.tlsCertWatcherCloser = &tlsAdminHTTP - } else { - s.tlsCertWatcherCloser = io.NopCloser(nil) } return nil } @@ -160,7 +155,6 @@ func (s *AdminServer) registerPprofHandlers() { // Close stops the HTTP server func (s *AdminServer) Close() error { return errors.Join( - s.tlsCertWatcherCloser.Close(), s.server.Shutdown(context.Background()), ) } diff --git a/cmd/internal/flags/admin_test.go b/cmd/internal/flags/admin_test.go index 74eaaf525fe..f892974d5e5 100644 --- a/cmd/internal/flags/admin_test.go +++ b/cmd/internal/flags/admin_test.go @@ -4,6 +4,7 @@ package flags import ( + "context" "crypto/tls" "fmt" "net" @@ -133,9 +134,8 @@ func TestAdminServerTLS(t *testing.T) { adminServer.Serve() defer adminServer.Close() - clientTLSCfg, err0 := test.clientTLS.Config(zap.NewNop()) + clientTLSCfg, err0 := test.clientTLS.ToOtelClientConfig().LoadTLSConfig(context.Background()) require.NoError(t, err0) - defer test.clientTLS.Close() dialer := &net.Dialer{Timeout: 2 * time.Second} conn, clientError := tls.DialWithDialer(dialer, "tcp", fmt.Sprintf("localhost:%d", ports.CollectorAdminHTTP), clientTLSCfg) require.NoError(t, clientError) From ab9bfe744e9bd878befbb9a6a18cf85f33d9d1c2 Mon Sep 17 00:00:00 2001 From: chahatsagarmain Date: Sat, 7 Dec 2024 16:54:25 +0530 Subject: [PATCH 2/9] using server config Signed-off-by: chahatsagarmain --- cmd/internal/flags/admin.go | 46 +++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/cmd/internal/flags/admin.go b/cmd/internal/flags/admin.go index 535943f3974..e267cf2f337 100644 --- a/cmd/internal/flags/admin.go +++ b/cmd/internal/flags/admin.go @@ -5,7 +5,6 @@ package flags import ( "context" - "crypto/tls" "errors" "flag" "fmt" @@ -15,6 +14,7 @@ import ( "time" "github.com/spf13/viper" + "go.opentelemetry.io/collector/config/confighttp" "go.uber.org/zap" "go.uber.org/zap/zapcore" @@ -34,21 +34,22 @@ var tlsAdminHTTPFlagsConfig = tlscfg.ServerFlagsConfig{ // AdminServer runs an HTTP server with admin endpoints, such as healthcheck at /, /metrics, etc. type AdminServer struct { - logger *zap.Logger - adminHostPort string - hc *healthcheck.HealthCheck - mux *http.ServeMux - server *http.Server - tlsCfg *tls.Config + logger *zap.Logger + hc *healthcheck.HealthCheck + mux *http.ServeMux + server *http.Server + serverCfg *confighttp.ServerConfig } // NewAdminServer creates a new admin server. func NewAdminServer(hostPort string) *AdminServer { return &AdminServer{ - adminHostPort: hostPort, - logger: zap.NewNop(), - hc: healthcheck.New(), - mux: http.NewServeMux(), + logger: zap.NewNop(), + hc: healthcheck.New(), + mux: http.NewServeMux(), + serverCfg: &confighttp.ServerConfig{ + Endpoint: hostPort, + }, } } @@ -65,7 +66,7 @@ func (s *AdminServer) setLogger(logger *zap.Logger) { // AddFlags registers CLI flags. func (s *AdminServer) AddFlags(flagSet *flag.FlagSet) { - flagSet.String(adminHTTPHostPort, s.adminHostPort, fmt.Sprintf("The host:port (e.g. 127.0.0.1%s or %s) for the admin server, including health check, /metrics, etc.", s.adminHostPort, s.adminHostPort)) + flagSet.String(adminHTTPHostPort, s.serverCfg.Endpoint, fmt.Sprintf("The host:port (e.g. 127.0.0.1%s or %s) for the admin server, including health check, /metrics, etc.", s.serverCfg.Endpoint, s.serverCfg.Endpoint)) tlsAdminHTTPFlagsConfig.AddFlags(flagSet) } @@ -73,18 +74,18 @@ func (s *AdminServer) AddFlags(flagSet *flag.FlagSet) { func (s *AdminServer) initFromViper(v *viper.Viper, logger *zap.Logger) error { s.setLogger(logger) - s.adminHostPort = v.GetString(adminHTTPHostPort) + s.serverCfg.Endpoint = v.GetString(adminHTTPHostPort) tlsAdminHTTP, err := tlsAdminHTTPFlagsConfig.InitFromViper(v) tlsAdminHTTPConfig := tlsAdminHTTP.ToOtelServerConfig() if err != nil { return fmt.Errorf("failed to parse admin server TLS options: %w", err) } if tlsAdminHTTPConfig != nil { - tlsCfg, err := tlsAdminHTTPConfig.LoadTLSConfig(context.Background()) // This checks if the certificates are correctly provided + s.serverCfg.TLSSetting = tlsAdminHTTPConfig + _, err = s.serverCfg.TLSSetting.LoadTLSConfig(context.Background()) if err != nil { return err } - s.tlsCfg = tlsCfg } return nil } @@ -96,7 +97,7 @@ func (s *AdminServer) Handle(path string, handler http.Handler) { // Serve starts HTTP server. func (s *AdminServer) Serve() error { - l, err := net.Listen("tcp", s.adminHostPort) + l, err := net.Listen("tcp", s.serverCfg.Endpoint) if err != nil { s.logger.Error("Admin server failed to listen", zap.Error(err)) return err @@ -122,13 +123,18 @@ func (s *AdminServer) serveWithListener(l net.Listener) { ErrorLog: errorLog, ReadHeaderTimeout: 2 * time.Second, } - if s.tlsCfg != nil { - s.server.TLSConfig = s.tlsCfg + if s.serverCfg.TLSSetting != nil { + tlsConfig, err := s.serverCfg.TLSSetting.LoadTLSConfig(context.Background()) + if err != nil { + s.logger.Error("failed to load tls config", zap.Error(err)) + s.hc.Set(healthcheck.Broken) + } + s.server.TLSConfig = tlsConfig } - s.logger.Info("Starting admin HTTP server", zap.String("http-addr", s.adminHostPort)) + s.logger.Info("Starting admin HTTP server", zap.String("http-addr", s.serverCfg.Endpoint)) go func() { var err error - if s.tlsCfg != nil { + if s.serverCfg.TLSSetting != nil { err = s.server.ServeTLS(l, "", "") } else { err = s.server.Serve(l) From cb1fe90662a8463b91c700a8ea355436e4983b4d Mon Sep 17 00:00:00 2001 From: chahatsagarmain Date: Thu, 12 Dec 2024 05:27:55 +0530 Subject: [PATCH 3/9] use otel helpers Signed-off-by: chahatsagarmain --- cmd/internal/flags/admin.go | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/cmd/internal/flags/admin.go b/cmd/internal/flags/admin.go index e267cf2f337..35027a01c76 100644 --- a/cmd/internal/flags/admin.go +++ b/cmd/internal/flags/admin.go @@ -11,7 +11,6 @@ import ( "net" "net/http" "net/http/pprof" - "time" "github.com/spf13/viper" "go.opentelemetry.io/collector/config/confighttp" @@ -21,6 +20,7 @@ import ( "github.com/jaegertracing/jaeger/pkg/config/tlscfg" "github.com/jaegertracing/jaeger/pkg/healthcheck" "github.com/jaegertracing/jaeger/pkg/recoveryhandler" + "github.com/jaegertracing/jaeger/pkg/telemetry" "github.com/jaegertracing/jaeger/pkg/version" ) @@ -97,12 +97,14 @@ func (s *AdminServer) Handle(path string, handler http.Handler) { // Serve starts HTTP server. func (s *AdminServer) Serve() error { - l, err := net.Listen("tcp", s.serverCfg.Endpoint) + l, err := s.serverCfg.ToListener(context.Background()) if err != nil { s.logger.Error("Admin server failed to listen", zap.Error(err)) return err } - s.serveWithListener(l) + if err = s.serveWithListener(l); err != nil { + return err + } s.logger.Info( "Admin server started", @@ -111,18 +113,20 @@ func (s *AdminServer) Serve() error { return nil } -func (s *AdminServer) serveWithListener(l net.Listener) { +func (s *AdminServer) serveWithListener(l net.Listener) (err error) { s.logger.Info("Mounting health check on admin server", zap.String("route", "/")) s.mux.Handle("/", s.hc.Handler()) version.RegisterHandler(s.mux, s.logger) s.registerPprofHandlers() recoveryHandler := recoveryhandler.NewRecoveryHandler(s.logger, true) errorLog, _ := zap.NewStdLogAt(s.logger, zapcore.ErrorLevel) - s.server = &http.Server{ - Handler: recoveryHandler(s.mux), - ErrorLog: errorLog, - ReadHeaderTimeout: 2 * time.Second, + s.server, err = s.serverCfg.ToServer(context.Background(), nil, telemetry.NoopSettings().ToOtelComponent(), + recoveryHandler(s.mux)) + if err != nil { + return err } + s.server.ErrorLog = errorLog + if s.serverCfg.TLSSetting != nil { tlsConfig, err := s.serverCfg.TLSSetting.LoadTLSConfig(context.Background()) if err != nil { @@ -133,17 +137,14 @@ func (s *AdminServer) serveWithListener(l net.Listener) { } s.logger.Info("Starting admin HTTP server", zap.String("http-addr", s.serverCfg.Endpoint)) go func() { - var err error - if s.serverCfg.TLSSetting != nil { - err = s.server.ServeTLS(l, "", "") - } else { - err = s.server.Serve(l) - } + err := s.server.Serve(l) if err != nil && !errors.Is(err, http.ErrServerClosed) { s.logger.Error("failed to serve", zap.Error(err)) s.hc.Set(healthcheck.Broken) } }() + + return nil } func (s *AdminServer) registerPprofHandlers() { From b654e543ada037b6ddcd3a0c1a03c225a00ad290 Mon Sep 17 00:00:00 2001 From: chahatsagarmain Date: Thu, 12 Dec 2024 07:53:36 +0530 Subject: [PATCH 4/9] reviewed changes Signed-off-by: chahatsagarmain --- cmd/internal/flags/admin.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/cmd/internal/flags/admin.go b/cmd/internal/flags/admin.go index 35027a01c76..bfac30daf3e 100644 --- a/cmd/internal/flags/admin.go +++ b/cmd/internal/flags/admin.go @@ -11,6 +11,7 @@ import ( "net" "net/http" "net/http/pprof" + "sync" "github.com/spf13/viper" "go.opentelemetry.io/collector/config/confighttp" @@ -76,10 +77,10 @@ func (s *AdminServer) initFromViper(v *viper.Viper, logger *zap.Logger) error { s.serverCfg.Endpoint = v.GetString(adminHTTPHostPort) tlsAdminHTTP, err := tlsAdminHTTPFlagsConfig.InitFromViper(v) - tlsAdminHTTPConfig := tlsAdminHTTP.ToOtelServerConfig() if err != nil { return fmt.Errorf("failed to parse admin server TLS options: %w", err) } + tlsAdminHTTPConfig := tlsAdminHTTP.ToOtelServerConfig() if tlsAdminHTTPConfig != nil { s.serverCfg.TLSSetting = tlsAdminHTTPConfig _, err = s.serverCfg.TLSSetting.LoadTLSConfig(context.Background()) @@ -128,15 +129,16 @@ func (s *AdminServer) serveWithListener(l net.Listener) (err error) { s.server.ErrorLog = errorLog if s.serverCfg.TLSSetting != nil { - tlsConfig, err := s.serverCfg.TLSSetting.LoadTLSConfig(context.Background()) + s.server.TLSConfig, err = s.serverCfg.TLSSetting.LoadTLSConfig(context.Background()) if err != nil { - s.logger.Error("failed to load tls config", zap.Error(err)) - s.hc.Set(healthcheck.Broken) + return err } - s.server.TLSConfig = tlsConfig } s.logger.Info("Starting admin HTTP server", zap.String("http-addr", s.serverCfg.Endpoint)) + var wg sync.WaitGroup + wg.Add(1) go func() { + defer wg.Done() err := s.server.Serve(l) if err != nil && !errors.Is(err, http.ErrServerClosed) { s.logger.Error("failed to serve", zap.Error(err)) @@ -144,6 +146,9 @@ func (s *AdminServer) serveWithListener(l net.Listener) (err error) { } }() + go func() { + wg.Wait() + }() return nil } From d44e04aef8719c31bea26d01893e47590eb25518 Mon Sep 17 00:00:00 2001 From: chahatsagarmain Date: Thu, 12 Dec 2024 08:00:41 +0530 Subject: [PATCH 5/9] remove pointer Signed-off-by: chahatsagarmain --- cmd/internal/flags/admin.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/internal/flags/admin.go b/cmd/internal/flags/admin.go index bfac30daf3e..b3658769d7b 100644 --- a/cmd/internal/flags/admin.go +++ b/cmd/internal/flags/admin.go @@ -39,7 +39,7 @@ type AdminServer struct { hc *healthcheck.HealthCheck mux *http.ServeMux server *http.Server - serverCfg *confighttp.ServerConfig + serverCfg confighttp.ServerConfig } // NewAdminServer creates a new admin server. @@ -48,7 +48,7 @@ func NewAdminServer(hostPort string) *AdminServer { logger: zap.NewNop(), hc: healthcheck.New(), mux: http.NewServeMux(), - serverCfg: &confighttp.ServerConfig{ + serverCfg: confighttp.ServerConfig{ Endpoint: hostPort, }, } From 0f0d231116d1aa798ffb3cca3f7745fa63eadd4f Mon Sep 17 00:00:00 2001 From: Yuri Shkuro Date: Wed, 11 Dec 2024 21:58:43 -0500 Subject: [PATCH 6/9] Apply suggestions from code review Signed-off-by: Yuri Shkuro --- cmd/internal/flags/admin.go | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/cmd/internal/flags/admin.go b/cmd/internal/flags/admin.go index b3658769d7b..57243526257 100644 --- a/cmd/internal/flags/admin.go +++ b/cmd/internal/flags/admin.go @@ -103,9 +103,6 @@ func (s *AdminServer) Serve() error { s.logger.Error("Admin server failed to listen", zap.Error(err)) return err } - if err = s.serveWithListener(l); err != nil { - return err - } s.logger.Info( "Admin server started", @@ -138,7 +135,7 @@ func (s *AdminServer) serveWithListener(l net.Listener) (err error) { var wg sync.WaitGroup wg.Add(1) go func() { - defer wg.Done() + wg.Done() err := s.server.Serve(l) if err != nil && !errors.Is(err, http.ErrServerClosed) { s.logger.Error("failed to serve", zap.Error(err)) @@ -146,9 +143,7 @@ func (s *AdminServer) serveWithListener(l net.Listener) (err error) { } }() - go func() { - wg.Wait() - }() + wg.Wait() return nil } From 4569ab290f5364cedc2a252b8074184844d83fad Mon Sep 17 00:00:00 2001 From: Yuri Shkuro Date: Wed, 11 Dec 2024 22:07:00 -0500 Subject: [PATCH 7/9] cleanup Signed-off-by: Yuri Shkuro --- cmd/internal/flags/admin.go | 40 ++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/cmd/internal/flags/admin.go b/cmd/internal/flags/admin.go index 57243526257..d724edfa9f0 100644 --- a/cmd/internal/flags/admin.go +++ b/cmd/internal/flags/admin.go @@ -40,6 +40,7 @@ type AdminServer struct { mux *http.ServeMux server *http.Server serverCfg confighttp.ServerConfig + stopped sync.WaitGroup } // NewAdminServer creates a new admin server. @@ -104,11 +105,7 @@ func (s *AdminServer) Serve() error { return err } - s.logger.Info( - "Admin server started", - zap.String("http.host-port", l.Addr().String()), - zap.Stringer("health-status", s.hc.Get())) - return nil + return s.serveWithListener(l) } func (s *AdminServer) serveWithListener(l net.Listener) (err error) { @@ -117,33 +114,36 @@ func (s *AdminServer) serveWithListener(l net.Listener) (err error) { version.RegisterHandler(s.mux, s.logger) s.registerPprofHandlers() recoveryHandler := recoveryhandler.NewRecoveryHandler(s.logger, true) - errorLog, _ := zap.NewStdLogAt(s.logger, zapcore.ErrorLevel) - s.server, err = s.serverCfg.ToServer(context.Background(), nil, telemetry.NoopSettings().ToOtelComponent(), - recoveryHandler(s.mux)) + s.server, err = s.serverCfg.ToServer( + context.Background(), + nil, // host + telemetry.NoopSettings().ToOtelComponent(), + recoveryHandler(s.mux), + ) if err != nil { return err } + errorLog, _ := zap.NewStdLogAt(s.logger, zapcore.ErrorLevel) s.server.ErrorLog = errorLog - if s.serverCfg.TLSSetting != nil { - s.server.TLSConfig, err = s.serverCfg.TLSSetting.LoadTLSConfig(context.Background()) - if err != nil { - return err - } - } - s.logger.Info("Starting admin HTTP server", zap.String("http-addr", s.serverCfg.Endpoint)) + s.logger.Info("Starting admin HTTP server") var wg sync.WaitGroup wg.Add(1) + s.stopped.Add(1) go func() { wg.Done() + defer s.stopped.Done() err := s.server.Serve(l) if err != nil && !errors.Is(err, http.ErrServerClosed) { s.logger.Error("failed to serve", zap.Error(err)) s.hc.Set(healthcheck.Broken) } }() - - wg.Wait() + wg.Wait() // wait for the server to start listening + s.logger.Info( + "Admin server started", + zap.String("http.host-port", l.Addr().String()), + zap.Stringer("health-status", s.hc.Get())) return nil } @@ -161,7 +161,7 @@ func (s *AdminServer) registerPprofHandlers() { // Close stops the HTTP server func (s *AdminServer) Close() error { - return errors.Join( - s.server.Shutdown(context.Background()), - ) + err := s.server.Shutdown(context.Background()) + s.stopped.Wait() + return err } From 8720eb85fe62e3dbc27cae0486ed8d22ad132b82 Mon Sep 17 00:00:00 2001 From: Yuri Shkuro Date: Wed, 11 Dec 2024 22:08:32 -0500 Subject: [PATCH 8/9] cleanup Signed-off-by: Yuri Shkuro --- cmd/internal/flags/admin.go | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/cmd/internal/flags/admin.go b/cmd/internal/flags/admin.go index d724edfa9f0..afb5d501074 100644 --- a/cmd/internal/flags/admin.go +++ b/cmd/internal/flags/admin.go @@ -76,19 +76,13 @@ func (s *AdminServer) AddFlags(flagSet *flag.FlagSet) { func (s *AdminServer) initFromViper(v *viper.Viper, logger *zap.Logger) error { s.setLogger(logger) - s.serverCfg.Endpoint = v.GetString(adminHTTPHostPort) tlsAdminHTTP, err := tlsAdminHTTPFlagsConfig.InitFromViper(v) if err != nil { return fmt.Errorf("failed to parse admin server TLS options: %w", err) } - tlsAdminHTTPConfig := tlsAdminHTTP.ToOtelServerConfig() - if tlsAdminHTTPConfig != nil { - s.serverCfg.TLSSetting = tlsAdminHTTPConfig - _, err = s.serverCfg.TLSSetting.LoadTLSConfig(context.Background()) - if err != nil { - return err - } - } + + s.serverCfg.Endpoint = v.GetString(adminHTTPHostPort) + s.serverCfg.TLSSetting = tlsAdminHTTP.ToOtelServerConfig() return nil } From a8af5d713c3900c8e38a09051ee2a47a114736f8 Mon Sep 17 00:00:00 2001 From: Yuri Shkuro Date: Wed, 11 Dec 2024 22:24:04 -0500 Subject: [PATCH 9/9] fix Signed-off-by: Yuri Shkuro --- cmd/internal/flags/admin.go | 2 +- cmd/internal/flags/admin_test.go | 2 +- cmd/internal/flags/service_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/internal/flags/admin.go b/cmd/internal/flags/admin.go index afb5d501074..6078fb97c3b 100644 --- a/cmd/internal/flags/admin.go +++ b/cmd/internal/flags/admin.go @@ -115,7 +115,7 @@ func (s *AdminServer) serveWithListener(l net.Listener) (err error) { recoveryHandler(s.mux), ) if err != nil { - return err + return fmt.Errorf("failed to create admin server: %w", err) } errorLog, _ := zap.NewStdLogAt(s.logger, zapcore.ErrorLevel) s.server.ErrorLog = errorLog diff --git a/cmd/internal/flags/admin_test.go b/cmd/internal/flags/admin_test.go index f892974d5e5..8d83e46d99c 100644 --- a/cmd/internal/flags/admin_test.go +++ b/cmd/internal/flags/admin_test.go @@ -70,7 +70,7 @@ func TestAdminFailToServe(t *testing.T) { require.NoError(t, adminServer.initFromViper(v, logger)) adminServer.serveWithListener(l) - defer adminServer.Close() + t.Cleanup(func() { assert.NoError(t, adminServer.Close()) }) waitForEqual(t, healthcheck.Broken, func() any { return adminServer.HC().Get() }) diff --git a/cmd/internal/flags/service_test.go b/cmd/internal/flags/service_test.go index f50a2bbe97f..4157b1c7c6c 100644 --- a/cmd/internal/flags/service_test.go +++ b/cmd/internal/flags/service_test.go @@ -50,7 +50,7 @@ func TestStartErrors(t *testing.T) { { name: "bad admin TLS", flags: []string{"--admin.http.tls.enabled=true", "--admin.http.tls.cert=invalid-cert"}, - expErr: "cannot initialize admin server", + expErr: "cannot start the admin server: failed to load TLS config", }, { name: "bad host:port",