@@ -109,73 +109,135 @@ func (r *ArgoCDMetricsReconciler) Reconcile(ctx context.Context, request reconci
109
109
}
110
110
111
111
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
+ }
116
126
}
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 )
119
130
if err != nil {
120
- reqLogger .Error (err , "Error updating namespace" ,
121
- "Namespace" , namespace .Name )
122
131
return reconcile.Result {}, err
123
132
}
124
- } else {
125
- reqLogger .Info ("Namespace already has cluster-monitoring label" ,
126
- "Namespace" , namespace .Name )
127
- }
128
133
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
+ }
134
139
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
+ }
140
147
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
+ }
148
155
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
+ }
156
163
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
+ }
164
169
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
+ }
170
174
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
+ }
175
188
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
+ }
179
241
}
180
242
181
243
return reconcile.Result {}, nil
@@ -282,6 +344,20 @@ func (r *ArgoCDMetricsReconciler) createServiceMonitorIfAbsent(namespace string,
282
344
return err
283
345
}
284
346
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
+
285
361
func (r * ArgoCDMetricsReconciler ) reconcileOperatorMetricsServiceMonitor (reqLogger logr.Logger ) error {
286
362
287
363
data , err := os .ReadFile (operatorPodNamespacePath )
0 commit comments