@@ -3,6 +3,7 @@ package ingress
3
3
import (
4
4
"context"
5
5
"fmt"
6
+
6
7
"sigs.k8s.io/controller-runtime/pkg/reconcile"
7
8
8
9
"github.com/go-logr/logr"
@@ -21,8 +22,11 @@ import (
21
22
"sigs.k8s.io/aws-load-balancer-controller/pkg/deploy"
22
23
elbv2deploy "sigs.k8s.io/aws-load-balancer-controller/pkg/deploy/elbv2"
23
24
"sigs.k8s.io/aws-load-balancer-controller/pkg/deploy/tracking"
25
+ errmetrics "sigs.k8s.io/aws-load-balancer-controller/pkg/error"
24
26
"sigs.k8s.io/aws-load-balancer-controller/pkg/ingress"
25
27
"sigs.k8s.io/aws-load-balancer-controller/pkg/k8s"
28
+ lbcmetrics "sigs.k8s.io/aws-load-balancer-controller/pkg/metrics/lbc"
29
+ metricsutil "sigs.k8s.io/aws-load-balancer-controller/pkg/metrics/util"
26
30
"sigs.k8s.io/aws-load-balancer-controller/pkg/model/core"
27
31
elbv2model "sigs.k8s.io/aws-load-balancer-controller/pkg/model/elbv2"
28
32
networkingpkg "sigs.k8s.io/aws-load-balancer-controller/pkg/networking"
@@ -48,7 +52,7 @@ func NewGroupReconciler(cloud services.Cloud, k8sClient client.Client, eventReco
48
52
finalizerManager k8s.FinalizerManager , networkingSGManager networkingpkg.SecurityGroupManager ,
49
53
networkingSGReconciler networkingpkg.SecurityGroupReconciler , subnetsResolver networkingpkg.SubnetsResolver ,
50
54
elbv2TaggingManager elbv2deploy.TaggingManager , controllerConfig config.ControllerConfig , backendSGProvider networkingpkg.BackendSGProvider ,
51
- sgResolver networkingpkg.SecurityGroupResolver , logger logr.Logger ) * groupReconciler {
55
+ sgResolver networkingpkg.SecurityGroupResolver , logger logr.Logger , metricsCollector lbcmetrics. MetricCollector , reconcileCounters * metricsutil. ReconcileCounters ) * groupReconciler {
52
56
53
57
annotationParser := annotations .NewSuffixAnnotationParser (annotations .AnnotationPrefixIngress )
54
58
authConfigBuilder := ingress .NewDefaultAuthConfigBuilder (annotationParser )
@@ -61,10 +65,10 @@ func NewGroupReconciler(cloud services.Cloud, k8sClient client.Client, eventReco
61
65
authConfigBuilder , enhancedBackendBuilder , trackingProvider , elbv2TaggingManager , controllerConfig .FeatureGates ,
62
66
cloud .VpcID (), controllerConfig .ClusterName , controllerConfig .DefaultTags , controllerConfig .ExternalManagedTags ,
63
67
controllerConfig .DefaultSSLPolicy , controllerConfig .DefaultTargetType , controllerConfig .DefaultLoadBalancerScheme , backendSGProvider , sgResolver ,
64
- controllerConfig .EnableBackendSecurityGroup , controllerConfig .DisableRestrictedSGRules , controllerConfig .IngressConfig .AllowedCertificateAuthorityARNs , controllerConfig .FeatureGates .Enabled (config .EnableIPTargetType ), logger )
68
+ controllerConfig .EnableBackendSecurityGroup , controllerConfig .DisableRestrictedSGRules , controllerConfig .IngressConfig .AllowedCertificateAuthorityARNs , controllerConfig .FeatureGates .Enabled (config .EnableIPTargetType ), logger , metricsCollector )
65
69
stackMarshaller := deploy .NewDefaultStackMarshaller ()
66
70
stackDeployer := deploy .NewDefaultStackDeployer (cloud , k8sClient , networkingSGManager , networkingSGReconciler , elbv2TaggingManager ,
67
- controllerConfig , ingressTagPrefix , logger )
71
+ controllerConfig , ingressTagPrefix , logger , metricsCollector , controllerName )
68
72
classLoader := ingress .NewDefaultClassLoader (k8sClient , true )
69
73
classAnnotationMatcher := ingress .NewDefaultClassAnnotationMatcher (controllerConfig .IngressConfig .IngressClass )
70
74
manageIngressesWithoutIngressClass := controllerConfig .IngressConfig .IngressClass == ""
@@ -83,6 +87,9 @@ func NewGroupReconciler(cloud services.Cloud, k8sClient client.Client, eventReco
83
87
groupLoader : groupLoader ,
84
88
groupFinalizerManager : groupFinalizerManager ,
85
89
logger : logger ,
90
+ metricsCollector : metricsCollector ,
91
+ controllerName : controllerName ,
92
+ reconcileCounters : reconcileCounters ,
86
93
87
94
maxConcurrentReconciles : controllerConfig .IngressConfig .MaxConcurrentReconciles ,
88
95
}
@@ -102,6 +109,9 @@ type groupReconciler struct {
102
109
groupLoader ingress.GroupLoader
103
110
groupFinalizerManager ingress.FinalizerManager
104
111
logger logr.Logger
112
+ metricsCollector lbcmetrics.MetricCollector
113
+ controllerName string
114
+ reconcileCounters * metricsutil.ReconcileCounters
105
115
106
116
maxConcurrentReconciles int
107
117
}
@@ -116,40 +126,64 @@ type groupReconciler struct {
116
126
// +kubebuilder:rbac:groups="",resources=events,verbs=create;patch
117
127
118
128
func (r * groupReconciler ) Reconcile (ctx context.Context , req reconcile.Request ) (ctrl.Result , error ) {
129
+ r .reconcileCounters .IncrementIngress (req .NamespacedName )
119
130
return runtime .HandleReconcileError (r .reconcile (ctx , req ), r .logger )
120
131
}
121
132
122
133
func (r * groupReconciler ) reconcile (ctx context.Context , req reconcile.Request ) error {
123
134
ingGroupID := ingress .DecodeGroupIDFromReconcileRequest (req )
124
- ingGroup , err := r .groupLoader .Load (ctx , ingGroupID )
135
+ var err error
136
+ var ingGroup ingress.Group
137
+ loadIngressFn := func () {
138
+ ingGroup , err = r .groupLoader .Load (ctx , ingGroupID )
139
+ }
140
+ r .metricsCollector .ObserveControllerReconcileLatency (controllerName , "fetch_ingress" , loadIngressFn )
125
141
if err != nil {
126
- return err
142
+ return errmetrics . NewErrorWithMetrics ( controllerName , "fetch_ingress_error" , err , r . metricsCollector )
127
143
}
128
144
129
- if err := r .groupFinalizerManager .AddGroupFinalizer (ctx , ingGroupID , ingGroup .Members ); err != nil {
145
+ addFinalizerFn := func () {
146
+ err = r .groupFinalizerManager .AddGroupFinalizer (ctx , ingGroupID , ingGroup .Members )
147
+ }
148
+ r .metricsCollector .ObserveControllerReconcileLatency (controllerName , "add_group_finalizer" , addFinalizerFn )
149
+ if err != nil {
130
150
r .recordIngressGroupEvent (ctx , ingGroup , corev1 .EventTypeWarning , k8s .IngressEventReasonFailedAddFinalizer , fmt .Sprintf ("Failed add finalizer due to %v" , err ))
131
- return err
151
+ return errmetrics . NewErrorWithMetrics ( controllerName , "add_group_finalizer_error" , err , r . metricsCollector )
132
152
}
153
+
133
154
_ , lb , err := r .buildAndDeployModel (ctx , ingGroup )
134
155
if err != nil {
135
156
return err
136
157
}
137
158
138
159
if len (ingGroup .Members ) > 0 && lb != nil {
139
- lbDNS , err := lb .DNSName ().Resolve (ctx )
140
- if err != nil {
141
- return err
160
+ var statusErr error
161
+ dnsResolveAndUpdateStatus := func () {
162
+ var lbDNS string
163
+ lbDNS , statusErr = lb .DNSName ().Resolve (ctx )
164
+ if statusErr != nil {
165
+ return
166
+ }
167
+ statusErr = r .updateIngressGroupStatus (ctx , ingGroup , lbDNS )
168
+ if statusErr != nil {
169
+ r .recordIngressGroupEvent (ctx , ingGroup , corev1 .EventTypeWarning , k8s .IngressEventReasonFailedUpdateStatus ,
170
+ fmt .Sprintf ("Failed update status due to %v" , statusErr ))
171
+ }
142
172
}
143
- if err := r . updateIngressGroupStatus ( ctx , ingGroup , lbDNS ); err != nil {
144
- r . recordIngressGroupEvent ( ctx , ingGroup , corev1 . EventTypeWarning , k8s . IngressEventReasonFailedUpdateStatus , fmt . Sprintf ( "Failed update status due to %v" , err ))
145
- return err
173
+ r . metricsCollector . ObserveControllerReconcileLatency ( controllerName , "dns_resolve_and_update_status" , dnsResolveAndUpdateStatus )
174
+ if statusErr != nil {
175
+ return errmetrics . NewErrorWithMetrics ( controllerName , "dns_resolve_and_update_status_error" , statusErr , r . metricsCollector )
146
176
}
147
177
}
148
178
149
179
if len (ingGroup .InactiveMembers ) > 0 {
150
- if err := r .groupFinalizerManager .RemoveGroupFinalizer (ctx , ingGroupID , ingGroup .InactiveMembers ); err != nil {
180
+ removeGroupFinalizerFn := func () {
181
+ err = r .groupFinalizerManager .RemoveGroupFinalizer (ctx , ingGroupID , ingGroup .InactiveMembers )
182
+ }
183
+ r .metricsCollector .ObserveControllerReconcileLatency (controllerName , "remove_group_finalizer" , removeGroupFinalizerFn )
184
+ if err != nil {
151
185
r .recordIngressGroupEvent (ctx , ingGroup , corev1 .EventTypeWarning , k8s .IngressEventReasonFailedRemoveFinalizer , fmt .Sprintf ("Failed remove finalizer due to %v" , err ))
152
- return err
186
+ return errmetrics . NewErrorWithMetrics ( controllerName , "remove_group_finalizer_error" , err , r . metricsCollector )
153
187
}
154
188
}
155
189
@@ -158,10 +192,18 @@ func (r *groupReconciler) reconcile(ctx context.Context, req reconcile.Request)
158
192
}
159
193
160
194
func (r * groupReconciler ) buildAndDeployModel (ctx context.Context , ingGroup ingress.Group ) (core.Stack , * elbv2model.LoadBalancer , error ) {
161
- stack , lb , secrets , backendSGRequired , err := r .modelBuilder .Build (ctx , ingGroup )
195
+ var stack core.Stack
196
+ var lb * elbv2model.LoadBalancer
197
+ var secrets []types.NamespacedName
198
+ var backendSGRequired bool
199
+ var err error
200
+ buildModelFn := func () {
201
+ stack , lb , secrets , backendSGRequired , err = r .modelBuilder .Build (ctx , ingGroup , r .metricsCollector )
202
+ }
203
+ r .metricsCollector .ObserveControllerReconcileLatency (controllerName , "build_model" , buildModelFn )
162
204
if err != nil {
163
205
r .recordIngressGroupEvent (ctx , ingGroup , corev1 .EventTypeWarning , k8s .IngressEventReasonFailedBuildModel , fmt .Sprintf ("Failed build model due to %v" , err ))
164
- return nil , nil , err
206
+ return nil , nil , errmetrics . NewErrorWithMetrics ( controllerName , "build_model_error" , err , r . metricsCollector )
165
207
}
166
208
stackJSON , err := r .stackMarshaller .Marshal (stack )
167
209
if err != nil {
@@ -170,13 +212,17 @@ func (r *groupReconciler) buildAndDeployModel(ctx context.Context, ingGroup ingr
170
212
}
171
213
r .logger .Info ("successfully built model" , "model" , stackJSON )
172
214
173
- if err := r .stackDeployer .Deploy (ctx , stack ); err != nil {
215
+ deployModelFn := func () {
216
+ err = r .stackDeployer .Deploy (ctx , stack , r .metricsCollector , "ingress" )
217
+ }
218
+ r .metricsCollector .ObserveControllerReconcileLatency (controllerName , "deploy_model" , deployModelFn )
219
+ if err != nil {
174
220
var requeueNeededAfter * runtime.RequeueNeededAfter
175
221
if errors .As (err , & requeueNeededAfter ) {
176
222
return nil , nil , err
177
223
}
178
224
r .recordIngressGroupEvent (ctx , ingGroup , corev1 .EventTypeWarning , k8s .IngressEventReasonFailedDeployModel , fmt .Sprintf ("Failed deploy model due to %v" , err ))
179
- return nil , nil , err
225
+ return nil , nil , errmetrics . NewErrorWithMetrics ( controllerName , "deploy_model_error" , err , r . metricsCollector )
180
226
}
181
227
r .logger .Info ("successfully deployed model" , "ingressGroup" , ingGroup .ID )
182
228
r .secretsManager .MonitorSecrets (ingGroup .ID .String (), secrets )
@@ -186,7 +232,7 @@ func (r *groupReconciler) buildAndDeployModel(ctx context.Context, ingGroup ingr
186
232
inactiveResources = append (inactiveResources , k8s .ToSliceOfNamespacedNames (ingGroup .Members )... )
187
233
}
188
234
if err := r .backendSGProvider .Release (ctx , networkingpkg .ResourceTypeIngress , inactiveResources ); err != nil {
189
- return nil , nil , err
235
+ return nil , nil , errmetrics . NewErrorWithMetrics ( controllerName , "release_auto_generated_backend_sg_error" , err , r . metricsCollector )
190
236
}
191
237
return stack , lb , nil
192
238
}
0 commit comments