This is an automated email from the ASF dual-hosted git repository.

ccondit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/yunikorn-core.git


The following commit(s) were added to refs/heads/master by this push:
     new 1e5d68bf [YUNIKORN-2908] Remove associated metrics when queue is 
removed (#987)
1e5d68bf is described below

commit 1e5d68bf2c580de9b3fa333eafecb6369af84ad9
Author: Hengzhe <[email protected]>
AuthorDate: Tue Oct 29 14:56:10 2024 -0500

    [YUNIKORN-2908] Remove associated metrics when queue is removed (#987)
    
    Closes: #987
    
    Signed-off-by: Craig Condit <[email protected]>
---
 pkg/metrics/init.go            |  9 +++++++++
 pkg/metrics/queue.go           | 15 +++++++++++++++
 pkg/metrics/queue_test.go      | 17 +++++++++++++++++
 pkg/scheduler/objects/queue.go |  5 +++++
 4 files changed, 46 insertions(+)

diff --git a/pkg/metrics/init.go b/pkg/metrics/init.go
index ce478014..ec370abf 100644
--- a/pkg/metrics/init.go
+++ b/pkg/metrics/init.go
@@ -84,6 +84,15 @@ func GetQueueMetrics(name string) *QueueMetrics {
        return queueMetrics
 }
 
+func RemoveQueueMetrics(name string) {
+       m.lock.Lock()
+       defer m.lock.Unlock()
+       if metrics, ok := m.queues[name]; ok {
+               metrics.UnregisterMetrics()
+               delete(m.queues, name)
+       }
+}
+
 func GetEventMetrics() *EventMetrics {
        return m.event
 }
diff --git a/pkg/metrics/queue.go b/pkg/metrics/queue.go
index fc118164..d8917b85 100644
--- a/pkg/metrics/queue.go
+++ b/pkg/metrics/queue.go
@@ -132,6 +132,21 @@ func InitQueueMetrics(name string) *QueueMetrics {
        return q
 }
 
+func (m *QueueMetrics) UnregisterMetrics() {
+       var queueMetricsList = []prometheus.Collector{
+               m.appMetricsLabel,
+               m.appMetricsSubsystem,
+               m.containerMetrics,
+               m.resourceMetricsLabel,
+               m.resourceMetricsSubsystem,
+       }
+
+       // Unregister the metrics
+       for _, metric := range queueMetricsList {
+               prometheus.Unregister(metric)
+       }
+}
+
 func (m *QueueMetrics) incQueueApplications(state string) {
        m.appMetricsLabel.WithLabelValues(state).Inc()
        m.appMetricsSubsystem.WithLabelValues(state).Inc()
diff --git a/pkg/metrics/queue_test.go b/pkg/metrics/queue_test.go
index 9a967864..69199f70 100644
--- a/pkg/metrics/queue_test.go
+++ b/pkg/metrics/queue_test.go
@@ -246,6 +246,23 @@ func TestQueuePreemptingResourceMetrics(t *testing.T) {
        verifyResourceMetrics(t, "preempting", "cpu")
 }
 
+func TestRemoveQueueMetrics(t *testing.T) {
+       testQueueName := "root.test"
+       qm = GetQueueMetrics(testQueueName)
+       defer unregisterQueueMetrics()
+
+       qm.SetQueueAllocatedResourceMetrics("cpu", 1)
+       assert.Assert(t, m.queues[testQueueName] != nil)
+       RemoveQueueMetrics(testQueueName)
+       assert.Assert(t, m.queues[testQueueName] == nil)
+       metrics, err := prometheus.DefaultGatherer.Gather()
+       assert.NilError(t, err)
+       for _, metric := range metrics {
+               assert.Assert(t, metric.GetName() != "yunikorn_queue_resource",
+                       "Queue metrics are not cleaned up")
+       }
+}
+
 func getQueueMetrics() *QueueMetrics {
        return InitQueueMetrics("root.test")
 }
diff --git a/pkg/scheduler/objects/queue.go b/pkg/scheduler/objects/queue.go
index 6ac9dc16..5b62ca5c 100644
--- a/pkg/scheduler/objects/queue.go
+++ b/pkg/scheduler/objects/queue.go
@@ -986,6 +986,7 @@ func (sq *Queue) RemoveQueue() bool {
                return false
        }
        log.Log(log.SchedQueue).Info("removing queue", zap.String("queue", 
sq.QueuePath))
+       sq.removeMetrics()
        // root is always managed and is the only queue with a nil parent: no 
need to guard
        sq.parent.removeChildQueue(sq.Name)
        sq.queueEvents.SendRemoveQueueEvent(sq.QueuePath, sq.isManaged)
@@ -1696,6 +1697,10 @@ func (sq *Queue) updatePreemptingResourceMetrics() {
        }
 }
 
+func (sq *Queue) removeMetrics() {
+       metrics.RemoveQueueMetrics(sq.QueuePath)
+}
+
 func (sq *Queue) String() string {
        sq.RLock()
        defer sq.RUnlock()


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to