diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index 39c72c373..c0c5b8942 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -296,6 +296,11 @@ func (c *Controller) syncHandler(key string) error { return nil } + // Clean the metrics if marked for deletion + if cd.ObjectMeta.DeletionTimestamp != nil { + c.recorder.DeleteMetrics(cd) + } + // set status condition for new canaries if cd.Status.Conditions == nil { if err := c.setPhaseInitializing(cd); err != nil { diff --git a/pkg/metrics/recorder.go b/pkg/metrics/recorder.go index 85e4d6e0a..0d3a9603c 100644 --- a/pkg/metrics/recorder.go +++ b/pkg/metrics/recorder.go @@ -186,6 +186,53 @@ func (cr *Recorder) IncFailures(labels CanaryMetricLabels) { cr.failures.WithLabelValues(labels.Values()...).Inc() } +// DeleteMetrics deletes the canary related metrics +func (cr *Recorder) DeleteMetrics(cd *flaggerv1.Canary) { + cr.DeleteDuration(cd) + cr.DeleteStatus(cd) + cr.DeleteWeight(cd) + for _, status := range []string{AnalysisStatusCompleted, AnalysisStatusSkipped} { + cr.DeleteSuccesses(CanaryMetricLabels{ + Name: cd.Spec.TargetRef.Name, + Namespace: cd.Namespace, + DeploymentStrategy: cd.DeploymentStrategy(), + AnalysisStatus: status, + }) + cr.DeleteFailures(CanaryMetricLabels{ + Name: cd.Spec.TargetRef.Name, + Namespace: cd.Namespace, + DeploymentStrategy: cd.DeploymentStrategy(), + AnalysisStatus: status, + }) + } +} + +// DeleteDuration deletes the canary durations metric +func (cr *Recorder) DeleteDuration(cd *flaggerv1.Canary) { + cr.duration.DeleteLabelValues(cd.Spec.TargetRef.Name, cd.Namespace) +} + +// DeleteStatus deletes the canary analysis status +func (cr *Recorder) DeleteStatus(cd *flaggerv1.Canary) { + cr.status.DeleteLabelValues(cd.Spec.TargetRef.Name, cd.Namespace) +} + +// DeleteWeight sets the weight values for primary and canary destinations +func (cr *Recorder) DeleteWeight(cd *flaggerv1.Canary) { + cr.weight.DeleteLabelValues(fmt.Sprintf("%s-primary", cd.Spec.TargetRef.Name), cd.Namespace) + cr.weight.DeleteLabelValues(cd.Spec.TargetRef.Name, cd.Namespace) +} + +// DeleteSuccesses deletes the total success metric +func (cr *Recorder) DeleteSuccesses(labels CanaryMetricLabels) { + cr.successes.DeleteLabelValues(labels.Values()...) +} + +// DeleteFailures deletes the total failures metric +func (cr *Recorder) DeleteFailures(labels CanaryMetricLabels) { + cr.failures.DeleteLabelValues(labels.Values()...) +} + // GetStatusMetric returns the status metric func (cr *Recorder) GetStatusMetric() *prometheus.GaugeVec { return cr.status