Skip to content

Commit eb0ebc9

Browse files
authored
Merge pull request #2275 from zqzten/runnable-metrics-health
🌱 Make metrics and health probe servers be Runnables
2 parents bc7914c + b0831eb commit eb0ebc9

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
@@ -296,24 +296,30 @@ func (cm *controllerManager) GetControllerOptions() config.Controller {
296296
return cm.controllerConfig
297297
}
298298

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

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+
})
312318
}
313319

314-
func (cm *controllerManager) serveHealthProbes() {
320+
func (cm *controllerManager) addHealthProbeServer() error {
315321
mux := http.NewServeMux()
316-
server := httpserver.New(mux)
322+
srv := httpserver.New(mux)
317323

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

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+
})
330341
}
331342

332343
func (cm *controllerManager) addPprofServer() error {
@@ -347,42 +358,6 @@ func (cm *controllerManager) addPprofServer() error {
347358
})
348359
}
349360

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-
386361
// Start starts the manager and waits indefinitely.
387362
// There is only two ways to have start return:
388363
// An error has occurred during in one of the internal operations,
@@ -436,12 +411,16 @@ func (cm *controllerManager) Start(ctx context.Context) (err error) {
436411
// (If we don't serve metrics for non-leaders, prometheus will still scrape
437412
// the pod but will get a connection refused).
438413
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+
}
440417
}
441418

442419
// Serve health probes.
443420
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+
}
445424
}
446425

447426
// Add pprof server

0 commit comments

Comments
 (0)