github.com/rish1988/moby@v25.0.2+incompatible/cmd/dockerd/metrics.go (about)

     1  package main
     2  
     3  import (
     4  	"context"
     5  	"net"
     6  	"net/http"
     7  	"strings"
     8  	"time"
     9  
    10  	"github.com/containerd/log"
    11  	metrics "github.com/docker/go-metrics"
    12  )
    13  
    14  func startMetricsServer(addr string) error {
    15  	if addr == "" {
    16  		return nil
    17  	}
    18  	if err := allocateDaemonPort(addr); err != nil {
    19  		return err
    20  	}
    21  	l, err := net.Listen("tcp", addr)
    22  	if err != nil {
    23  		return err
    24  	}
    25  	mux := http.NewServeMux()
    26  	mux.Handle("/metrics", metrics.Handler())
    27  	go func() {
    28  		log.G(context.TODO()).Infof("metrics API listening on %s", l.Addr())
    29  		srv := &http.Server{
    30  			Handler:           mux,
    31  			ReadHeaderTimeout: 5 * time.Minute, // "G112: Potential Slowloris Attack (gosec)"; not a real concern for our use, so setting a long timeout.
    32  		}
    33  		if err := srv.Serve(l); err != nil && !strings.Contains(err.Error(), "use of closed network connection") {
    34  			log.G(context.TODO()).WithError(err).Error("error serving metrics API")
    35  		}
    36  	}()
    37  	return nil
    38  }