metrics.go 917 B

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