Skip to content

Commit b0831eb

Browse files
committed
make metrics and health probe servers be Runnables
1 parent fbd6b94 commit b0831eb

File tree

1 file changed

+24
-45
lines changed

1 file changed

+24
-45
lines changed

pkg/manager/internal.go

Lines changed: 24 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -297,24 +297,30 @@ func (cm *controllerManager) GetControllerOptions() config.Controller {
297297
return cm.controllerConfig
298298
}
299299

300-
func (cm *controllerManager) serveMetrics() {
300+
func (cm *controllerManager) addMetricsServer() error {
301+
mux := http.NewServeMux()
302+
srv := httpserver.New(mux)
303+
301304
handler := promhttp.HandlerFor(metrics.Registry, promhttp.HandlerOpts{
302305
ErrorHandling: promhttp.HTTPErrorOnError,
303306
})
304307
// TODO(JoelSpeed): Use existing Kubernetes machinery for serving metrics
305-
mux := http.NewServeMux()
306308
mux.Handle(defaultMetricsEndpoint, handler)
307309
for path, extraHandler := range cm.metricsExtraHandlers {
308310
mux.Handle(path, extraHandler)
309311
}
310312

311-
server := httpserver.New(mux)
312-
go cm.httpServe("metrics", cm.logger.WithValues("path", defaultMetricsEndpoint), server, cm.metricsListener)
313+
return cm.add(&server{
314+
Kind: "metrics",
315+
Log: cm.logger.WithValues("path", defaultMetricsEndpoint),
316+
Server: srv,
317+
Listener: cm.metricsListener,
318+
})
313319
}
314320

315-
func (cm *controllerManager) serveHealthProbes() {
321+
func (cm *controllerManager) addHealthProbeServer() error {
316322
mux := http.NewServeMux()
317-
server := httpserver.New(mux)
323+
srv := httpserver.New(mux)
318324

319325
if cm.readyzHandler != nil {
320326
mux.Handle(cm.readinessEndpointName, http.StripPrefix(cm.readinessEndpointName, cm.readyzHandler))
@@ -327,7 +333,12 @@ func (cm *controllerManager) serveHealthProbes() {
327333
mux.Handle(cm.livenessEndpointName+"/", http.StripPrefix(cm.livenessEndpointName, cm.healthzHandler))
328334
}
329335

330-
go cm.httpServe("health probe", cm.logger, server, cm.healthProbeListener)
336+
return cm.add(&server{
337+
Kind: "health probe",
338+
Log: cm.logger,
339+
Server: srv,
340+
Listener: cm.healthProbeListener,
341+
})
331342
}
332343

333344
func (cm *controllerManager) addPprofServer() error {
@@ -348,42 +359,6 @@ func (cm *controllerManager) addPprofServer() error {
348359
})
349360
}
350361

351-
func (cm *controllerManager) httpServe(kind string, log logr.Logger, server *http.Server, ln net.Listener) {
352-
log = log.WithValues("kind", kind, "addr", ln.Addr())
353-
354-
go func() {
355-
log.Info("Starting server")
356-
if err := server.Serve(ln); err != nil {
357-
if errors.Is(err, http.ErrServerClosed) {
358-
return
359-
}
360-
if atomic.LoadInt64(cm.stopProcedureEngaged) > 0 {
361-
// There might be cases where connections are still open and we try to shutdown
362-
// but not having enough time to close the connection causes an error in Serve
363-
//
364-
// In that case we want to avoid returning an error to the main error channel.
365-
log.Error(err, "error on Serve after stop has been engaged")
366-
return
367-
}
368-
cm.errChan <- err
369-
}
370-
}()
371-
372-
// Shutdown the server when stop is closed.
373-
<-cm.internalProceduresStop
374-
if err := server.Shutdown(cm.shutdownCtx); err != nil {
375-
if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) {
376-
// Avoid logging context related errors.
377-
return
378-
}
379-
if atomic.LoadInt64(cm.stopProcedureEngaged) > 0 {
380-
cm.logger.Error(err, "error on Shutdown after stop has been engaged")
381-
return
382-
}
383-
cm.errChan <- err
384-
}
385-
}
386-
387362
// Start starts the manager and waits indefinitely.
388363
// There is only two ways to have start return:
389364
// An error has occurred during in one of the internal operations,
@@ -437,12 +412,16 @@ func (cm *controllerManager) Start(ctx context.Context) (err error) {
437412
// (If we don't serve metrics for non-leaders, prometheus will still scrape
438413
// the pod but will get a connection refused).
439414
if cm.metricsListener != nil {
440-
cm.serveMetrics()
415+
if err := cm.addMetricsServer(); err != nil {
416+
return fmt.Errorf("failed to add metrics server: %w", err)
417+
}
441418
}
442419

443420
// Serve health probes.
444421
if cm.healthProbeListener != nil {
445-
cm.serveHealthProbes()
422+
if err := cm.addHealthProbeServer(); err != nil {
423+
return fmt.Errorf("failed to add health probe server: %w", err)
424+
}
446425
}
447426

448427
// Add pprof server

0 commit comments

Comments
 (0)