Skip to content

Commit 5138dd5

Browse files
authoredNov 5, 2024··
feat: add orphaned resource count metric (#20521)
Signed-off-by: jaehanbyun <awbrg789@naver.com>
1 parent 36ef563 commit 5138dd5

File tree

3 files changed

+42
-0
lines changed

3 files changed

+42
-0
lines changed
 

‎controller/appcontroller.go

+1
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,7 @@ func (ctrl *ApplicationController) getResourceTree(a *appv1.Application, managed
628628
Message: fmt.Sprintf("Application has %d orphaned resources", len(orphanedNodes)),
629629
}}
630630
}
631+
ctrl.metricsServer.SetOrphanedResourcesMetric(a, len(orphanedNodes))
631632
a.Status.SetConditions(conditions, map[appv1.ApplicationConditionType]bool{appv1.ApplicationConditionOrphanedResourceWarning: true})
632633
sort.Slice(orphanedNodes, func(i, j int) bool {
633634
return orphanedNodes[i].ResourceRef.String() < orphanedNodes[j].ResourceRef.String()

‎controller/metrics/metrics.go

+16
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ type MetricsServer struct {
3333
syncCounter *prometheus.CounterVec
3434
kubectlExecCounter *prometheus.CounterVec
3535
kubectlExecPendingGauge *prometheus.GaugeVec
36+
orphanedResourcesGauge *prometheus.GaugeVec
3637
k8sRequestCounter *prometheus.CounterVec
3738
clusterEventsCounter *prometheus.CounterVec
3839
redisRequestCounter *prometheus.CounterVec
@@ -144,6 +145,14 @@ var (
144145
},
145146
[]string{"hostname", "initiator"},
146147
)
148+
149+
orphanedResourcesGauge = prometheus.NewGaugeVec(
150+
prometheus.GaugeOpts{
151+
Name: "argocd_app_orphaned_resources_count",
152+
Help: "Number of orphaned resources per application",
153+
},
154+
descAppDefaultLabels,
155+
)
147156
)
148157

149158
// NewMetricsServer returns a new prometheus server which collects application metrics
@@ -188,6 +197,7 @@ func NewMetricsServer(addr string, appLister applister.ApplicationLister, appFil
188197
registry.MustRegister(k8sRequestCounter)
189198
registry.MustRegister(kubectlExecCounter)
190199
registry.MustRegister(kubectlExecPendingGauge)
200+
registry.MustRegister(orphanedResourcesGauge)
191201
registry.MustRegister(reconcileHistogram)
192202
registry.MustRegister(clusterEventsCounter)
193203
registry.MustRegister(redisRequestCounter)
@@ -203,6 +213,7 @@ func NewMetricsServer(addr string, appLister applister.ApplicationLister, appFil
203213
k8sRequestCounter: k8sRequestCounter,
204214
kubectlExecCounter: kubectlExecCounter,
205215
kubectlExecPendingGauge: kubectlExecPendingGauge,
216+
orphanedResourcesGauge: orphanedResourcesGauge,
206217
reconcileHistogram: reconcileHistogram,
207218
clusterEventsCounter: clusterEventsCounter,
208219
redisRequestCounter: redisRequestCounter,
@@ -241,6 +252,10 @@ func (m *MetricsServer) DecKubectlExecPending(command string) {
241252
m.kubectlExecPendingGauge.WithLabelValues(m.hostname, command).Dec()
242253
}
243254

255+
func (m *MetricsServer) SetOrphanedResourcesMetric(app *argoappv1.Application, numOrphanedResources int) {
256+
m.orphanedResourcesGauge.WithLabelValues(app.Namespace, app.Name, app.Spec.GetProject()).Set(float64(numOrphanedResources))
257+
}
258+
244259
// IncClusterEventsCount increments the number of cluster events
245260
func (m *MetricsServer) IncClusterEventsCount(server, group, kind string) {
246261
m.clusterEventsCounter.WithLabelValues(server, group, kind).Inc()
@@ -290,6 +305,7 @@ func (m *MetricsServer) SetExpiration(cacheExpiration time.Duration) error {
290305
m.syncCounter.Reset()
291306
m.kubectlExecCounter.Reset()
292307
m.kubectlExecPendingGauge.Reset()
308+
m.orphanedResourcesGauge.Reset()
293309
m.k8sRequestCounter.Reset()
294310
m.clusterEventsCounter.Reset()
295311
m.redisRequestCounter.Reset()

‎controller/metrics/metrics_test.go

+25
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,31 @@ argocd_app_reconcile_count{dest_server="https://localhost:6443",namespace="argoc
509509
assertMetricsPrinted(t, appReconcileMetrics, body)
510510
}
511511

512+
func TestOrphanedResourcesMetric(t *testing.T) {
513+
cancel, appLister := newFakeLister()
514+
defer cancel()
515+
metricsServ, err := NewMetricsServer("localhost:8082", appLister, appFilter, noOpHealthCheck, []string{}, []string{})
516+
require.NoError(t, err)
517+
518+
expectedMetrics := `
519+
# HELP argocd_app_orphaned_resources_count Number of orphaned resources per application
520+
# TYPE argocd_app_orphaned_resources_count gauge
521+
argocd_app_orphaned_resources_count{name="my-app-4",namespace="argocd",project="important-project"} 1
522+
`
523+
app := newFakeApp(fakeApp4)
524+
numOrphanedResources := 1
525+
metricsServ.SetOrphanedResourcesMetric(app, numOrphanedResources)
526+
527+
req, err := http.NewRequest(http.MethodGet, "/metrics", nil)
528+
require.NoError(t, err)
529+
rr := httptest.NewRecorder()
530+
metricsServ.Handler.ServeHTTP(rr, req)
531+
assert.Equal(t, http.StatusOK, rr.Code)
532+
body := rr.Body.String()
533+
log.Println(body)
534+
assertMetricsPrinted(t, expectedMetrics, body)
535+
}
536+
512537
func TestMetricsReset(t *testing.T) {
513538
cancel, appLister := newFakeLister()
514539
defer cancel()

0 commit comments

Comments
 (0)
Please sign in to comment.