@@ -3,6 +3,7 @@ package service
33import (
44 "context"
55 "fmt"
6+
67 "sigs.k8s.io/controller-runtime/pkg/reconcile"
78
89 "github.com/go-logr/logr"
@@ -18,6 +19,7 @@ import (
1819 elbv2deploy "sigs.k8s.io/aws-load-balancer-controller/pkg/deploy/elbv2"
1920 "sigs.k8s.io/aws-load-balancer-controller/pkg/deploy/tracking"
2021 "sigs.k8s.io/aws-load-balancer-controller/pkg/k8s"
22+ lbcmetrics "sigs.k8s.io/aws-load-balancer-controller/pkg/metrics/lbc"
2123 "sigs.k8s.io/aws-load-balancer-controller/pkg/model/core"
2224 elbv2model "sigs.k8s.io/aws-load-balancer-controller/pkg/model/elbv2"
2325 "sigs.k8s.io/aws-load-balancer-controller/pkg/networking"
@@ -39,17 +41,17 @@ func NewServiceReconciler(cloud services.Cloud, k8sClient client.Client, eventRe
3941 finalizerManager k8s.FinalizerManager , networkingSGManager networking.SecurityGroupManager ,
4042 networkingSGReconciler networking.SecurityGroupReconciler , subnetsResolver networking.SubnetsResolver ,
4143 vpcInfoProvider networking.VPCInfoProvider , elbv2TaggingManager elbv2deploy.TaggingManager , controllerConfig config.ControllerConfig ,
42- backendSGProvider networking.BackendSGProvider , sgResolver networking.SecurityGroupResolver , logger logr.Logger ) * serviceReconciler {
44+ backendSGProvider networking.BackendSGProvider , sgResolver networking.SecurityGroupResolver , logger logr.Logger , metricsCollector lbcmetrics. MetricCollector ) * serviceReconciler {
4345
4446 annotationParser := annotations .NewSuffixAnnotationParser (serviceAnnotationPrefix )
4547 trackingProvider := tracking .NewDefaultProvider (serviceTagPrefix , controllerConfig .ClusterName )
4648 serviceUtils := service .NewServiceUtils (annotationParser , serviceFinalizer , controllerConfig .ServiceConfig .LoadBalancerClass , controllerConfig .FeatureGates )
4749 modelBuilder := service .NewDefaultModelBuilder (annotationParser , subnetsResolver , vpcInfoProvider , cloud .VpcID (), trackingProvider ,
4850 elbv2TaggingManager , cloud .EC2 (), controllerConfig .FeatureGates , controllerConfig .ClusterName , controllerConfig .DefaultTags , controllerConfig .ExternalManagedTags ,
4951 controllerConfig .DefaultSSLPolicy , controllerConfig .DefaultTargetType , controllerConfig .DefaultLoadBalancerScheme , controllerConfig .FeatureGates .Enabled (config .EnableIPTargetType ), serviceUtils ,
50- backendSGProvider , sgResolver , controllerConfig .EnableBackendSecurityGroup , controllerConfig .DisableRestrictedSGRules , logger )
52+ backendSGProvider , sgResolver , controllerConfig .EnableBackendSecurityGroup , controllerConfig .DisableRestrictedSGRules , logger , metricsCollector )
5153 stackMarshaller := deploy .NewDefaultStackMarshaller ()
52- stackDeployer := deploy .NewDefaultStackDeployer (cloud , k8sClient , networkingSGManager , networkingSGReconciler , elbv2TaggingManager , controllerConfig , serviceTagPrefix , logger )
54+ stackDeployer := deploy .NewDefaultStackDeployer (cloud , k8sClient , networkingSGManager , networkingSGReconciler , elbv2TaggingManager , controllerConfig , serviceTagPrefix , logger , metricsCollector )
5355 return & serviceReconciler {
5456 k8sClient : k8sClient ,
5557 eventRecorder : eventRecorder ,
@@ -65,6 +67,7 @@ func NewServiceReconciler(cloud services.Cloud, k8sClient client.Client, eventRe
6567 logger : logger ,
6668
6769 maxConcurrentReconciles : controllerConfig .ServiceMaxConcurrentReconciles ,
70+ metricsCollector : metricsCollector ,
6871 }
6972}
7073
@@ -77,10 +80,11 @@ type serviceReconciler struct {
7780 serviceUtils service.ServiceUtils
7881 backendSGProvider networking.BackendSGProvider
7982
80- modelBuilder service.ModelBuilder
81- stackMarshaller deploy.StackMarshaller
82- stackDeployer deploy.StackDeployer
83- logger logr.Logger
83+ modelBuilder service.ModelBuilder
84+ stackMarshaller deploy.StackMarshaller
85+ stackDeployer deploy.StackDeployer
86+ logger logr.Logger
87+ metricsCollector lbcmetrics.MetricCollector
8488
8589 maxConcurrentReconciles int
8690}
@@ -94,22 +98,26 @@ func (r *serviceReconciler) Reconcile(ctx context.Context, req reconcile.Request
9498}
9599
96100func (r * serviceReconciler ) reconcile (ctx context.Context , req reconcile.Request ) error {
101+ defer r .metricsCollector .ObserveControllerReconcileLatency ("service" , "fetch service" )
97102 svc := & corev1.Service {}
98103 if err := r .k8sClient .Get (ctx , req .NamespacedName , svc ); err != nil {
99104 return client .IgnoreNotFound (err )
100105 }
106+ defer r .metricsCollector .ObserveControllerReconcileLatency ("service" , "build model" )
101107 stack , lb , backendSGRequired , err := r .buildModel (ctx , svc )
102108 if err != nil {
103109 return err
104110 }
111+
112+ defer r .metricsCollector .ObserveControllerReconcileLatency ("service" , "clean up resources" )
105113 if lb == nil {
106114 return r .cleanupLoadBalancerResources (ctx , svc , stack )
107115 }
108116 return r .reconcileLoadBalancerResources (ctx , svc , stack , lb , backendSGRequired )
109117}
110118
111119func (r * serviceReconciler ) buildModel (ctx context.Context , svc * corev1.Service ) (core.Stack , * elbv2model.LoadBalancer , bool , error ) {
112- stack , lb , backendSGRequired , err := r .modelBuilder .Build (ctx , svc )
120+ stack , lb , backendSGRequired , err := r .modelBuilder .Build (ctx , svc , r . metricsCollector )
113121 if err != nil {
114122 r .eventRecorder .Event (svc , corev1 .EventTypeWarning , k8s .ServiceEventReasonFailedBuildModel , fmt .Sprintf ("Failed build model due to %v" , err ))
115123 return nil , nil , false , err
@@ -124,7 +132,7 @@ func (r *serviceReconciler) buildModel(ctx context.Context, svc *corev1.Service)
124132}
125133
126134func (r * serviceReconciler ) deployModel (ctx context.Context , svc * corev1.Service , stack core.Stack ) error {
127- if err := r .stackDeployer .Deploy (ctx , stack ); err != nil {
135+ if err := r .stackDeployer .Deploy (ctx , stack , r . metricsCollector ); err != nil {
128136 var requeueNeededAfter * runtime.RequeueNeededAfter
129137 if errors .As (err , & requeueNeededAfter ) {
130138 return err
@@ -139,25 +147,33 @@ func (r *serviceReconciler) deployModel(ctx context.Context, svc *corev1.Service
139147
140148func (r * serviceReconciler ) reconcileLoadBalancerResources (ctx context.Context , svc * corev1.Service , stack core.Stack ,
141149 lb * elbv2model.LoadBalancer , backendSGRequired bool ) error {
150+
151+ defer r .metricsCollector .ObserveControllerReconcileLatency ("service" , "add finalizers" )
142152 if err := r .finalizerManager .AddFinalizers (ctx , svc , serviceFinalizer ); err != nil {
143153 r .eventRecorder .Event (svc , corev1 .EventTypeWarning , k8s .ServiceEventReasonFailedAddFinalizer , fmt .Sprintf ("Failed add finalizer due to %v" , err ))
144154 return err
145155 }
156+ defer r .metricsCollector .ObserveControllerReconcileLatency ("service" , "deploy model" )
146157 err := r .deployModel (ctx , svc , stack )
147158 if err != nil {
159+ r .metricsCollector .ObserveControllerReconcileError ("service" , "deploy model error" , "deploy model error" )
148160 return err
149161 }
162+ defer r .metricsCollector .ObserveControllerReconcileLatency ("service" , "DNS resolve" )
150163 lbDNS , err := lb .DNSName ().Resolve (ctx )
151164 if err != nil {
165+ r .metricsCollector .ObserveControllerReconcileError ("service" , "deploy model error" , "DNS resolve error" )
152166 return err
153167 }
154168
155169 if ! backendSGRequired {
156170 if err := r .backendSGProvider .Release (ctx , networking .ResourceTypeService , []types.NamespacedName {k8s .NamespacedName (svc )}); err != nil {
171+ r .metricsCollector .ObserveControllerReconcileError ("service" , "deploy model error" , "release auto-generated backend SG error" )
157172 return err
158173 }
159174 }
160175
176+ defer r .metricsCollector .ObserveControllerReconcileLatency ("service" , "update status" )
161177 if err = r .updateServiceStatus (ctx , lbDNS , svc ); err != nil {
162178 r .eventRecorder .Event (svc , corev1 .EventTypeWarning , k8s .ServiceEventReasonFailedUpdateStatus , fmt .Sprintf ("Failed update status due to %v" , err ))
163179 return err
0 commit comments