7
7
"time"
8
8
9
9
"github.com./cloudnativelabs/kube-router/v2/pkg/healthcheck"
10
+ "github.com./cloudnativelabs/kube-router/v2/pkg/metrics"
11
+ "github.com./prometheus/client_golang/prometheus"
10
12
"github.com./vishvananda/netlink"
11
13
"k8s.io/klog/v2"
12
14
)
@@ -26,6 +28,7 @@ type RouteSync struct {
26
28
injectedRoutesSyncPeriod time.Duration
27
29
mutex sync.Mutex
28
30
routeReplacer func (route * netlink.Route ) error
31
+ metricsEnabled bool
29
32
}
30
33
31
34
// addInjectedRoute adds a route to the route map that is regularly synced to the kernel's routing table
@@ -34,6 +37,10 @@ func (rs *RouteSync) AddInjectedRoute(dst *net.IPNet, route *netlink.Route) {
34
37
defer rs .mutex .Unlock ()
35
38
klog .V (3 ).Infof ("Adding route for destination: %s" , dst )
36
39
rs .routeTableStateMap [dst .String ()] = route
40
+ if rs .metricsEnabled {
41
+ metrics .ControllerHostRoutesAdded .Inc ()
42
+ metrics .ControllerHostRoutesSynced .Set (float64 (len (rs .routeTableStateMap )))
43
+ }
37
44
}
38
45
39
46
// delInjectedRoute delete a route from the route map that is regularly synced to the kernel's routing table
@@ -44,10 +51,21 @@ func (rs *RouteSync) DelInjectedRoute(dst *net.IPNet) {
44
51
klog .V (3 ).Infof ("Removing route for destination: %s" , dst )
45
52
delete (rs .routeTableStateMap , dst .String ())
46
53
}
54
+ if rs .metricsEnabled {
55
+ metrics .ControllerHostRoutesRemoved .Inc ()
56
+ metrics .ControllerHostRoutesSynced .Set (float64 (len (rs .routeTableStateMap )))
57
+ }
47
58
}
48
59
49
60
// syncLocalRouteTable iterates over the local route state map and syncs all routes to the kernel's routing table
50
61
func (rs * RouteSync ) SyncLocalRouteTable () error {
62
+ if rs .metricsEnabled {
63
+ startSyncTime := time .Now ()
64
+ defer func (startTime time.Time ) {
65
+ runTime := time .Since (startTime )
66
+ metrics .ControllerHostRoutesSyncTime .Observe (runTime .Seconds ())
67
+ }(startSyncTime )
68
+ }
51
69
rs .mutex .Lock ()
52
70
defer rs .mutex .Unlock ()
53
71
klog .V (2 ).Infof ("Running local route table synchronization" )
@@ -61,6 +79,9 @@ func (rs *RouteSync) SyncLocalRouteTable() error {
61
79
}
62
80
}
63
81
}
82
+ if rs .metricsEnabled {
83
+ metrics .ControllerHostRoutesSynced .Set (float64 (len (rs .routeTableStateMap )))
84
+ }
64
85
return nil
65
86
}
66
87
@@ -94,12 +115,20 @@ func (rs *RouteSync) Run(healthChan chan<- *healthcheck.ControllerHeartbeat, sto
94
115
95
116
// NewRouteSyncer creates a new routeSyncer that, when run, will sync routes kept in its local state table every
96
117
// syncPeriod
97
- func NewRouteSyncer (syncPeriod time.Duration ) * RouteSync {
118
+ func NewRouteSyncer (syncPeriod time.Duration , registerMetrics bool ) * RouteSync {
98
119
rs := RouteSync {}
99
120
rs .routeTableStateMap = make (map [string ]* netlink.Route )
100
121
rs .injectedRoutesSyncPeriod = syncPeriod
101
122
rs .mutex = sync.Mutex {}
102
123
// We substitute the RouteReplace function here so that we can easily monkey patch it in our unit tests
103
124
rs .routeReplacer = netlink .RouteReplace
125
+ rs .metricsEnabled = registerMetrics
126
+
127
+ // Register Metrics
128
+ if registerMetrics {
129
+ prometheus .MustRegister (metrics .ControllerHostRoutesSynced , metrics .ControllerHostRoutesSyncTime ,
130
+ metrics .ControllerHostRoutesAdded , metrics .ControllerHostRoutesRemoved )
131
+ }
132
+
104
133
return & rs
105
134
}
0 commit comments