Skip to content

Commit

Permalink
fix(hostmetricsreceiver): do not duplicate mountpoint metrics (#34635)
Browse files Browse the repository at this point in the history
Mountpoints can be reported multiple times for each mount into a
namespace. This causes duplicate metrics which causes issues with some
exporters. Each instance of the mountpoint will have identical metrics,
so it is safe to ignore repeated mountpoints.

Closes #34512

**Description:** <Describe what has changed.>
<!--Ex. Fixing a bug - Describe the bug and how this fixes the issue.
Ex. Adding a feature - Explain what this achieves.-->

**Link to tracking Issue:** <Issue number if applicable>

**Testing:** <Describe what testing was performed and which tests were
added.>

**Documentation:** <Describe the documentation added.>
  • Loading branch information
tcolgate authored Oct 9, 2024
1 parent a4fd3ae commit a2b67d9
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 0 deletions.
16 changes: 16 additions & 0 deletions .chloggen/hostmetrics-receiever-ignore-duplicate-filesystems.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: 'bug_fix'

# The name of the component, or a single word describing the area of concern, (e.g. operator, target allocator, github action)
component: hostmetrics receiver

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: "Fix duplicate filesystem metrics"

# One or more tracking issues related to the change
issues: [34635, 34512]

# (Optional) One or more lines of additional information to render under the primary note.
# These lines will be padded with 2 spaces and then inserted directly into the document.
# Use pipe (|) for multiline entries.
subtext: "The hostmetrics exposes duplicate metrics of identical mounts exposed in namespaces. The duplication causes errors in exporters that are sensitive to duplicate metrics. We can safely drop the duplicates as the metrics should be exactly the same."
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,23 @@ func (s *scraper) scrape(ctx context.Context) (pmetric.Metrics, error) {
}

usages := make([]*deviceUsage, 0, len(partitions))

type mountKey struct {
mountpoint string
device string
}
seen := map[mountKey]struct{}{}

for _, partition := range partitions {
key := mountKey{
mountpoint: partition.Mountpoint,
device: partition.Device,
}
if _, ok := seen[key]; partition.Mountpoint != "" && ok {
continue
}
seen[key] = struct{}{}

if !s.fsFilter.includePartition(partition) {
continue
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,41 @@ func TestScrape(t *testing.T) {
usageFunc: func(context.Context, string) (*disk.UsageStat, error) { return nil, errors.New("err2") },
expectedErr: "err2",
},
{
name: "Do not report duplicate mount points",
config: Config{
MetricsBuilderConfig: metadata.DefaultMetricsBuilderConfig(),
},
usageFunc: func(context.Context, string) (*disk.UsageStat, error) {
return &disk.UsageStat{
Fstype: "fs_type_a",
}, nil
},
partitionsFunc: func(context.Context, bool) ([]disk.PartitionStat, error) {
return []disk.PartitionStat{
{
Device: "device_a",
Mountpoint: "mount_point_a",
Fstype: "fs_type_a",
},
{
Device: "device_a",
Mountpoint: "mount_point_a",
Fstype: "fs_type_a",
},
}, nil
},
expectMetrics: true,
expectedDeviceDataPoints: 1,
expectedDeviceAttributes: []map[string]pcommon.Value{
{
"device": pcommon.NewValueStr("device_a"),
"mountpoint": pcommon.NewValueStr("mount_point_a"),
"type": pcommon.NewValueStr("fs_type_a"),
"mode": pcommon.NewValueStr("unknown"),
},
},
},
}

for _, test := range testCases {
Expand Down

0 comments on commit a2b67d9

Please sign in to comment.