@@ -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,57 @@ 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 ("ingress" , "fetch_ingress" , loadIngressFn )
125
141
if err != nil {
126
- return err
142
+ return errmetrics . NewErrorWithMetrics ( "ingress" , "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 ("ingress" , "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 ( "ingress" , "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
142
- }
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
160
+ dnsResolveAndUpdateStatus := func () {
161
+ lbDNS , err := lb .DNSName ().Resolve (ctx )
162
+ if err != nil {
163
+ return
164
+ }
165
+ if err := r .updateIngressGroupStatus (ctx , ingGroup , lbDNS ); err != nil {
166
+ r .recordIngressGroupEvent (ctx , ingGroup , corev1 .EventTypeWarning , k8s .IngressEventReasonFailedUpdateStatus , fmt .Sprintf ("Failed update status due to %v" , err ))
167
+ }
146
168
}
169
+ r .metricsCollector .ObserveControllerReconcileLatency ("ingress" , "dns_resolve_and_update_status" , dnsResolveAndUpdateStatus )
147
170
}
148
171
149
172
if len (ingGroup .InactiveMembers ) > 0 {
150
- if err := r .groupFinalizerManager .RemoveGroupFinalizer (ctx , ingGroupID , ingGroup .InactiveMembers ); err != nil {
173
+ removeGroupFinalizerFn := func () {
174
+ err = r .groupFinalizerManager .RemoveGroupFinalizer (ctx , ingGroupID , ingGroup .InactiveMembers )
175
+ }
176
+ r .metricsCollector .ObserveControllerReconcileLatency ("ingress" , "remove_group_finalizer" , removeGroupFinalizerFn )
177
+ if err != nil {
151
178
r .recordIngressGroupEvent (ctx , ingGroup , corev1 .EventTypeWarning , k8s .IngressEventReasonFailedRemoveFinalizer , fmt .Sprintf ("Failed remove finalizer due to %v" , err ))
152
- return err
179
+ return errmetrics . NewErrorWithMetrics ( "ingress" , "remove_group_finalizer_error" , err , r . metricsCollector )
153
180
}
154
181
}
155
182
@@ -158,10 +185,18 @@ func (r *groupReconciler) reconcile(ctx context.Context, req reconcile.Request)
158
185
}
159
186
160
187
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 )
188
+ var stack core.Stack
189
+ var lb * elbv2model.LoadBalancer
190
+ var secrets []types.NamespacedName
191
+ var backendSGRequired bool
192
+ var err error
193
+ buildModelFn := func () {
194
+ stack , lb , secrets , backendSGRequired , err = r .modelBuilder .Build (ctx , ingGroup , r .metricsCollector )
195
+ }
196
+ r .metricsCollector .ObserveControllerReconcileLatency ("ingress" , "build_model" , buildModelFn )
162
197
if err != nil {
163
198
r .recordIngressGroupEvent (ctx , ingGroup , corev1 .EventTypeWarning , k8s .IngressEventReasonFailedBuildModel , fmt .Sprintf ("Failed build model due to %v" , err ))
164
- return nil , nil , err
199
+ return nil , nil , errmetrics . NewErrorWithMetrics ( "ingress" , "build_model_error" , err , r . metricsCollector )
165
200
}
166
201
stackJSON , err := r .stackMarshaller .Marshal (stack )
167
202
if err != nil {
@@ -170,13 +205,17 @@ func (r *groupReconciler) buildAndDeployModel(ctx context.Context, ingGroup ingr
170
205
}
171
206
r .logger .Info ("successfully built model" , "model" , stackJSON )
172
207
173
- if err := r .stackDeployer .Deploy (ctx , stack ); err != nil {
208
+ deployModelFn := func () {
209
+ err = r .stackDeployer .Deploy (ctx , stack , r .metricsCollector , "ingress" )
210
+ }
211
+ r .metricsCollector .ObserveControllerReconcileLatency ("ingress" , "deploy_model" , deployModelFn )
212
+ if err != nil {
174
213
var requeueNeededAfter * runtime.RequeueNeededAfter
175
214
if errors .As (err , & requeueNeededAfter ) {
176
215
return nil , nil , err
177
216
}
178
217
r .recordIngressGroupEvent (ctx , ingGroup , corev1 .EventTypeWarning , k8s .IngressEventReasonFailedDeployModel , fmt .Sprintf ("Failed deploy model due to %v" , err ))
179
- return nil , nil , err
218
+ return nil , nil , errmetrics . NewErrorWithMetrics ( "ingress" , "deploy_model_error" , err , r . metricsCollector )
180
219
}
181
220
r .logger .Info ("successfully deployed model" , "ingressGroup" , ingGroup .ID )
182
221
r .secretsManager .MonitorSecrets (ingGroup .ID .String (), secrets )
@@ -186,7 +225,7 @@ func (r *groupReconciler) buildAndDeployModel(ctx context.Context, ingGroup ingr
186
225
inactiveResources = append (inactiveResources , k8s .ToSliceOfNamespacedNames (ingGroup .Members )... )
187
226
}
188
227
if err := r .backendSGProvider .Release (ctx , networkingpkg .ResourceTypeIngress , inactiveResources ); err != nil {
189
- return nil , nil , err
228
+ return nil , nil , errmetrics . NewErrorWithMetrics ( "ingress" , "release_auto_generated_backend_sg_error" , err , r . metricsCollector )
190
229
}
191
230
return stack , lb , nil
192
231
}
0 commit comments