@@ -109,73 +109,135 @@ func (r *ArgoCDMetricsReconciler) Reconcile(ctx context.Context, request reconci
109109 }
110110
111111 const clusterMonitoringLabel = "openshift.io/cluster-monitoring"
112- _ , exists := namespace .Labels [clusterMonitoringLabel ]
113- if ! exists {
114- if namespace .Labels == nil {
115- namespace .Labels = make (map [string ]string )
112+ labelVal , exists := namespace .Labels [clusterMonitoringLabel ]
113+
114+ if argocd .Spec .Monitoring .DisableMetrics == nil || ! * argocd .Spec .Monitoring .DisableMetrics {
115+ if ! exists || labelVal != "true" {
116+ if namespace .Labels == nil {
117+ namespace .Labels = make (map [string ]string )
118+ }
119+ namespace .Labels [clusterMonitoringLabel ] = "true"
120+ err = r .Client .Update (ctx , & namespace )
121+ if err != nil {
122+ reqLogger .Error (err , "Error updating namespace" ,
123+ "Namespace" , namespace .Name )
124+ return reconcile.Result {}, err
125+ }
116126 }
117- namespace .Labels [clusterMonitoringLabel ] = "true"
118- err = r .Client .Update (ctx , & namespace )
127+
128+ // Create role to grant read permission to the openshift metrics stack
129+ err = r .createReadRoleIfAbsent (request .Namespace , argocd , reqLogger )
119130 if err != nil {
120- reqLogger .Error (err , "Error updating namespace" ,
121- "Namespace" , namespace .Name )
122131 return reconcile.Result {}, err
123132 }
124- } else {
125- reqLogger .Info ("Namespace already has cluster-monitoring label" ,
126- "Namespace" , namespace .Name )
127- }
128133
129- // Create role to grant read permission to the openshift metrics stack
130- err = r .createReadRoleIfAbsent (request .Namespace , argocd , reqLogger )
131- if err != nil {
132- return reconcile.Result {}, err
133- }
134+ // Create role binding to grant read permission to the openshift metrics stack
135+ err = r .createReadRoleBindingIfAbsent (request .Namespace , argocd , reqLogger )
136+ if err != nil {
137+ return reconcile.Result {}, err
138+ }
134139
135- // Create role binding to grant read permission to the openshift metrics stack
136- err = r .createReadRoleBindingIfAbsent (request .Namespace , argocd , reqLogger )
137- if err != nil {
138- return reconcile.Result {}, err
139- }
140+ // Create ServiceMonitor for ArgoCD application metrics
141+ serviceMonitorLabel := fmt .Sprintf ("%s-metrics" , request .Name )
142+ serviceMonitorName := request .Name
143+ err = r .createServiceMonitorIfAbsent (request .Namespace , argocd , serviceMonitorName , serviceMonitorLabel , reqLogger )
144+ if err != nil {
145+ return reconcile.Result {}, err
146+ }
140147
141- // Create ServiceMonitor for ArgoCD application metrics
142- serviceMonitorLabel : = fmt .Sprintf ("%s-metrics" , request .Name )
143- serviceMonitorName := request .Name
144- err = r .createServiceMonitorIfAbsent (request .Namespace , argocd , serviceMonitorName , serviceMonitorLabel , reqLogger )
145- if err != nil {
146- return reconcile.Result {}, err
147- }
148+ // Create ServiceMonitor for ArgoCD API server metrics
149+ serviceMonitorLabel = fmt .Sprintf ("%s-server -metrics" , request .Name )
150+ serviceMonitorName = fmt . Sprintf ( "%s-server" , request .Name )
151+ err = r .createServiceMonitorIfAbsent (request .Namespace , argocd , serviceMonitorName , serviceMonitorLabel , reqLogger )
152+ if err != nil {
153+ return reconcile.Result {}, err
154+ }
148155
149- // Create ServiceMonitor for ArgoCD API server metrics
150- serviceMonitorLabel = fmt .Sprintf ("%s-server-metrics " , request .Name )
151- serviceMonitorName = fmt .Sprintf ("%s-server" , request .Name )
152- err = r .createServiceMonitorIfAbsent (request .Namespace , argocd , serviceMonitorName , serviceMonitorLabel , reqLogger )
153- if err != nil {
154- return reconcile.Result {}, err
155- }
156+ // Create ServiceMonitor for ArgoCD repo server metrics
157+ serviceMonitorLabel = fmt .Sprintf ("%s-repo-server " , request .Name )
158+ serviceMonitorName = fmt .Sprintf ("%s-repo -server" , request .Name )
159+ err = r .createServiceMonitorIfAbsent (request .Namespace , argocd , serviceMonitorName , serviceMonitorLabel , reqLogger )
160+ if err != nil {
161+ return reconcile.Result {}, err
162+ }
156163
157- // Create ServiceMonitor for ArgoCD repo server metrics
158- serviceMonitorLabel = fmt .Sprintf ("%s-repo-server" , request .Name )
159- serviceMonitorName = fmt .Sprintf ("%s-repo-server" , request .Name )
160- err = r .createServiceMonitorIfAbsent (request .Namespace , argocd , serviceMonitorName , serviceMonitorLabel , reqLogger )
161- if err != nil {
162- return reconcile.Result {}, err
163- }
164+ // Create alert rule
165+ err = r .createPrometheusRuleIfAbsent (request .Namespace , argocd , reqLogger )
166+ if err != nil {
167+ return reconcile.Result {}, err
168+ }
164169
165- // Create alert rule
166- err = r .createPrometheusRuleIfAbsent (request .Namespace , argocd , reqLogger )
167- if err != nil {
168- return reconcile.Result {}, err
169- }
170+ err = r .reconcileDashboards (reqLogger )
171+ if err != nil {
172+ return reconcile.Result {}, err
173+ }
170174
171- err = r .reconcileDashboards (reqLogger )
172- if err != nil {
173- return reconcile.Result {}, err
174- }
175+ err = r .reconcileOperatorMetricsServiceMonitor (reqLogger )
176+ if err != nil {
177+ return reconcile.Result {}, err
178+ }
179+ } else {
180+ if exists {
181+ namespace .Labels [clusterMonitoringLabel ] = "false"
182+ err = r .Client .Update (ctx , & namespace )
183+ if err != nil {
184+ reqLogger .Error (err , "Error updating namespace" ,
185+ "Namespace" , namespace .Name )
186+ return reconcile.Result {}, err
187+ }
175188
176- err = r .reconcileOperatorMetricsServiceMonitor (reqLogger )
177- if err != nil {
178- return reconcile.Result {}, err
189+ // Delete role to grant read permission to the openshift metrics stack
190+ err = r .Client .Delete (context .TODO (), & rbacv1.Role {ObjectMeta : metav1.ObjectMeta {Namespace : request .Namespace , Name : fmt .Sprintf (readRoleNameFormat , request .Namespace )}})
191+ if err != nil {
192+ if ! errors .IsNotFound (err ) {
193+ reqLogger .Error (err , "Error deleting role in " ,
194+ "Namespace" , request .Namespace )
195+ return reconcile.Result {}, err
196+ }
197+ }
198+
199+ // Delete role binding to grant read permission to the openshift metrics stack
200+ err = r .Client .Delete (context .TODO (), & rbacv1.RoleBinding {ObjectMeta : metav1.ObjectMeta {Namespace : request .Namespace , Name : fmt .Sprintf (readRoleBindingNameFormat , request .Namespace )}})
201+ if err != nil {
202+ if ! errors .IsNotFound (err ) {
203+ reqLogger .Error (err , "Error deleting rolebinding in " ,
204+ "Namespace" , request .Namespace )
205+ return reconcile.Result {}, err
206+ }
207+ }
208+
209+ // Delete ServiceMonitor for ArgoCD application metrics
210+ serviceMonitorName := request .Name
211+ err = r .deleteServiceMonitor (serviceMonitorName , request .Namespace , reqLogger )
212+ if err != nil {
213+ return reconcile.Result {}, err
214+ }
215+
216+ // Delete ServiceMonitor for ArgoCD API server metrics
217+ serviceMonitorName = fmt .Sprintf ("%s-server" , request .Name )
218+ err = r .deleteServiceMonitor (serviceMonitorName , request .Namespace , reqLogger )
219+ if err != nil {
220+ return reconcile.Result {}, err
221+ }
222+
223+ // Delete ServiceMonitor for ArgoCD repo server metrics
224+ serviceMonitorName = fmt .Sprintf ("%s-repo-server" , request .Name )
225+ err = r .deleteServiceMonitor (serviceMonitorName , request .Namespace , reqLogger )
226+ if err != nil {
227+ return reconcile.Result {}, err
228+ }
229+
230+ // Delete alert rule
231+ err = r .Client .Delete (context .TODO (), & monitoringv1.PrometheusRule {ObjectMeta : metav1.ObjectMeta {Namespace : request .Namespace , Name : alertRuleName }})
232+ if err != nil {
233+ if ! errors .IsNotFound (err ) {
234+ reqLogger .Error (err , "Error deleting prometheus in " ,
235+ "Namespace" , request .Namespace )
236+ return reconcile.Result {}, err
237+ }
238+ }
239+
240+ }
179241 }
180242
181243 return reconcile.Result {}, nil
@@ -282,6 +344,20 @@ func (r *ArgoCDMetricsReconciler) createServiceMonitorIfAbsent(namespace string,
282344 return err
283345}
284346
347+ func (r * ArgoCDMetricsReconciler ) deleteServiceMonitor (name string , namespace string , reqLogger logr.Logger ) error {
348+
349+ err := r .Client .Delete (context .TODO (), & monitoringv1.ServiceMonitor {ObjectMeta : metav1.ObjectMeta {Namespace : namespace , Name : name }})
350+ if err != nil {
351+ if ! errors .IsNotFound (err ) {
352+ reqLogger .Error (err , "Error deleting servicemonitor" ,
353+ "Namespace" , namespace )
354+ return err
355+ }
356+ }
357+ return nil
358+
359+ }
360+
285361func (r * ArgoCDMetricsReconciler ) reconcileOperatorMetricsServiceMonitor (reqLogger logr.Logger ) error {
286362
287363 data , err := os .ReadFile (operatorPodNamespacePath )
0 commit comments