diff --git a/receiver/hostmetricsreceiver/internal/scraper/filesystemscraper/filesystem_scraper.go b/receiver/hostmetricsreceiver/internal/scraper/filesystemscraper/filesystem_scraper.go index 2147cf2a292..f1c73d73c7b 100644 --- a/receiver/hostmetricsreceiver/internal/scraper/filesystemscraper/filesystem_scraper.go +++ b/receiver/hostmetricsreceiver/internal/scraper/filesystemscraper/filesystem_scraper.go @@ -91,6 +91,11 @@ func (s *scraper) ScrapeMetrics(_ context.Context) (pdata.MetricSlice, error) { var errors []error usages := make([]*deviceUsage, 0, len(partitions)) for _, partition := range partitions { + // Skip partition stats having more than one mount point for the same device + if deviceUsageAlreadySet(partition.Device, usages) { + continue + } + usage, err := s.usage(partition.Mountpoint) if err != nil { errors = append(errors, err) @@ -113,6 +118,15 @@ func (s *scraper) ScrapeMetrics(_ context.Context) (pdata.MetricSlice, error) { return metrics, componenterror.CombineErrors(errors) } +func deviceUsageAlreadySet(device string, usages []*deviceUsage) bool { + for _, usage := range usages { + if device == usage.deviceName { + return true + } + } + return false +} + func initializeFileSystemUsageMetric(metric pdata.Metric, now pdata.TimestampUnixNano, deviceUsages []*deviceUsage) { fileSystemUsageDescriptor.CopyTo(metric.MetricDescriptor()) diff --git a/receiver/hostmetricsreceiver/internal/scraper/filesystemscraper/filesystem_scraper_test.go b/receiver/hostmetricsreceiver/internal/scraper/filesystemscraper/filesystem_scraper_test.go index d7d0ab5394b..2775a3266a6 100644 --- a/receiver/hostmetricsreceiver/internal/scraper/filesystemscraper/filesystem_scraper_test.go +++ b/receiver/hostmetricsreceiver/internal/scraper/filesystemscraper/filesystem_scraper_test.go @@ -58,6 +58,20 @@ func TestScrapeMetrics(t *testing.T) { expectMetrics: true, expectedDeviceDataPoints: 1, }, + { + name: "No duplicate metrics for devices having many mount point", + partitionsFunc: func(bool) ([]disk.PartitionStat, error) { + return []disk.PartitionStat{ + {Device: "a", Mountpoint: "/mnt/a1"}, + {Device: "a", Mountpoint: "/mnt/a2"}, + }, nil + }, + usageFunc: func(string) (*disk.UsageStat, error) { + return &disk.UsageStat{}, nil + }, + expectMetrics: true, + expectedDeviceDataPoints: 1, + }, { name: "Include Filter that matches nothing", config: Config{Include: MatchConfig{filterset.Config{MatchType: "strict"}, []string{"@*^#&*$^#)"}}},