@@ -43,19 +43,29 @@ var (
4343 },
4444 []string {label },
4545 )
46+ l4NetLBCount = metrics .NewGaugeVec (
47+ & metrics.GaugeOpts {
48+ Name : "number_of_l4_netlbs" ,
49+ Help : "Metric containing the number of NetLBs that can be filtered by feature labels and status" ,
50+ },
51+ []string {"status" , "deny_firewall" },
52+ )
4653)
4754
4855// init registers L4 internal loadbalancer usage metrics.
4956func init () {
5057 klog .V (3 ).Infof ("Registering Service Controller loadbalancer usage metrics %v" , l4ILBCount )
5158 legacyregistry .MustRegister (l4ILBCount )
59+ klog .V (3 ).Infof ("Registering Service Controller loadbalancer usage metrics %v" , l4NetLBCount )
60+ legacyregistry .MustRegister (l4NetLBCount )
5261}
5362
5463// LoadBalancerMetrics is a cache that contains loadbalancer service resource
5564// states for computing usage metrics.
5665type LoadBalancerMetrics struct {
5766 // l4ILBServiceMap is a map of service key and L4 ILB service state.
5867 l4ILBServiceMap map [string ]L4ILBServiceState
68+ l4NetLBMap map [string ]L4NetLBServiceState
5969
6070 sync.Mutex
6171}
@@ -97,13 +107,18 @@ type loadbalancerMetricsCollector interface {
97107 SetL4ILBService (svcKey string , state L4ILBServiceState )
98108 // DeleteL4ILBService removes the given L4 ILB service key.
99109 DeleteL4ILBService (svcKey string )
110+ // SetL4NetLBService adds/updates L4 NetLB service state for given service key.
111+ SetL4NetLBService (svcKey string , state L4NetLBServiceState )
112+ // DeleteL4NetLBService removes the given L4 NetLB service key.
113+ DeleteL4NetLBService (svcKey string )
100114}
101115
102116// newLoadBalancerMetrics initializes LoadBalancerMetrics and starts a goroutine
103117// to compute and export metrics periodically.
104118func newLoadBalancerMetrics () loadbalancerMetricsCollector {
105119 return & LoadBalancerMetrics {
106120 l4ILBServiceMap : make (map [string ]L4ILBServiceState ),
121+ l4NetLBMap : make (map [string ]L4NetLBServiceState ),
107122 }
108123}
109124
@@ -140,6 +155,11 @@ func (lm *LoadBalancerMetrics) DeleteL4ILBService(svcKey string) {
140155
141156// export computes and exports loadbalancer usage metrics.
142157func (lm * LoadBalancerMetrics ) export () {
158+ lm .exportILBMetrics ()
159+ lm .exportNetLBMetrics ()
160+ }
161+
162+ func (lm * LoadBalancerMetrics ) exportILBMetrics () {
143163 ilbCount := lm .computeL4ILBMetrics ()
144164 klog .V (5 ).Infof ("Exporting L4 ILB usage metrics: %#v" , ilbCount )
145165 for feature , count := range ilbCount {
@@ -180,3 +200,60 @@ func (lm *LoadBalancerMetrics) computeL4ILBMetrics() map[feature]int {
180200 klog .V (4 ).Info ("L4 ILB usage metrics computed." )
181201 return counts
182202}
203+
204+ // L4ServiceStatus denotes the status of the service
205+ type L4ServiceStatus string
206+
207+ // L4ServiceStatus denotes the status of the service
208+ const (
209+ StatusSuccess = L4ServiceStatus ("Success" )
210+ StatusUserError = L4ServiceStatus ("UserError" )
211+ StatusError = L4ServiceStatus ("Error" )
212+ StatusPersistentError = L4ServiceStatus ("PersistentError" )
213+ )
214+
215+ // DenyFirewallStatus represents IP stack used when the deny firewalls are provisioned.
216+ type DenyFirewallStatus string
217+
218+ // DenyFirewallStatus represents IP stack used when the deny firewalls are provisioned.
219+ const (
220+ DenyFirewallStatusUnknown = DenyFirewallStatus ("UNKNOWN" ) // Shouldn't happen, but if it does something is wrong.
221+ DenyFirewallStatusNone = DenyFirewallStatus ("" ) // Case when no firewalls have been provisioned yet or when the feature has not been enabled explicitly
222+ DenyFirewallStatusDisabled = DenyFirewallStatus ("DISABLED" ) // Case to mark when the feature has been enabled then explicitly disabled - for example when the feature is rolled back
223+ DenyFirewallStatusIPv4 = DenyFirewallStatus ("IPv4" )
224+ )
225+
226+ type L4NetLBServiceState struct {
227+ Status L4ServiceStatus
228+ DenyFirewall DenyFirewallStatus
229+ }
230+
231+ // SetL4NetLBService patches information about L4 NetLB
232+ func (lm * LoadBalancerMetrics ) SetL4NetLBService (svcKey string , state L4NetLBServiceState ) {
233+ lm .Lock ()
234+ defer lm .Unlock ()
235+
236+ lm .l4NetLBMap [svcKey ] = state
237+ }
238+
239+ // DeleteL4NetLBService removes the given L4 NetLB service key.
240+ func (lm * LoadBalancerMetrics ) DeleteL4NetLBService (svcKey string ) {
241+ lm .Lock ()
242+ defer lm .Unlock ()
243+
244+ delete (lm .l4NetLBMap , svcKey )
245+ }
246+
247+ // exportNetLBMetrics computes and exports loadbalancer usage metrics.
248+ func (lm * LoadBalancerMetrics ) exportNetLBMetrics () {
249+ lm .Lock ()
250+ defer lm .Unlock ()
251+
252+ klog .Info ("Exporting L4 NetLB usage metrics for services" , "serviceCount" , len (lm .l4NetLBMap ))
253+
254+ l4NetLBCount .Reset ()
255+ for _ , svcState := range lm .l4NetLBMap {
256+ l4NetLBCount .WithLabelValues (string (svcState .Status ), string (svcState .DenyFirewall )).Inc ()
257+ }
258+ klog .Info ("L4 NetLB usage metrics exported" )
259+ }
0 commit comments