diff --git a/pkg/exporter/exporter.go b/pkg/exporter/exporter.go index 07d5a461..3e26daca 100644 --- a/pkg/exporter/exporter.go +++ b/pkg/exporter/exporter.go @@ -37,6 +37,7 @@ type Registry interface { GetHistogram(metricName string, labels prometheus.Labels, help string, mapping *mapper.MetricMapping, metricsCount *prometheus.GaugeVec) (prometheus.Observer, error) GetSummary(metricName string, labels prometheus.Labels, help string, mapping *mapper.MetricMapping, metricsCount *prometheus.GaugeVec) (prometheus.Observer, error) RemoveStaleMetrics() + ClearRegistry() } type Exporter struct { diff --git a/pkg/registry/registry.go b/pkg/registry/registry.go index 825cb14c..c1aca279 100644 --- a/pkg/registry/registry.go +++ b/pkg/registry/registry.go @@ -395,6 +395,25 @@ func (r *Registry) RemoveStaleMetrics() { } } +func (r *Registry) ClearRegistry() { + for metricName, metric := range r.Metrics { + for hash, rm := range metric.Metrics { + metric.Vectors[rm.VecKey].Holder.Delete(rm.Labels) + metric.Vectors[rm.VecKey].RefCount-- + delete(metric.Metrics, hash) + } + // Clear vectors that have no remaining metrics + for vecHash, vec := range metric.Vectors { + if vec.RefCount <= 0 { + delete(metric.Vectors, vecHash) + } + } + if len(metric.Vectors) == 0 { + delete(r.Metrics, metricName) + } + } +} + // Calculates a hash of both the label names and values. func (r *Registry) HashLabels(labels prometheus.Labels) (metrics.LabelHash, []string) { r.Hasher.Reset()