Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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() {
m := b.metricsForPeer(peer)
peers = append(peers, m)
}
return peers
}
func (b *metricsService) metricsForPeer(peer *peer) *metrics.BGPPeerMetrics {
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.State = b.statusFromFSM(fsm)
m.Up = m.State == metrics.StateEstablished
if m.Up {
m.Since = fsm.establishedTime
}
m.UpdatesReceived = fsm.counters.updatesReceived
m.UpdatesSent = fsm.counters.updatesSent
if peer.ipv4 != nil {
m.AddressFamilies = append(m.AddressFamilies, b.metricsForFamily(fsm.ipv4Unicast))
}
if peer.ipv6 != nil {
m.AddressFamilies = append(m.AddressFamilies, b.metricsForFamily(fsm.ipv6Unicast))
}
return m
}
func (b *metricsService) metricsForFamily(family *fsmAddressFamily) *metrics.BGPAddressFamilyMetrics {
return &metrics.BGPAddressFamilyMetrics{
AFI: family.afi,
SAFI: family.safi,
RoutesReceived: uint64(family.adjRIBIn.RouteCount()),
RoutesSent: uint64(family.adjRIBOut.RouteCount()),
}
}
func (b *metricsService) statusFromFSM(fsm *FSM) uint8 {
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