Skip to content
Snippets Groups Projects
Commit 5dd3859d authored by Oliver Herms's avatar Oliver Herms
Browse files

Add more metrics

parent 2b5a8cbc
No related branches found
No related tags found
No related merge requests found
...@@ -3,6 +3,7 @@ package metrics ...@@ -3,6 +3,7 @@ package metrics
import ( import (
"net" "net"
mlrib_metrics "github.com/bio-routing/bio-rd/routingtable/mergedlocrib/metrics"
vrf_metrics "github.com/bio-routing/bio-rd/routingtable/vrf/metrics" vrf_metrics "github.com/bio-routing/bio-rd/routingtable/vrf/metrics"
) )
...@@ -13,12 +14,15 @@ type RISMirrorMetrics struct { ...@@ -13,12 +14,15 @@ type RISMirrorMetrics struct {
// RISMirrorRouterMetrics contains a routers RIS mirror metrics // RISMirrorRouterMetrics contains a routers RIS mirror metrics
type RISMirrorRouterMetrics struct { type RISMirrorRouterMetrics struct {
// Routers IP Address Address net.IP
Address net.IP SysName string
VRFMetrics []*vrf_metrics.VRFMetrics
// SysName of the monitored router InternalVRFMetrics []*InternalVRFMetrics
SysName string }
// VRFMetrics represent per VRF metrics // InternalVRFMetrics represents internal VRF metrics (_vrf)
VRFMetrics []*vrf_metrics.VRFMetrics type InternalVRFMetrics struct {
RD uint64
MergedLocRIBMetricsIPv4Unicast *mlrib_metrics.MergedLocRIBMetrics
MergedLocRIBMetricsIPv6Unicast *mlrib_metrics.MergedLocRIBMetrics
} }
...@@ -58,6 +58,7 @@ func (rism *RISMirror) GetRouters() []server.RouterInterface { ...@@ -58,6 +58,7 @@ func (rism *RISMirror) GetRouters() []server.RouterInterface {
return res return res
} }
// Metrics gets a RISMirrors metrics
func (rism *RISMirror) Metrics() *metrics.RISMirrorMetrics { func (rism *RISMirror) Metrics() *metrics.RISMirrorMetrics {
res := &metrics.RISMirrorMetrics{ res := &metrics.RISMirrorMetrics{
Routers: make([]*metrics.RISMirrorRouterMetrics, 0), Routers: make([]*metrics.RISMirrorRouterMetrics, 0),
...@@ -68,9 +69,18 @@ func (rism *RISMirror) Metrics() *metrics.RISMirrorMetrics { ...@@ -68,9 +69,18 @@ func (rism *RISMirror) Metrics() *metrics.RISMirrorMetrics {
for _, r := range rism.routers { for _, r := range rism.routers {
rm := &metrics.RISMirrorRouterMetrics{ rm := &metrics.RISMirrorRouterMetrics{
Address: r.Address(), Address: r.Address(),
SysName: r.Name(), SysName: r.Name(),
VRFMetrics: vrf.Metrics(r.(*Router).vrfRegistry), VRFMetrics: vrf.Metrics(r.(*Router).vrfRegistry),
InternalVRFMetrics: make([]*metrics.InternalVRFMetrics, 0),
}
for rd, v := range r.(*Router).vrfs {
rm.InternalVRFMetrics = append(rm.InternalVRFMetrics, &metrics.InternalVRFMetrics{
RD: rd,
MergedLocRIBMetricsIPv4Unicast: v.ipv4Unicast.Metrics(),
MergedLocRIBMetricsIPv6Unicast: v.ipv6Unicast.Metrics(),
})
} }
res.Routers = append(res.Routers, rm) res.Routers = append(res.Routers, rm)
......
...@@ -60,11 +60,13 @@ func (r *Router) addVRF(rd uint64, sources []*grpc.ClientConn) { ...@@ -60,11 +60,13 @@ func (r *Router) addVRF(rd uint64, sources []*grpc.ClientConn) {
} }
func (r *Router) connectVRF(rd uint64, src *grpc.ClientConn, afi uint8) { func (r *Router) connectVRF(rd uint64, src *grpc.ClientConn, afi uint8) {
risclient.New(&risclient.Request{ rc := risclient.New(&risclient.Request{
Router: r.name, Router: r.name,
VRFRD: rd, VRFRD: rd,
AFI: apiAFI(afi), AFI: apiAFI(afi),
}, src, r.vrfs[rd].getRIB(afi)) }, src, r.vrfs[rd].getRIB(afi))
rc.Start()
} }
func apiAFI(afi uint8) api.ObserveRIBRequest_AFISAFI { func apiAFI(afi uint8) api.ObserveRIBRequest_AFISAFI {
......
package prom package prom
import ( import (
"fmt"
"github.com/bio-routing/bio-rd/cmd/ris-mirror/rismirror" "github.com/bio-routing/bio-rd/cmd/ris-mirror/rismirror"
"github.com/bio-routing/bio-rd/cmd/ris-mirror/rismirror/metrics" "github.com/bio-routing/bio-rd/cmd/ris-mirror/rismirror/metrics"
"github.com/bio-routing/bio-rd/protocols/bgp/packet"
"github.com/bio-routing/bio-rd/routingtable/vrf"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
vrf_prom "github.com/bio-routing/bio-rd/metrics/vrf/adapter/prom" vrf_prom "github.com/bio-routing/bio-rd/metrics/vrf/adapter/prom"
...@@ -12,6 +16,17 @@ const ( ...@@ -12,6 +16,17 @@ const (
prefix = "bio_rismirror_" prefix = "bio_rismirror_"
) )
var (
mergedLocalRIBRouteCount *prometheus.Desc
mergedLocalRIBSingleSourceRouteCount *prometheus.Desc
)
func init() {
labels := []string{"sys_name", "agent_address", "vrf", "afi", "rib"}
mergedLocalRIBRouteCount = prometheus.NewDesc(prefix+"merged_locrib_route_count", "Number of unique routes", labels, nil)
mergedLocalRIBSingleSourceRouteCount = prometheus.NewDesc(prefix+"merged_locrib_single_source_route_count", "Number of routes seen from single source", labels, nil)
}
// NewCollector creates a new collector instance for the given RIS mirror server // NewCollector creates a new collector instance for the given RIS mirror server
func NewCollector(risMirror *rismirror.RISMirror) prometheus.Collector { func NewCollector(risMirror *rismirror.RISMirror) prometheus.Collector {
return &risCollector{ return &risCollector{
...@@ -26,6 +41,9 @@ type risCollector struct { ...@@ -26,6 +41,9 @@ type risCollector struct {
// Describe conforms to the prometheus collector interface // Describe conforms to the prometheus collector interface
func (c *risCollector) Describe(ch chan<- *prometheus.Desc) { func (c *risCollector) Describe(ch chan<- *prometheus.Desc) {
ch <- mergedLocalRIBRouteCount
ch <- mergedLocalRIBSingleSourceRouteCount
vrf_prom.DescribeRouter(ch) vrf_prom.DescribeRouter(ch)
} }
...@@ -40,4 +58,32 @@ func (c *risCollector) collectForRouter(ch chan<- prometheus.Metric, rtr *metric ...@@ -40,4 +58,32 @@ func (c *risCollector) collectForRouter(ch chan<- prometheus.Metric, rtr *metric
for _, vrfMetric := range rtr.VRFMetrics { for _, vrfMetric := range rtr.VRFMetrics {
vrf_prom.CollectForVRFRouter(ch, rtr.SysName, rtr.Address.String(), vrfMetric) vrf_prom.CollectForVRFRouter(ch, rtr.SysName, rtr.Address.String(), vrfMetric)
} }
for _, x := range rtr.InternalVRFMetrics {
c.collectMergedLocRIBMetrics(ch, rtr, x)
}
}
func (c *risCollector) collectMergedLocRIBMetrics(ch chan<- prometheus.Metric, rtr *metrics.RISMirrorRouterMetrics, v *metrics.InternalVRFMetrics) {
ch <- prometheus.MustNewConstMetric(mergedLocalRIBRouteCount, prometheus.GaugeValue, float64(v.MergedLocRIBMetricsIPv4Unicast.UniqueRouteCount),
getMergedLocRIBMetricsLabels(rtr, v, packet.IPv4AFI)...)
ch <- prometheus.MustNewConstMetric(mergedLocalRIBRouteCount, prometheus.GaugeValue, float64(v.MergedLocRIBMetricsIPv6Unicast.UniqueRouteCount),
getMergedLocRIBMetricsLabels(rtr, v, packet.IPv6AFI)...)
ch <- prometheus.MustNewConstMetric(mergedLocalRIBSingleSourceRouteCount, prometheus.GaugeValue, float64(v.MergedLocRIBMetricsIPv4Unicast.RoutesWithSingleSourceCount),
getMergedLocRIBMetricsLabels(rtr, v, packet.IPv4AFI)...)
ch <- prometheus.MustNewConstMetric(mergedLocalRIBSingleSourceRouteCount, prometheus.GaugeValue, float64(v.MergedLocRIBMetricsIPv6Unicast.RoutesWithSingleSourceCount),
getMergedLocRIBMetricsLabels(rtr, v, packet.IPv6AFI)...)
}
func getMergedLocRIBMetricsLabels(rtr *metrics.RISMirrorRouterMetrics, v *metrics.InternalVRFMetrics, afi uint8) []string {
ret := []string{rtr.SysName, rtr.Address.String(), vrf.RouteDistinguisherHumanReadable(v.RD), fmt.Sprintf("%d", afi)}
if afi == packet.IPv4AFI {
return append(ret, v.MergedLocRIBMetricsIPv4Unicast.RIBName)
}
return append(ret, v.MergedLocRIBMetricsIPv6Unicast.RIBName)
} }
...@@ -7,6 +7,7 @@ import ( ...@@ -7,6 +7,7 @@ import (
"github.com/bio-routing/bio-rd/route" "github.com/bio-routing/bio-rd/route"
routeapi "github.com/bio-routing/bio-rd/route/api" routeapi "github.com/bio-routing/bio-rd/route/api"
"github.com/bio-routing/bio-rd/routingtable/locRIB" "github.com/bio-routing/bio-rd/routingtable/locRIB"
"github.com/bio-routing/bio-rd/routingtable/mergedlocrib/metrics"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
...@@ -14,7 +15,7 @@ import ( ...@@ -14,7 +15,7 @@ import (
// MergedLocRIB provides an deduplicated routing table // MergedLocRIB provides an deduplicated routing table
type MergedLocRIB struct { type MergedLocRIB struct {
routes map[[20]byte]*routeContainer routes map[[20]byte]*routeContainer
routesMu sync.Mutex routesMu sync.RWMutex
locRIB *locRIB.LocRIB locRIB *locRIB.LocRIB
} }
...@@ -104,3 +105,27 @@ func hashRoute(route *routeapi.Route) ([20]byte, error) { ...@@ -104,3 +105,27 @@ func hashRoute(route *routeapi.Route) ([20]byte, error) {
return res, nil return res, nil
} }
// Metrics gets the metrics
func (rtm *MergedLocRIB) Metrics() *metrics.MergedLocRIBMetrics {
rtm.routesMu.RLock()
defer rtm.routesMu.RUnlock()
return &metrics.MergedLocRIBMetrics{
RIBName: rtm.locRIB.Name(),
UniqueRouteCount: uint64(len(rtm.routes)),
RoutesWithSingleSourceCount: rtm._getRoutesWithSingleSourceCount(),
}
}
func (rtm *MergedLocRIB) _getRoutesWithSingleSourceCount() uint64 {
n := uint64(0)
for _, r := range rtm.routes {
if len(r.sources) == 1 {
n++
}
}
return n
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment