From 19ca93d5cebadd814982f371c70f9e5a4b8a80ca Mon Sep 17 00:00:00 2001 From: Todd Treece <360020+toddtreece@users.noreply.github.com> Date: Wed, 11 Jan 2023 08:27:47 -0500 Subject: [PATCH] Prometheus: Fix concurrency issue with exemplar sampler initialization (#61281) --- pkg/tsdb/prometheus/querydata/request.go | 6 +++--- pkg/tsdb/prometheus/querydata/response.go | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/tsdb/prometheus/querydata/request.go b/pkg/tsdb/prometheus/querydata/request.go index 99acce2a2a2..e8175e84be4 100644 --- a/pkg/tsdb/prometheus/querydata/request.go +++ b/pkg/tsdb/prometheus/querydata/request.go @@ -43,7 +43,7 @@ type QueryData struct { URL string TimeInterval string enableWideSeries bool - exemplarSampler exemplar.Sampler + exemplarSampler func() exemplar.Sampler } func New( @@ -67,10 +67,10 @@ func New( promClient := client.NewClient(httpClient, httpMethod, settings.URL) // standard deviation sampler is the default for backwards compatibility - exemplarSampler := exemplar.NewStandardDeviationSampler() + exemplarSampler := exemplar.NewStandardDeviationSampler if features.IsEnabled(featuremgmt.FlagDisablePrometheusExemplarSampling) { - exemplarSampler = exemplar.NewNoOpSampler() + exemplarSampler = exemplar.NewNoOpSampler } return &QueryData{ diff --git a/pkg/tsdb/prometheus/querydata/response.go b/pkg/tsdb/prometheus/querydata/response.go index 2d8f8a2a06f..b0ab2049d82 100644 --- a/pkg/tsdb/prometheus/querydata/response.go +++ b/pkg/tsdb/prometheus/querydata/response.go @@ -47,14 +47,14 @@ func (s *QueryData) parseResponse(ctx context.Context, q *models.Query, res *htt } func (s *QueryData) processExemplars(q *models.Query, dr *backend.DataResponse) *backend.DataResponse { - s.exemplarSampler.Reset() + sampler := s.exemplarSampler() labelTracker := exemplar.NewLabelTracker() // we are moving from a multi-frame response returned // by the converter to a single exemplar frame, // so we need to build a new frame array with the // old exemplar frames filtered out - framer := exemplar.NewFramer(s.exemplarSampler, labelTracker) + framer := exemplar.NewFramer(sampler, labelTracker) for _, frame := range dr.Frames { // we don't need to process non-exemplar frames @@ -69,7 +69,7 @@ func (s *QueryData) processExemplars(q *models.Query, dr *backend.DataResponse) framer.SetRefID(frame.RefID) step := time.Duration(frame.Fields[0].Config.Interval) * time.Millisecond - s.exemplarSampler.SetStep(step) + sampler.SetStep(step) seriesLabels := getSeriesLabels(frame) labelTracker.Add(seriesLabels) @@ -83,7 +83,7 @@ func (s *QueryData) processExemplars(q *models.Query, dr *backend.DataResponse) Timestamp: row[0].(time.Time), SeriesLabels: seriesLabels, } - s.exemplarSampler.Add(ex) + sampler.Add(ex) } }