github.com/muhammadn/cortex@v1.9.1-0.20220510110439-46bb7000d03d/tools/querytee/instrumentation.go (about) 1 package querytee 2 3 import ( 4 "fmt" 5 "net" 6 "net/http" 7 8 "github.com/go-kit/log/level" 9 "github.com/gorilla/mux" 10 "github.com/prometheus/client_golang/prometheus" 11 "github.com/prometheus/client_golang/prometheus/promhttp" 12 13 util_log "github.com/cortexproject/cortex/pkg/util/log" 14 ) 15 16 type InstrumentationServer struct { 17 port int 18 registry *prometheus.Registry 19 srv *http.Server 20 } 21 22 // NewInstrumentationServer returns a server exposing Prometheus metrics. 23 func NewInstrumentationServer(port int, registry *prometheus.Registry) *InstrumentationServer { 24 return &InstrumentationServer{ 25 port: port, 26 registry: registry, 27 } 28 } 29 30 // Start the instrumentation server. 31 func (s *InstrumentationServer) Start() error { 32 // Setup listener first, so we can fail early if the port is in use. 33 listener, err := net.Listen("tcp", fmt.Sprintf(":%d", s.port)) 34 if err != nil { 35 return err 36 } 37 38 router := mux.NewRouter() 39 router.Handle("/metrics", promhttp.HandlerFor(s.registry, promhttp.HandlerOpts{})) 40 41 s.srv = &http.Server{ 42 Handler: router, 43 } 44 45 go func() { 46 if err := s.srv.Serve(listener); err != nil { 47 level.Error(util_log.Logger).Log("msg", "metrics server terminated", "err", err) 48 } 49 }() 50 51 return nil 52 } 53 54 // Stop closes the instrumentation server. 55 func (s *InstrumentationServer) Stop() { 56 if s.srv != nil { 57 s.srv.Close() 58 s.srv = nil 59 } 60 }