@@ -296,24 +296,30 @@ func (cm *controllerManager) GetControllerOptions() config.Controller {
296
296
return cm .controllerConfig
297
297
}
298
298
299
- func (cm * controllerManager ) serveMetrics () {
299
+ func (cm * controllerManager ) addMetricsServer () error {
300
+ mux := http .NewServeMux ()
301
+ srv := httpserver .New (mux )
302
+
300
303
handler := promhttp .HandlerFor (metrics .Registry , promhttp.HandlerOpts {
301
304
ErrorHandling : promhttp .HTTPErrorOnError ,
302
305
})
303
306
// TODO(JoelSpeed): Use existing Kubernetes machinery for serving metrics
304
- mux := http .NewServeMux ()
305
307
mux .Handle (defaultMetricsEndpoint , handler )
306
308
for path , extraHandler := range cm .metricsExtraHandlers {
307
309
mux .Handle (path , extraHandler )
308
310
}
309
311
310
- server := httpserver .New (mux )
311
- go cm .httpServe ("metrics" , cm .logger .WithValues ("path" , defaultMetricsEndpoint ), server , cm .metricsListener )
312
+ return cm .add (& server {
313
+ Kind : "metrics" ,
314
+ Log : cm .logger .WithValues ("path" , defaultMetricsEndpoint ),
315
+ Server : srv ,
316
+ Listener : cm .metricsListener ,
317
+ })
312
318
}
313
319
314
- func (cm * controllerManager ) serveHealthProbes () {
320
+ func (cm * controllerManager ) addHealthProbeServer () error {
315
321
mux := http .NewServeMux ()
316
- server := httpserver .New (mux )
322
+ srv := httpserver .New (mux )
317
323
318
324
if cm .readyzHandler != nil {
319
325
mux .Handle (cm .readinessEndpointName , http .StripPrefix (cm .readinessEndpointName , cm .readyzHandler ))
@@ -326,7 +332,12 @@ func (cm *controllerManager) serveHealthProbes() {
326
332
mux .Handle (cm .livenessEndpointName + "/" , http .StripPrefix (cm .livenessEndpointName , cm .healthzHandler ))
327
333
}
328
334
329
- go cm .httpServe ("health probe" , cm .logger , server , cm .healthProbeListener )
335
+ return cm .add (& server {
336
+ Kind : "health probe" ,
337
+ Log : cm .logger ,
338
+ Server : srv ,
339
+ Listener : cm .healthProbeListener ,
340
+ })
330
341
}
331
342
332
343
func (cm * controllerManager ) addPprofServer () error {
@@ -347,42 +358,6 @@ func (cm *controllerManager) addPprofServer() error {
347
358
})
348
359
}
349
360
350
- func (cm * controllerManager ) httpServe (kind string , log logr.Logger , server * http.Server , ln net.Listener ) {
351
- log = log .WithValues ("kind" , kind , "addr" , ln .Addr ())
352
-
353
- go func () {
354
- log .Info ("Starting server" )
355
- if err := server .Serve (ln ); err != nil {
356
- if errors .Is (err , http .ErrServerClosed ) {
357
- return
358
- }
359
- if atomic .LoadInt64 (cm .stopProcedureEngaged ) > 0 {
360
- // There might be cases where connections are still open and we try to shutdown
361
- // but not having enough time to close the connection causes an error in Serve
362
- //
363
- // In that case we want to avoid returning an error to the main error channel.
364
- log .Error (err , "error on Serve after stop has been engaged" )
365
- return
366
- }
367
- cm .errChan <- err
368
- }
369
- }()
370
-
371
- // Shutdown the server when stop is closed.
372
- <- cm .internalProceduresStop
373
- if err := server .Shutdown (cm .shutdownCtx ); err != nil {
374
- if errors .Is (err , context .Canceled ) || errors .Is (err , context .DeadlineExceeded ) {
375
- // Avoid logging context related errors.
376
- return
377
- }
378
- if atomic .LoadInt64 (cm .stopProcedureEngaged ) > 0 {
379
- cm .logger .Error (err , "error on Shutdown after stop has been engaged" )
380
- return
381
- }
382
- cm .errChan <- err
383
- }
384
- }
385
-
386
361
// Start starts the manager and waits indefinitely.
387
362
// There is only two ways to have start return:
388
363
// An error has occurred during in one of the internal operations,
@@ -436,12 +411,16 @@ func (cm *controllerManager) Start(ctx context.Context) (err error) {
436
411
// (If we don't serve metrics for non-leaders, prometheus will still scrape
437
412
// the pod but will get a connection refused).
438
413
if cm .metricsListener != nil {
439
- cm .serveMetrics ()
414
+ if err := cm .addMetricsServer (); err != nil {
415
+ return fmt .Errorf ("failed to add metrics server: %w" , err )
416
+ }
440
417
}
441
418
442
419
// Serve health probes.
443
420
if cm .healthProbeListener != nil {
444
- cm .serveHealthProbes ()
421
+ if err := cm .addHealthProbeServer (); err != nil {
422
+ return fmt .Errorf ("failed to add health probe server: %w" , err )
423
+ }
445
424
}
446
425
447
426
// Add pprof server
0 commit comments