From 852d101610a2726bb07b312a5d18e30c0ad61bc4 Mon Sep 17 00:00:00 2001 From: Jay Camp Date: Tue, 29 Jun 2021 12:49:17 -0400 Subject: [PATCH] scraperhelper: fix case when returned pdata is empty On error pdata.Metrics may not be initialized so guard against it. Update test to return uninitialized object on error. --- receiver/scraperhelper/scraper.go | 34 ++++++------------- .../scraperhelper/scrapercontroller_test.go | 4 +-- 2 files changed, 12 insertions(+), 26 deletions(-) diff --git a/receiver/scraperhelper/scraper.go b/receiver/scraperhelper/scraper.go index 1721526949f..d891431ec8d 100644 --- a/receiver/scraperhelper/scraper.go +++ b/receiver/scraperhelper/scraper.go @@ -22,6 +22,7 @@ import ( "go.opentelemetry.io/collector/config" "go.opentelemetry.io/collector/model/pdata" "go.opentelemetry.io/collector/obsreport" + "go.opentelemetry.io/collector/receiver/scrapererror" ) // ScrapeMetrics scrapes metrics. @@ -106,12 +107,11 @@ func (ms metricsScraper) Scrape(ctx context.Context, receiverID config.Component ctx = scrp.StartMetricsOp(ctx) metrics, err := ms.ScrapeMetrics(ctx) count := 0 - if err == nil { - count = metrics.Len() - } - md := pdata.NewMetrics() - if metrics.Len() > 0 { + md := pdata.Metrics{} + if err == nil || scrapererror.IsPartialScrapeError(err) { + md = pdata.NewMetrics() metrics.MoveAndAppendTo(md.ResourceMetrics().AppendEmpty().InstrumentationLibraryMetrics().AppendEmpty().Metrics()) + count = md.MetricCount() } scrp.EndMetricsOp(ctx, count, err) return md, err @@ -153,29 +153,15 @@ func (rms resourceMetricsScraper) Scrape(ctx context.Context, receiverID config. scrp := obsreport.NewScraper(obsreport.ScraperSettings{ReceiverID: receiverID, Scraper: rms.ID()}) ctx = scrp.StartMetricsOp(ctx) resourceMetrics, err := rms.ScrapeResourceMetrics(ctx) - count := 0 - if err == nil { - count = metricCount(resourceMetrics) - } - md := pdata.NewMetrics() - if resourceMetrics.Len() > 0 { + count := 0 + md := pdata.Metrics{} + if err == nil || scrapererror.IsPartialScrapeError(err) { + md = pdata.NewMetrics() resourceMetrics.MoveAndAppendTo(md.ResourceMetrics()) + count = md.MetricCount() } scrp.EndMetricsOp(ctx, count, err) return md, err } - -func metricCount(resourceMetrics pdata.ResourceMetricsSlice) int { - count := 0 - - for i := 0; i < resourceMetrics.Len(); i++ { - ilm := resourceMetrics.At(i).InstrumentationLibraryMetrics() - for j := 0; j < ilm.Len(); j++ { - count += ilm.At(j).Metrics().Len() - } - } - - return count -} diff --git a/receiver/scraperhelper/scrapercontroller_test.go b/receiver/scraperhelper/scrapercontroller_test.go index a7edea04e45..a6b602f8df0 100644 --- a/receiver/scraperhelper/scrapercontroller_test.go +++ b/receiver/scraperhelper/scrapercontroller_test.go @@ -68,7 +68,7 @@ func (ts *testScrapeMetrics) scrape(_ context.Context) (pdata.MetricSlice, error ts.ch <- ts.timesScrapeCalled if ts.err != nil { - return pdata.NewMetricSlice(), ts.err + return pdata.MetricSlice{}, ts.err } return singleMetric(), nil @@ -85,7 +85,7 @@ func (ts *testScrapeResourceMetrics) scrape(_ context.Context) (pdata.ResourceMe ts.ch <- ts.timesScrapeCalled if ts.err != nil { - return pdata.NewResourceMetricsSlice(), ts.err + return pdata.ResourceMetricsSlice{}, ts.err } return singleResourceMetric(), nil