@@ -97,35 +97,41 @@ func NewAddonReconciler(
9797 & legacyDeletionHandler {client : client , uncachedClient : uncachedClient },
9898 & addonInstanceDeletionHandler {client : client },
9999 },
100+ recorder : recorder ,
100101 },
101102 // Step 2: Reconcile Namespace
102103 & namespaceReconciler {
103- client : client ,
104- scheme : scheme ,
104+ client : client ,
105+ scheme : scheme ,
106+ recorder : recorder ,
105107 },
106108 // Step 3: Reconcile Addon pull secrets
107109 & addonSecretPropagationReconciler {
108110 cachedClient : client ,
109111 uncachedClient : uncachedClient ,
110112 scheme : scheme ,
111113 addonOperatorNamespace : addonOperatorNamespace ,
114+ recorder : recorder ,
112115 },
113116 // Step 4: Reconcile AddonInstance object
114117 & addonInstanceReconciler {
115- client : client ,
116- scheme : scheme ,
118+ client : client ,
119+ scheme : scheme ,
120+ recorder : recorder ,
117121 },
118122 // Step 5: Reconcile OLM objects
119123 & olmReconciler {
120124 client : client ,
121125 uncachedClient : uncachedClient ,
122126 scheme : scheme ,
123127 operatorResourceHandler : operatorResourceHandler ,
128+ recorder : recorder ,
124129 },
125130 // Step 6: Reconcile Monitoring Federation
126131 & monitoringFederationReconciler {
127- client : client ,
128- scheme : scheme ,
132+ client : client ,
133+ scheme : scheme ,
134+ recorder : recorder ,
129135 },
130136 },
131137 }
@@ -273,9 +279,11 @@ func (r *AddonReconciler) Reconcile(
273279) (ctrl.Result , error ) {
274280 logger := r .Log .WithValues ("addon" , req .NamespacedName .String ())
275281 ctx = controllers .ContextWithLogger (ctx , logger )
282+ reconErr := metrics .NewReconcileError ("addon" , r .Recorder , false )
276283
277284 addon := & addonsv1alpha1.Addon {}
278285 if err := r .Get (ctx , req .NamespacedName , addon ); err != nil {
286+ reconErr .Report (controllers .ErrGetAddon , addon .Name )
279287 return ctrl.Result {}, client .IgnoreNotFound (err )
280288 }
281289
@@ -287,6 +295,10 @@ func (r *AddonReconciler) Reconcile(
287295 }
288296 errors := r .syncWithExternalAPIs (ctx , logger , addon )
289297
298+ if errors .ErrorOrNil () != nil {
299+ reconErr .Report (controllers .ErrSyncWithExternalAPIs , addon .Name )
300+ }
301+
290302 // append reconcilerErr
291303 errors = multierror .Append (errors , reconcileErr )
292304
@@ -322,6 +334,8 @@ func (r *AddonReconciler) reconcile(ctx context.Context, addon *addonsv1alpha1.A
322334 log logr.Logger ,
323335) (ctrl.Result , error ) {
324336 ctx = controllers .ContextWithLogger (ctx , log )
337+ reconErr := metrics .NewReconcileError ("addon" , r .Recorder , false )
338+ subReconErr := metrics .NewReconcileError ("addon" , r .Recorder , true )
325339 // Handle addon deletion before checking for pause condition.
326340 // This allows even paused addons to be deleted.
327341 if ! addon .DeletionTimestamp .IsZero () {
@@ -362,13 +376,15 @@ func (r *AddonReconciler) reconcile(ctx context.Context, addon *addonsv1alpha1.A
362376 if ! controllerutil .ContainsFinalizer (addon , cacheFinalizer ) {
363377 controllerutil .AddFinalizer (addon , cacheFinalizer )
364378 if err := r .Update (ctx , addon ); err != nil {
379+ reconErr .Report (controllers .ErrUpdateAddon , addon .Name )
365380 return ctrl.Result {}, fmt .Errorf ("failed to add finalizer: %w" , err )
366381 }
367382 }
368383
369384 // Run each sub reconciler serially
370385 for _ , reconciler := range r .subReconcilers {
371386 if result , err := reconciler .Reconcile (ctx , addon ); err != nil {
387+ subReconErr .Report (err , addon .Name )
372388 return ctrl.Result {}, fmt .Errorf ("%s : failed to reconcile : %w" , reconciler .Name (), err )
373389 } else if ! result .IsZero () {
374390 return result , nil
0 commit comments