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
import (
"net"
mlrib_metrics "github.com/bio-routing/bio-rd/routingtable/mergedlocrib/metrics"
vrf_metrics "github.com/bio-routing/bio-rd/routingtable/vrf/metrics"
)
......@@ -13,12 +14,15 @@ type RISMirrorMetrics struct {
// RISMirrorRouterMetrics contains a routers RIS mirror metrics
type RISMirrorRouterMetrics struct {
// Routers IP Address
Address net.IP
// SysName of the monitored router
SysName string
Address net.IP
SysName string
VRFMetrics []*vrf_metrics.VRFMetrics
InternalVRFMetrics []*InternalVRFMetrics
}
// VRFMetrics represent per VRF metrics
VRFMetrics []*vrf_metrics.VRFMetrics
// InternalVRFMetrics represents internal VRF metrics (_vrf)
type InternalVRFMetrics struct {
RD uint64
MergedLocRIBMetricsIPv4Unicast *mlrib_metrics.MergedLocRIBMetrics
MergedLocRIBMetricsIPv6Unicast *mlrib_metrics.MergedLocRIBMetrics
}
......@@ -58,6 +58,7 @@ func (rism *RISMirror) GetRouters() []server.RouterInterface {
return res
}
// Metrics gets a RISMirrors metrics
func (rism *RISMirror) Metrics() *metrics.RISMirrorMetrics {
res := &metrics.RISMirrorMetrics{
Routers: make([]*metrics.RISMirrorRouterMetrics, 0),
......@@ -68,9 +69,18 @@ func (rism *RISMirror) Metrics() *metrics.RISMirrorMetrics {
for _, r := range rism.routers {
rm := &metrics.RISMirrorRouterMetrics{
Address: r.Address(),
SysName: r.Name(),
VRFMetrics: vrf.Metrics(r.(*Router).vrfRegistry),
Address: r.Address(),
SysName: r.Name(),
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)
......
......@@ -60,11 +60,13 @@ func (r *Router) addVRF(rd uint64, sources []*grpc.ClientConn) {
}
func (r *Router) connectVRF(rd uint64, src *grpc.ClientConn, afi uint8) {
risclient.New(&risclient.Request{
rc := risclient.New(&risclient.Request{
Router: r.name,
VRFRD: rd,
AFI: apiAFI(afi),
}, src, r.vrfs[rd].getRIB(afi))
rc.Start()
}
func apiAFI(afi uint8) api.ObserveRIBRequest_AFISAFI {
......
package prom
import (
"fmt"
"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/protocols/bgp/packet"
"github.com/bio-routing/bio-rd/routingtable/vrf"
"github.com/prometheus/client_golang/prometheus"
vrf_prom "github.com/bio-routing/bio-rd/metrics/vrf/adapter/prom"
......@@ -12,6 +16,17 @@ const (
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
func NewCollector(risMirror *rismirror.RISMirror) prometheus.Collector {
return &risCollector{
......@@ -26,6 +41,9 @@ type risCollector struct {
// Describe conforms to the prometheus collector interface
func (c *risCollector) Describe(ch chan<- *prometheus.Desc) {
ch <- mergedLocalRIBRouteCount
ch <- mergedLocalRIBSingleSourceRouteCount
vrf_prom.DescribeRouter(ch)
}
......@@ -40,4 +58,32 @@ func (c *risCollector) collectForRouter(ch chan<- prometheus.Metric, rtr *metric
for _, vrfMetric := range rtr.VRFMetrics {
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 (
"github.com/bio-routing/bio-rd/route"
routeapi "github.com/bio-routing/bio-rd/route/api"
"github.com/bio-routing/bio-rd/routingtable/locRIB"
"github.com/bio-routing/bio-rd/routingtable/mergedlocrib/metrics"
"github.com/golang/protobuf/proto"
"github.com/pkg/errors"
)
......@@ -14,7 +15,7 @@ import (
// MergedLocRIB provides an deduplicated routing table
type MergedLocRIB struct {
routes map[[20]byte]*routeContainer
routesMu sync.Mutex
routesMu sync.RWMutex
locRIB *locRIB.LocRIB
}
......@@ -104,3 +105,27 @@ func hashRoute(route *routeapi.Route) ([20]byte, error) {
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