From 0d996365e0fd668875e2ae6dd3e40ca61ad179ec Mon Sep 17 00:00:00 2001 From: Amanuel Engeda <74629455+engedaam@users.noreply.github.com> Date: Mon, 20 Mar 2023 15:05:59 -0700 Subject: [PATCH] Fixed possible leak (#246) --- pkg/controllers/metrics/pod/controller.go | 1 + pkg/controllers/metrics/provisioner/controller.go | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/pkg/controllers/metrics/pod/controller.go b/pkg/controllers/metrics/pod/controller.go index 87b81f3a2e..bab8f76c27 100644 --- a/pkg/controllers/metrics/pod/controller.go +++ b/pkg/controllers/metrics/pod/controller.go @@ -135,6 +135,7 @@ func (c *Controller) Reconcile(ctx context.Context, req reconcile.Request) (reco func (c *Controller) cleanup(podKey types.NamespacedName) { if labels, ok := c.labelsMap.Load(podKey); ok { podGaugeVec.Delete(labels.(prometheus.Labels)) + c.labelsMap.Delete(podKey) } } diff --git a/pkg/controllers/metrics/provisioner/controller.go b/pkg/controllers/metrics/provisioner/controller.go index 9f6254c2de..8d8c465665 100644 --- a/pkg/controllers/metrics/provisioner/controller.go +++ b/pkg/controllers/metrics/provisioner/controller.go @@ -129,6 +129,7 @@ func (c *Controller) cleanup(provisionerKey types.NamespacedName) { usageGaugeVec.Delete(labels) usagePctGaugeVec.Delete(labels) } + c.labelCollection.Delete(provisionerKey) } } @@ -162,15 +163,17 @@ func (c *Controller) record(ctx context.Context, provisioner *v1alpha5.Provision func (c *Controller) set(provisioner *v1alpha5.Provisioner, resourceList v1.ResourceList, gaugeVec *prometheus.GaugeVec) error { provisionerKey := client.ObjectKeyFromObject(provisioner) + var labels []prometheus.Labels for resourceName, quantity := range resourceList { resourceTypeName := strings.ReplaceAll(strings.ToLower(string(resourceName)), "-", "_") - labels := c.makeLabels(provisioner, resourceTypeName) - existingLabels, _ := c.labelCollection.LoadOrStore(provisionerKey, []prometheus.Labels{}) - c.labelCollection.Store(provisionerKey, append(existingLabels.([]prometheus.Labels), labels)) + label := c.makeLabels(provisioner, resourceTypeName) + labels = append(labels, label) + // Store the label we are about to add to the label collection + c.labelCollection.Store(provisionerKey, labels) // gets existing gauge or gets a new one if it doesn't exist - gauge, err := gaugeVec.GetMetricWith(labels) + gauge, err := gaugeVec.GetMetricWith(label) if err != nil { return fmt.Errorf("creating or getting gauge: %w", err) }