Refactor http server and register leaderelection health check

- Needed to start the http server outside of pkg/metric
- We needed this because we want to add other endpoints to the server

Signed-off-by: Grant Griffiths <ggriffiths@purestorage.com>
This commit is contained in:
Grant Griffiths
2021-08-10 02:17:08 -07:00
parent b5b71904b4
commit 0476dcedcc
5 changed files with 91 additions and 70 deletions

View File

@@ -20,6 +20,8 @@ import (
"context"
"flag"
"fmt"
"net"
"net/http"
"os"
"os/signal"
"sync"
@@ -143,23 +145,15 @@ func main() {
// Create and register metrics manager
metricsManager := metrics.NewMetricsManager()
wg := &sync.WaitGroup{}
wg.Add(1)
mux := http.NewServeMux()
if *httpEndpoint != "" {
srv, err := metricsManager.StartMetricsEndpoint(*metricsPath, *httpEndpoint, promklog{}, wg)
err := metricsManager.PrepareMetricsPath(mux, *metricsPath, promklog{})
if err != nil {
klog.Errorf("Failed to start metrics server: %s", err.Error())
klog.Errorf("Failed to prepare metrics path: %s", err.Error())
os.Exit(1)
}
defer func() {
err := srv.Shutdown(context.Background())
if err != nil {
klog.Errorf("Failed to shutdown metrics server: %s", err.Error())
}
klog.Infof("Metrics server successfully shutdown")
wg.Done()
}()
klog.Infof("Metrics server successfully started on %s, %s", *httpEndpoint, *metricsPath)
klog.Infof("Metrics path successfully registered at %s", *metricsPath)
}
// Add Snapshot types to the default Kubernetes so events can be logged for them
@@ -199,6 +193,32 @@ func main() {
close(stopCh)
}
// start listening & serving http endpoint if set
if *httpEndpoint != "" {
l, err := net.Listen("tcp", *httpEndpoint)
if err != nil {
klog.Fatalf("failed to listen on address[%s], error[%v]", *httpEndpoint, err)
}
srv := &http.Server{Addr: l.Addr().String(), Handler: mux}
go func() {
defer wg.Done()
if err := srv.Serve(l); err != http.ErrServerClosed {
klog.Fatalf("failed to start endpoint at:%s/%s, error: %v", *httpEndpoint, *metricsPath, err)
}
}()
klog.Infof("Metrics http server successfully started on %s, %s", *httpEndpoint, *metricsPath)
defer func() {
err := srv.Shutdown(context.Background())
if err != nil {
klog.Errorf("Failed to shutdown metrics server: %s", err.Error())
}
klog.Infof("Metrics server successfully shutdown")
wg.Done()
}()
}
if !*leaderElection {
run(context.TODO())
} else {
@@ -210,6 +230,10 @@ func main() {
klog.Fatalf("failed to create leaderelection client: %v", err)
}
le := leaderelection.NewLeaderElection(leClientset, lockName, run)
if *httpEndpoint != "" {
le.PrepareHealthCheck(mux, leaderelection.DefaultHealthCheckTimeout)
}
if *leaderElectionNamespace != "" {
le.WithNamespace(*leaderElectionNamespace)
}