diff --git a/pkg/prometheus/server.go b/pkg/prometheus/server.go new file mode 100644 index 0000000..26e0c95 --- /dev/null +++ b/pkg/prometheus/server.go @@ -0,0 +1,50 @@ +// Package prometheus implements a standalone HTTP server for serving a +// Prometheus metrics endpoint. +package prometheus + +import ( + "context" + "net/http" + + log "github.com/Sirupsen/logrus" + "github.com/prometheus/client_golang/prometheus" +) + +// Server represents a standalone HTTP server for serving a Prometheus metrics +// endpoint. +type Server struct { + srv *http.Server +} + +// Stop shuts down the server. +func (s *Server) Stop() <-chan error { + c := make(chan error) + go func() { + if err := s.srv.Shutdown(context.Background()); err != nil { + c <- err + } else { + close(c) + } + }() + + return c +} + +// NewServer creates a new instance of a Prometheus server that asynchronously +// serves requests. +func NewServer(addr string) *Server { + s := &Server{ + srv: &http.Server{ + Addr: addr, + Handler: prometheus.Handler(), + }, + } + + go func() { + if err := s.srv.ListenAndServe(); err != http.ErrServerClosed { + log.Fatal("failed while serving prometheus: " + err.Error()) + } + }() + + return s +}