diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc
index 9da73cf96920..049c46e6647d 100644
--- a/CHANGELOG.next.asciidoc
+++ b/CHANGELOG.next.asciidoc
@@ -290,6 +290,7 @@ field. You can revert this change by configuring tags for the module and omittin
 - Fix compute and pubsub dashboard for googlecloud module. {issue}18962[18962] {pull}18980[18980]
 - Fix crash on vsphere module when Host information is not available. {issue}18996[18996] {pull}19078[19078]
 - Fix incorrect usage of hints builder when exposed port is a substring of the hint {pull}19052[19052]
+- Stop counterCache only when already started {pull}19103[19103]
 - Remove dedot for tag values in aws module. {issue}19112[19112] {pull}19221[19221]
 
 *Packetbeat*
diff --git a/metricbeat/module/prometheus/collector/collector.go b/metricbeat/module/prometheus/collector/collector.go
index 690672ff8297..6941f30bd8ae 100644
--- a/metricbeat/module/prometheus/collector/collector.go
+++ b/metricbeat/module/prometheus/collector/collector.go
@@ -19,7 +19,6 @@ package collector
 
 import (
 	"regexp"
-	"sync"
 
 	"github.com/pkg/errors"
 	dto "github.com/prometheus/client_model/go"
@@ -76,13 +75,13 @@ type PromEventsGeneratorFactory func(ms mb.BaseMetricSet) (PromEventsGenerator,
 // MetricSet for fetching prometheus data
 type MetricSet struct {
 	mb.BaseMetricSet
-	prometheus     p.Prometheus
-	includeMetrics []*regexp.Regexp
-	excludeMetrics []*regexp.Regexp
-	namespace      string
-	promEventsGen  PromEventsGenerator
-	once           sync.Once
-	host           string
+	prometheus      p.Prometheus
+	includeMetrics  []*regexp.Regexp
+	excludeMetrics  []*regexp.Regexp
+	namespace       string
+	promEventsGen   PromEventsGenerator
+	host            string
+	eventGenStarted bool
 }
 
 // MetricSetBuilder returns a builder function for a new Prometheus metricset using
@@ -104,10 +103,11 @@ func MetricSetBuilder(namespace string, genFactory PromEventsGeneratorFactory) f
 		}
 
 		ms := &MetricSet{
-			BaseMetricSet: base,
-			prometheus:    prometheus,
-			namespace:     namespace,
-			promEventsGen: promEventsGen,
+			BaseMetricSet:   base,
+			prometheus:      prometheus,
+			namespace:       namespace,
+			promEventsGen:   promEventsGen,
+			eventGenStarted: false,
 		}
 		// store host here to use it as a pointer when building `up` metric
 		ms.host = ms.Host()
@@ -126,7 +126,10 @@ func MetricSetBuilder(namespace string, genFactory PromEventsGeneratorFactory) f
 
 // Fetch fetches data and reports it
 func (m *MetricSet) Fetch(reporter mb.ReporterV2) error {
-	m.once.Do(m.promEventsGen.Start)
+	if !m.eventGenStarted {
+		m.promEventsGen.Start()
+		m.eventGenStarted = true
+	}
 
 	families, err := m.prometheus.GetFamilies()
 	eventList := map[string]common.MapStr{}
@@ -186,7 +189,9 @@ func (m *MetricSet) Fetch(reporter mb.ReporterV2) error {
 
 // Close stops the metricset
 func (m *MetricSet) Close() error {
-	m.promEventsGen.Stop()
+	if m.eventGenStarted {
+		m.promEventsGen.Stop()
+	}
 	return nil
 }
 
diff --git a/x-pack/metricbeat/module/prometheus/collector/data.go b/x-pack/metricbeat/module/prometheus/collector/data.go
index 8f747ce16ffc..23ef386291b1 100644
--- a/x-pack/metricbeat/module/prometheus/collector/data.go
+++ b/x-pack/metricbeat/module/prometheus/collector/data.go
@@ -10,6 +10,7 @@ import (
 
 	"github.com/elastic/beats/v7/libbeat/common"
 	"github.com/elastic/beats/v7/libbeat/common/cfgwarn"
+	"github.com/elastic/beats/v7/libbeat/logp"
 	"github.com/elastic/beats/v7/metricbeat/mb"
 	"github.com/elastic/beats/v7/metricbeat/module/prometheus/collector"
 
@@ -54,6 +55,7 @@ func (g *typedGenerator) Start() {
 }
 
 func (g *typedGenerator) Stop() {
+	logp.Debug("prometheus.collector.cache", "stopping counterCache")
 	g.counterCache.Stop()
 }