From 40c1db6c6be0147b205d5d7bd3ff4799a779d21b Mon Sep 17 00:00:00 2001 From: Oliver Herms <oliver.peter.herms@gmail.com> Date: Tue, 14 Jan 2020 19:38:38 +0100 Subject: [PATCH] Refactor to use prometheus GaugeVector --- cmd/ris/main.go | 1 - cmd/ris/risserver/server.go | 91 ++++++++----------------------------- 2 files changed, 19 insertions(+), 73 deletions(-) diff --git a/cmd/ris/main.go b/cmd/ris/main.go index 627ceb6b..69d9d9a2 100644 --- a/cmd/ris/main.go +++ b/cmd/ris/main.go @@ -46,7 +46,6 @@ func main() { } s := risserver.NewServer(b) - prometheus.MustRegister(s) unaryInterceptors := []grpc.UnaryServerInterceptor{} streamInterceptors := []grpc.StreamServerInterceptor{} srv, err := servicewrapper.New( diff --git a/cmd/ris/risserver/server.go b/cmd/ris/risserver/server.go index 1e28f25b..de8a9621 100644 --- a/cmd/ris/risserver/server.go +++ b/cmd/ris/risserver/server.go @@ -3,7 +3,6 @@ package risserver import ( "context" "fmt" - "sync" "github.com/bio-routing/bio-rd/net" "github.com/bio-routing/bio-rd/protocols/bgp/server" @@ -20,88 +19,36 @@ import ( routeapi "github.com/bio-routing/bio-rd/route/api" ) -const ( - prefix = "bio_ris_" -) - var ( - risObserveFIBClientsDesc *prometheus.Desc + risObserveFIBClients *prometheus.GaugeVec ) func init() { - labels := []string{"router", "vrf", "afisafi"} - - risObserveFIBClientsDesc = prometheus.NewDesc(prefix+"observe_fib_clients", "number of observe FIB clients per router/vrf/afisafi", labels, nil) + risObserveFIBClients = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "bio", + Subsystem: "ris", + Name: "observe_fib_clients", + Help: "number of observe FIB clients per router/vrf/afisafi", + }, + []string{ + "router", + "vrf", + "afisafi", + }, + ) + prometheus.MustRegister(risObserveFIBClients) } // Server represents an RoutingInformationService server type Server struct { - bmp *server.BMPServer - observeClients map[observeRIBRequest]uint64 - observeClientsMu sync.Mutex -} - -type observeRIBRequest struct { - router string - vrfID uint64 - afisafi pb.ObserveRIBRequest_AFISAFI + bmp *server.BMPServer } // NewServer creates a new server func NewServer(b *server.BMPServer) *Server { return &Server{ - bmp: b, - observeClients: make(map[observeRIBRequest]uint64), - } -} - -func convertRIBRequest(r *pb.ObserveRIBRequest) observeRIBRequest { - return observeRIBRequest{ - router: r.Router, - vrfID: r.VrfId, - afisafi: r.Afisafi, - } -} - -func (s *Server) addObserveRIBRequest(req *pb.ObserveRIBRequest) { - r := convertRIBRequest(req) - - s.observeClientsMu.Lock() - defer s.observeClientsMu.Unlock() - - if _, found := s.observeClients[r]; found { - s.observeClients[r]++ - return - } - - s.observeClients[r] = 1 -} - -func (s *Server) delObserveRIBRequest(req *pb.ObserveRIBRequest) { - r := convertRIBRequest(req) - - s.observeClientsMu.Lock() - defer s.observeClientsMu.Unlock() - - if _, found := s.observeClients[r]; found { - s.observeClients[r]-- - return - } -} - -// Describe describes metrics of this server -func (s *Server) Describe(ch chan<- *prometheus.Desc) { - ch <- risObserveFIBClientsDesc -} - -// Collect collects metrics of this server -func (s *Server) Collect(ch chan<- prometheus.Metric) { - s.observeClientsMu.Lock() - defer s.observeClientsMu.Unlock() - - for k, v := range s.observeClients { - l := []string{k.router, fmt.Sprintf("%d", k.vrfID), fmt.Sprintf("%d", k.afisafi)} - ch <- prometheus.MustNewConstMetric(risObserveFIBClientsDesc, prometheus.GaugeValue, float64(v), l...) + bmp: b, } } @@ -207,8 +154,8 @@ func (s *Server) ObserveRIB(req *pb.ObserveRIBRequest, stream pb.RoutingInformat return err } - s.addObserveRIBRequest(req) - defer s.delObserveRIBRequest(req) + risObserveFIBClients.WithLabelValues(req.Router, fmt.Sprintf("%d", req.VrfId), fmt.Sprintf("%d", req.Afisafi)).Inc() + defer risObserveFIBClients.WithLabelValues(req.Router, fmt.Sprintf("%d", req.VrfId), fmt.Sprintf("%d", req.Afisafi)).Dec() fifo := newUpdateFIFO() rc := newRIBClient(fifo) -- GitLab