@@ -13,6 +13,7 @@ import (
13
13
"context"
14
14
"encoding/json"
15
15
"fmt"
16
+ "github.com/prometheus/client_golang/prometheus"
16
17
"reflect"
17
18
"time"
18
19
@@ -23,6 +24,7 @@ import (
23
24
24
25
"github.com/oracle/oci-native-ingress-controller/pkg/certificate"
25
26
"github.com/oracle/oci-native-ingress-controller/pkg/loadbalancer"
27
+ "github.com/oracle/oci-native-ingress-controller/pkg/metric"
26
28
"github.com/oracle/oci-native-ingress-controller/pkg/state"
27
29
"github.com/oracle/oci-native-ingress-controller/pkg/util"
28
30
@@ -60,18 +62,14 @@ type Controller struct {
60
62
61
63
lbClient * loadbalancer.LoadBalancerClient
62
64
certificatesClient * certificate.CertificatesClient
65
+ metricsCollector * metric.IngressCollector
63
66
}
64
67
65
68
// NewController creates a new Controller.
66
- func NewController (
67
- controllerClass string ,
68
- defaultCompartmentId string ,
69
- ingressClassInformer networkinginformers.IngressClassInformer ,
70
- ingressInformer networkinginformers.IngressInformer ,
71
- client kubernetes.Interface ,
72
- lbClient * loadbalancer.LoadBalancerClient ,
73
- certificatesClient * certificate.CertificatesClient ,
74
- ) * Controller {
69
+ func NewController (controllerClass string , defaultCompartmentId string ,
70
+ ingressClassInformer networkinginformers.IngressClassInformer , ingressInformer networkinginformers.IngressInformer ,
71
+ client kubernetes.Interface , lbClient * loadbalancer.LoadBalancerClient , certificatesClient * certificate.CertificatesClient ,
72
+ reg * prometheus.Registry ) * Controller {
75
73
76
74
c := & Controller {
77
75
controllerClass : controllerClass ,
@@ -84,6 +82,7 @@ func NewController(
84
82
lbClient : lbClient ,
85
83
certificatesClient : certificatesClient ,
86
84
queue : workqueue .NewRateLimitingQueue (workqueue .NewItemExponentialFailureRateLimiter (10 * time .Second , 5 * time .Minute )),
85
+ metricsCollector : metric .NewIngressCollector (controllerClass , reg ),
87
86
}
88
87
89
88
ingressInformer .Informer ().AddEventHandler (
@@ -103,17 +102,18 @@ func (c *Controller) enqueueIngress(ingress *networkingv1.Ingress) {
103
102
utilruntime .HandleError (fmt .Errorf ("couldn't get key for object %#v: %v" , ingress , err ))
104
103
return
105
104
}
106
-
107
105
c .queue .Add (key )
108
106
}
109
107
110
108
func (c * Controller ) ingressAdd (obj interface {}) {
109
+ c .metricsCollector .IncrementIngressAddOperation ()
111
110
ic := obj .(* networkingv1.Ingress )
112
111
klog .V (4 ).InfoS ("Adding ingress" , "ingress" , klog .KObj (ic ))
113
112
c .enqueueIngress (ic )
114
113
}
115
114
116
115
func (c * Controller ) ingressUpdate (old , new interface {}) {
116
+ c .metricsCollector .IncrementIngressUpdateOperation ()
117
117
oldIngress := old .(* networkingv1.Ingress )
118
118
newIngress := new .(* networkingv1.Ingress )
119
119
@@ -122,6 +122,7 @@ func (c *Controller) ingressUpdate(old, new interface{}) {
122
122
}
123
123
124
124
func (c * Controller ) ingressDelete (obj interface {}) {
125
+ c .metricsCollector .IncrementIngressDeleteOperation ()
125
126
ic , ok := obj .(* networkingv1.Ingress )
126
127
if ! ok {
127
128
tombstone , ok := obj .(cache.DeletedFinalStateUnknown )
@@ -151,16 +152,23 @@ func (c *Controller) processNextItem() bool {
151
152
// parallel.
152
153
defer c .queue .Done (key )
153
154
155
+ // ingress_sync_time
156
+ startBuildTime := util .GetCurrentTimeInUnixMillis ()
157
+
154
158
// Invoke the method containing the business logic
155
159
err := c .sync (key .(string ))
156
160
161
+ endBuildTime := util .GetCurrentTimeInUnixMillis ()
162
+ c .metricsCollector .AddIngressSyncTime (util .GetTimeDifferenceInSeconds (startBuildTime , endBuildTime ))
163
+
157
164
// Handle the error if something went wrong during the execution of the business logic
158
165
c .handleErr (err , key )
159
166
return true
160
167
}
161
168
162
169
// sync is the business logic of the controller.
163
170
func (c * Controller ) sync (key string ) error {
171
+ c .metricsCollector .IncrementSyncCount ()
164
172
namespace , name , err := cache .SplitMetaNamespaceKey (key )
165
173
if err != nil {
166
174
klog .ErrorS (err , "Failed to split meta namespace cache key" , "cacheKey" , key )
@@ -285,7 +293,7 @@ func (c *Controller) ensureLoadBalancerIP(lbID string, ingress *networkingv1.Ing
285
293
func (c * Controller ) ensureIngress (ingress * networkingv1.Ingress , ingressClass * networkingv1.IngressClass ) error {
286
294
287
295
klog .Infof ("Processing ingress %s/%s" , ingressClass .Name , ingress .Name )
288
- stateStore := state .NewStateStore (c .ingressClassLister , c .ingressLister , c .serviceLister )
296
+ stateStore := state .NewStateStore (c .ingressClassLister , c .ingressLister , c .serviceLister , c . metricsCollector )
289
297
ingressConfigError := stateStore .BuildState (ingressClass )
290
298
291
299
if ingressConfigError != nil {
@@ -316,6 +324,7 @@ func (c *Controller) ensureIngress(ingress *networkingv1.Ingress, ingressClass *
316
324
backendSetsToCreate := desiredBackendSets .Difference (actualBackendSets )
317
325
318
326
for _ , bsName := range backendSetsToCreate .List () {
327
+ startBuildTime := util .GetCurrentTimeInUnixMillis ()
319
328
klog .V (2 ).InfoS ("creating backend set for ingress" , "ingress" , klog .KObj (ingress ), "backendSetName" , bsName )
320
329
artifact , artifactType := stateStore .GetTLSConfigForBackendSet (bsName )
321
330
backendSetSslConfig , err := getSSLConfigForBackendSet (ingress .Namespace , artifactType , artifact , lb , bsName , c )
@@ -329,6 +338,8 @@ func (c *Controller) ensureIngress(ingress *networkingv1.Ingress, ingressClass *
329
338
if err != nil {
330
339
return err
331
340
}
341
+ endBuildTime := util .GetCurrentTimeInUnixMillis ()
342
+ c .metricsCollector .AddBackendCreationTime (util .GetTimeDifferenceInSeconds (startBuildTime , endBuildTime ))
332
343
}
333
344
334
345
// Determine listeners... This is based off path ports.
@@ -380,7 +391,7 @@ func (c *Controller) ensureIngress(ingress *networkingv1.Ingress, ingressClass *
380
391
}
381
392
382
393
func handleIngressDelete (c * Controller , ingressClass * networkingv1.IngressClass ) error {
383
- stateStore := state .NewStateStore (c .ingressClassLister , c .ingressLister , c .serviceLister )
394
+ stateStore := state .NewStateStore (c .ingressClassLister , c .ingressLister , c .serviceLister , c . metricsCollector )
384
395
ingressConfigError := stateStore .BuildState (ingressClass )
385
396
386
397
if ingressConfigError != nil {
@@ -577,6 +588,7 @@ func getSSLConfigForListener(namespace string, listener *ociloadbalancer.Listene
577
588
}
578
589
579
590
func syncListener (namespace string , stateStore * state.StateStore , lbId * string , listenerName string , c * Controller ) error {
591
+ startTime := util .GetCurrentTimeInUnixMillis ()
580
592
lb , etag , err := c .lbClient .GetLoadBalancer (context .TODO (), * lbId )
581
593
if err != nil {
582
594
return err
@@ -617,10 +629,14 @@ func syncListener(namespace string, stateStore *state.StateStore, lbId *string,
617
629
return err
618
630
}
619
631
}
632
+ endTime := util .GetCurrentTimeInUnixMillis ()
633
+ c .metricsCollector .AddIngressListenerSyncTime (util .GetTimeDifferenceInSeconds (startTime , endTime ))
620
634
return nil
621
635
}
622
636
623
637
func syncBackendSet (ingress * networkingv1.Ingress , lbID string , backendSetName string , stateStore * state.StateStore , c * Controller ) error {
638
+
639
+ startTime := util .GetCurrentTimeInUnixMillis ()
624
640
lb , etag , err := c .lbClient .GetLoadBalancer (context .TODO (), lbID )
625
641
if err != nil {
626
642
return err
@@ -665,6 +681,8 @@ func syncBackendSet(ingress *networkingv1.Ingress, lbID string, backendSetName s
665
681
}
666
682
}
667
683
684
+ endTime := util .GetCurrentTimeInUnixMillis ()
685
+ c .metricsCollector .AddIngressBackendSyncTime (util .GetTimeDifferenceInSeconds (startTime , endTime ))
668
686
return nil
669
687
}
670
688
0 commit comments