@@ -185,17 +185,30 @@ func (r *ImpVMReconciler) clearOwnership(ctx context.Context, vm *impdevv1alpha1
185185 return ctrl.Result {}, nil
186186}
187187
188+ // metricsServer is a controller-runtime Runnable that serves Prometheus metrics.
189+ // Registered with the manager so it shuts down cleanly when the manager stops.
190+ type metricsServer struct { handler http.Handler }
191+
192+ func (s * metricsServer ) Start (ctx context.Context ) error {
193+ srv := & http.Server {Addr : metricsPort , Handler : s .handler , ReadHeaderTimeout : 10 * time .Second }
194+ go func () {
195+ <- ctx .Done ()
196+ _ = srv .Shutdown (context .Background ()) //nolint:errcheck
197+ }()
198+ if err := srv .ListenAndServe (); ! errors .Is (err , http .ErrServerClosed ) {
199+ return err
200+ }
201+ return nil
202+ }
203+
188204// SetupWithManager registers the reconciler with the controller-runtime manager.
189205func (r * ImpVMReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
190206 if r .Metrics != nil {
191- go func () {
192- mux := http .NewServeMux ()
193- mux .Handle ("/metrics" , NewMetricsHandlerWithCollector (r .Metrics ))
194- srv := & http.Server {Addr : metricsPort , Handler : mux , ReadHeaderTimeout : 10 * time .Second }
195- if err := srv .ListenAndServe (); err != nil && ! errors .Is (err , http .ErrServerClosed ) {
196- logf .Log .Error (err , "metrics server failed" )
197- }
198- }()
207+ mux := http .NewServeMux ()
208+ mux .Handle ("/metrics" , NewMetricsHandlerWithCollector (r .Metrics ))
209+ if err := mgr .Add (& metricsServer {handler : mux }); err != nil {
210+ return err
211+ }
199212 }
200213
201214 return ctrl .NewControllerManagedBy (mgr ).
0 commit comments