@@ -13,6 +13,7 @@ import (
1313 "context"
1414 "encoding/json"
1515 "fmt"
16+ "github.com/prometheus/client_golang/prometheus"
1617 "reflect"
1718 "time"
1819
@@ -23,6 +24,7 @@ import (
2324
2425 "github.com/oracle/oci-native-ingress-controller/pkg/certificate"
2526 "github.com/oracle/oci-native-ingress-controller/pkg/loadbalancer"
27+ "github.com/oracle/oci-native-ingress-controller/pkg/metric"
2628 "github.com/oracle/oci-native-ingress-controller/pkg/state"
2729 "github.com/oracle/oci-native-ingress-controller/pkg/util"
2830
@@ -60,18 +62,14 @@ type Controller struct {
6062
6163 lbClient * loadbalancer.LoadBalancerClient
6264 certificatesClient * certificate.CertificatesClient
65+ metricsCollector * metric.IngressCollector
6366}
6467
6568// 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 {
7573
7674 c := & Controller {
7775 controllerClass : controllerClass ,
@@ -84,6 +82,7 @@ func NewController(
8482 lbClient : lbClient ,
8583 certificatesClient : certificatesClient ,
8684 queue : workqueue .NewRateLimitingQueue (workqueue .NewItemExponentialFailureRateLimiter (10 * time .Second , 5 * time .Minute )),
85+ metricsCollector : metric .NewIngressCollector (controllerClass , reg ),
8786 }
8887
8988 ingressInformer .Informer ().AddEventHandler (
@@ -103,17 +102,18 @@ func (c *Controller) enqueueIngress(ingress *networkingv1.Ingress) {
103102 utilruntime .HandleError (fmt .Errorf ("couldn't get key for object %#v: %v" , ingress , err ))
104103 return
105104 }
106-
107105 c .queue .Add (key )
108106}
109107
110108func (c * Controller ) ingressAdd (obj interface {}) {
109+ c .metricsCollector .IncrementIngressAddOperation ()
111110 ic := obj .(* networkingv1.Ingress )
112111 klog .V (4 ).InfoS ("Adding ingress" , "ingress" , klog .KObj (ic ))
113112 c .enqueueIngress (ic )
114113}
115114
116115func (c * Controller ) ingressUpdate (old , new interface {}) {
116+ c .metricsCollector .IncrementIngressUpdateOperation ()
117117 oldIngress := old .(* networkingv1.Ingress )
118118 newIngress := new .(* networkingv1.Ingress )
119119
@@ -122,6 +122,7 @@ func (c *Controller) ingressUpdate(old, new interface{}) {
122122}
123123
124124func (c * Controller ) ingressDelete (obj interface {}) {
125+ c .metricsCollector .IncrementIngressDeleteOperation ()
125126 ic , ok := obj .(* networkingv1.Ingress )
126127 if ! ok {
127128 tombstone , ok := obj .(cache.DeletedFinalStateUnknown )
@@ -151,16 +152,23 @@ func (c *Controller) processNextItem() bool {
151152 // parallel.
152153 defer c .queue .Done (key )
153154
155+ // ingress_sync_time
156+ startBuildTime := util .GetCurrentTimeInUnixMillis ()
157+
154158 // Invoke the method containing the business logic
155159 err := c .sync (key .(string ))
156160
161+ endBuildTime := util .GetCurrentTimeInUnixMillis ()
162+ c .metricsCollector .AddIngressSyncTime (util .GetTimeDifferenceInSeconds (startBuildTime , endBuildTime ))
163+
157164 // Handle the error if something went wrong during the execution of the business logic
158165 c .handleErr (err , key )
159166 return true
160167}
161168
162169// sync is the business logic of the controller.
163170func (c * Controller ) sync (key string ) error {
171+ c .metricsCollector .IncrementSyncCount ()
164172 namespace , name , err := cache .SplitMetaNamespaceKey (key )
165173 if err != nil {
166174 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
285293func (c * Controller ) ensureIngress (ingress * networkingv1.Ingress , ingressClass * networkingv1.IngressClass ) error {
286294
287295 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 )
289297 ingressConfigError := stateStore .BuildState (ingressClass )
290298
291299 if ingressConfigError != nil {
@@ -316,6 +324,7 @@ func (c *Controller) ensureIngress(ingress *networkingv1.Ingress, ingressClass *
316324 backendSetsToCreate := desiredBackendSets .Difference (actualBackendSets )
317325
318326 for _ , bsName := range backendSetsToCreate .List () {
327+ startBuildTime := util .GetCurrentTimeInUnixMillis ()
319328 klog .V (2 ).InfoS ("creating backend set for ingress" , "ingress" , klog .KObj (ingress ), "backendSetName" , bsName )
320329 artifact , artifactType := stateStore .GetTLSConfigForBackendSet (bsName )
321330 backendSetSslConfig , err := getSSLConfigForBackendSet (ingress .Namespace , artifactType , artifact , lb , bsName , c )
@@ -329,6 +338,8 @@ func (c *Controller) ensureIngress(ingress *networkingv1.Ingress, ingressClass *
329338 if err != nil {
330339 return err
331340 }
341+ endBuildTime := util .GetCurrentTimeInUnixMillis ()
342+ c .metricsCollector .AddBackendCreationTime (util .GetTimeDifferenceInSeconds (startBuildTime , endBuildTime ))
332343 }
333344
334345 // Determine listeners... This is based off path ports.
@@ -380,7 +391,7 @@ func (c *Controller) ensureIngress(ingress *networkingv1.Ingress, ingressClass *
380391}
381392
382393func 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 )
384395 ingressConfigError := stateStore .BuildState (ingressClass )
385396
386397 if ingressConfigError != nil {
@@ -577,6 +588,7 @@ func getSSLConfigForListener(namespace string, listener *ociloadbalancer.Listene
577588}
578589
579590func syncListener (namespace string , stateStore * state.StateStore , lbId * string , listenerName string , c * Controller ) error {
591+ startTime := util .GetCurrentTimeInUnixMillis ()
580592 lb , etag , err := c .lbClient .GetLoadBalancer (context .TODO (), * lbId )
581593 if err != nil {
582594 return err
@@ -617,10 +629,14 @@ func syncListener(namespace string, stateStore *state.StateStore, lbId *string,
617629 return err
618630 }
619631 }
632+ endTime := util .GetCurrentTimeInUnixMillis ()
633+ c .metricsCollector .AddIngressListenerSyncTime (util .GetTimeDifferenceInSeconds (startTime , endTime ))
620634 return nil
621635}
622636
623637func syncBackendSet (ingress * networkingv1.Ingress , lbID string , backendSetName string , stateStore * state.StateStore , c * Controller ) error {
638+
639+ startTime := util .GetCurrentTimeInUnixMillis ()
624640 lb , etag , err := c .lbClient .GetLoadBalancer (context .TODO (), lbID )
625641 if err != nil {
626642 return err
@@ -665,6 +681,8 @@ func syncBackendSet(ingress *networkingv1.Ingress, lbID string, backendSetName s
665681 }
666682 }
667683
684+ endTime := util .GetCurrentTimeInUnixMillis ()
685+ c .metricsCollector .AddIngressBackendSyncTime (util .GetTimeDifferenceInSeconds (startTime , endTime ))
668686 return nil
669687}
670688
0 commit comments