Newer
Older
package server
import (
"github.com/bio-routing/bio-rd/protocols/bgp/metrics"
)
type metricsService struct {
server *bgpServer
}
func (b *metricsService) metrics() *metrics.BGPMetrics {
return &metrics.BGPMetrics{
Peers: b.peerMetrics(),
}
}
func (b *metricsService) peerMetrics() []*metrics.BGPPeerMetrics {
peers := make([]*metrics.BGPPeerMetrics, 0)
for _, peer := range b.server.peers.list() {
peers = append(peers, m)
}
return peers
}
m := &metrics.BGPPeerMetrics{
ASN: peer.peerASN,
LocalASN: peer.localASN,
IP: peer.addr,
AddressFamilies: make([]*metrics.BGPAddressFamilyMetrics, 0),
VRF: peer.vrf.Name(),
}
var fsms = peer.fsms
if len(fsms) == 0 {
return m
}
fsm := fsms[0]
m.Up = m.State == metrics.StateEstablished
if m.Up {
m.Since = fsm.establishedTime
}
m.UpdatesReceived = fsm.counters.updatesReceived
m.UpdatesSent = fsm.counters.updatesSent
fsm.stateMu.RLock()
defer fsm.stateMu.RUnlock()
if fsm.ribsInitialized {
if peer.ipv4 != nil {
m.AddressFamilies = append(m.AddressFamilies, metricsForFamily(fsm.ipv4Unicast))
}
if peer.ipv6 != nil {
m.AddressFamilies = append(m.AddressFamilies, metricsForFamily(fsm.ipv6Unicast))
}
func metricsForFamily(family *fsmAddressFamily) *metrics.BGPAddressFamilyMetrics {
m := &metrics.BGPAddressFamilyMetrics{
AFI: family.afi,
SAFI: family.safi,
RoutesReceived: uint64(family.adjRIBIn.RouteCount()),
}
if family.adjRIBOut != nil {
m.RoutesSent = uint64(family.adjRIBOut.RouteCount())
}
return m
switch fsm.state.(type) {
case *idleState:
return metrics.StateIdle
return metrics.StateConnect
return metrics.StateActive
return metrics.StateOpenSent
return metrics.StateOpenConfirm
return metrics.StateEstablished
return metrics.StateDown