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  }