Skip to content

Commit 0be45ff

Browse files
committed
feat(gobgp): add kube_router_bgp_peer_info metric
Replace the misleading kube_router_controller_bgp_peers gauge which only counts 'cluster nodes' with a new per peer metric kube_router_bgp_peer_info with 'GaugeVec' that exposes actual BGP session state from gobgp. labels include peer address, asn, type, and state. Metric value is 1 if established and 0 otherwise. Closes: #848 Signed-off-by: Roman Kuzmitskii <roman@damex.org>
1 parent da98050 commit 0be45ff

File tree

3 files changed

+27
-9
lines changed

3 files changed

+27
-9
lines changed

pkg/controllers/routing/bgp_peers.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,6 @@ func (nrc *NetworkRoutingController) syncInternalPeers() {
8888
// get the current list of the nodes from API server
8989
nodes := nrc.nodeLister.List()
9090

91-
if nrc.MetricsEnabled {
92-
metrics.ControllerBPGpeers.Set(float64(len(nodes)))
93-
}
9491
// establish peer and add Pod CIDRs with current set of nodes
9592
currentNodes := make([]string, 0)
9693
for _, obj := range nodes {

pkg/controllers/routing/network_routes_controller.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,10 @@ func (nrc *NetworkRoutingController) Run(
436436
nrc.syncInternalPeers()
437437
}
438438

439+
if nrc.MetricsEnabled {
440+
nrc.updateBGPPeerMetrics()
441+
}
442+
439443
if err == nil {
440444
healthcheck.SendHeartBeat(healthChan, healthcheck.NetworkRoutesController)
441445
} else {
@@ -729,6 +733,23 @@ func (nrc *NetworkRoutingController) injectRoute(path *apiutil.Path) error {
729733
return nrc.routeSyncer.SyncLocalRouteTable()
730734
}
731735

736+
func (nrc *NetworkRoutingController) updateBGPPeerMetrics() {
737+
metrics.ControllerBGPPeerInfo.Reset()
738+
err := nrc.bgpServer.ListPeer(context.Background(), &gobgpapi.ListPeerRequest{}, func(peer *gobgpapi.Peer) {
739+
if peer.Conf == nil || peer.State == nil {
740+
return
741+
}
742+
peerAddress := peer.Conf.NeighborAddress
743+
peerType := strings.ToLower(strings.TrimPrefix(peer.State.GetType().String(), "PEER_TYPE_"))
744+
peerASN := strconv.FormatUint(uint64(peer.Conf.PeerAsn), 10)
745+
peerState := strings.ToLower(strings.TrimPrefix(peer.State.SessionState.String(), "SESSION_STATE_"))
746+
metrics.ControllerBGPPeerInfo.WithLabelValues(peerAddress, peerType, peerASN, peerState).Set(1)
747+
})
748+
if err != nil {
749+
klog.Errorf("error updating BGP peer metrics: %v", err)
750+
}
751+
}
752+
732753
func (nrc *NetworkRoutingController) isPeerEstablished(peerIP string) (bool, error) {
733754
var peerConnected bool
734755
peerFunc := func(peer *gobgpapi.Peer) {
@@ -1227,7 +1248,7 @@ func NewNetworkRoutingController(clientset kubernetes.Interface,
12271248
metrics.DefaultRegisterer.MustRegister(metrics.ControllerBGPadvertisementsReceived)
12281249
metrics.DefaultRegisterer.MustRegister(metrics.ControllerBGPadvertisementsSent)
12291250
metrics.DefaultRegisterer.MustRegister(metrics.ControllerBGPInternalPeersSyncTime)
1230-
metrics.DefaultRegisterer.MustRegister(metrics.ControllerBPGpeers)
1251+
metrics.DefaultRegisterer.MustRegister(metrics.ControllerBGPPeerInfo)
12311252
metrics.DefaultRegisterer.MustRegister(metrics.ControllerRoutesSyncTime)
12321253
nrc.MetricsEnabled = true
12331254
}

pkg/metrics/metrics_controller.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,12 @@ var (
158158
Name: "controller_routes_sync_time",
159159
Help: "Time it took for controller to sync routes",
160160
})
161-
// ControllerBPGpeers BGP peers in the runtime configuration
162-
ControllerBPGpeers = prometheus.NewGauge(prometheus.GaugeOpts{
161+
// ControllerBGPPeerInfo BGP peer information
162+
ControllerBGPPeerInfo = prometheus.NewGaugeVec(prometheus.GaugeOpts{
163163
Namespace: namespace,
164-
Name: "controller_bgp_peers",
165-
Help: "BGP peers in the runtime configuration",
166-
})
164+
Name: "bgp_peer_info",
165+
Help: "BGP peer information",
166+
}, []string{"address", "type", "asn", "state"})
167167
// ControllerBGPInternalPeersSyncTime Time it took to sync internal bgp peers
168168
ControllerBGPInternalPeersSyncTime = prometheus.NewHistogram(prometheus.HistogramOpts{
169169
Namespace: namespace,

0 commit comments

Comments
 (0)