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