diff --git a/libbeat/processors/add_docker_metadata/add_docker_metadata.go b/libbeat/processors/add_docker_metadata/add_docker_metadata.go index c1b0afeb9fa..73ee82c4143 100644 --- a/libbeat/processors/add_docker_metadata/add_docker_metadata.go +++ b/libbeat/processors/add_docker_metadata/add_docker_metadata.go @@ -113,7 +113,9 @@ func buildDockerMetadataProcessor(log *logp.Logger, cfg *conf.C, watcherConstruc } reader, err := initCgroupPaths(resolve.NewTestResolver(config.HostFS), false) - if err != nil && !errors.Is(err, cgroup.ErrCgroupsMissing) { + if errors.Is(err, cgroup.ErrCgroupsMissing) { + reader = &processors.NilCGReader{} + } else if err != nil { return nil, fmt.Errorf("error creating cgroup reader: %w", err) } @@ -284,14 +286,13 @@ func (d *addDockerMetadata) getProcessCgroups(pid int) (cgroup.PathList, error) return cgroups, nil } - if d.cgreader == nil { - return cgroups, fs.ErrNotExist - } cgroups, err := d.cgreader.ProcessCgroupPaths(pid) if err != nil { return cgroups, fmt.Errorf("failed to read cgroups for pid=%v: %w", pid, err) } - + if len(cgroups.Flatten()) == 0 { + return cgroup.PathList{}, fs.ErrNotExist + } d.cgroups.Put(pid, cgroups) return cgroups, nil } diff --git a/libbeat/processors/add_process_metadata/add_process_metadata.go b/libbeat/processors/add_process_metadata/add_process_metadata.go index 6e88341993f..2385e5f99de 100644 --- a/libbeat/processors/add_process_metadata/add_process_metadata.go +++ b/libbeat/processors/add_process_metadata/add_process_metadata.go @@ -164,7 +164,9 @@ func newProcessMetadataProcessorWithProvider(config config, provider processMeta } reader, err := initCgroupPaths(resolve.NewTestResolver(config.HostPath), false) - if err != nil && !errors.Is(err, cgroup.ErrCgroupsMissing) { + if errors.Is(err, cgroup.ErrCgroupsMissing) { + reader = &processors.NilCGReader{} + } else if err != nil { return nil, fmt.Errorf("error creating cgroup reader: %w", err) } diff --git a/libbeat/processors/add_process_metadata/add_process_metadata_test.go b/libbeat/processors/add_process_metadata/add_process_metadata_test.go index 128b70a3d3c..d74297262cb 100644 --- a/libbeat/processors/add_process_metadata/add_process_metadata_test.go +++ b/libbeat/processors/add_process_metadata/add_process_metadata_test.go @@ -54,6 +54,22 @@ func newCGHandlerBuilder(handler testCGRsolver) processors.InitCgroupHandler { } } +func TestNilProcessor(t *testing.T) { + initCgroupPaths = func(rootfsMountpoint resolve.Resolver, ignoreRootCgroups bool) (processors.CGReader, error) { + return &processors.NilCGReader{}, nil + } + + proc, err := newProcessMetadataProcessorWithProvider(defaultConfig(), &procCache, false) + require.NoError(t, err) + + // make sure a nil cgroup reader doesn't blow anything up + unwrapped, _ := proc.(*addProcessMetadata) + metadata, err := unwrapped.provider.GetProcessMetadata(os.Getpid()) + require.NoError(t, err) + require.NotNil(t, metadata) + +} + func TestDefaultProcessorStartup(t *testing.T) { // set initCgroupPaths to system non-test defaults initCgroupPaths = func(rootfsMountpoint resolve.Resolver, ignoreRootCgroups bool) (processors.CGReader, error) { @@ -67,7 +83,7 @@ func TestDefaultProcessorStartup(t *testing.T) { unwrapped, _ := proc.(*addProcessMetadata) metadata, err := unwrapped.provider.GetProcessMetadata(os.Getpid()) require.NoError(t, err) - require.NotNil(t, metadata) + require.NotNil(t, metadata.fields) } func TestAddProcessMetadata(t *testing.T) { diff --git a/libbeat/processors/add_process_metadata/gosigar_cid_provider.go b/libbeat/processors/add_process_metadata/gosigar_cid_provider.go index d1f09c5fd85..bd16e62f966 100644 --- a/libbeat/processors/add_process_metadata/gosigar_cid_provider.go +++ b/libbeat/processors/add_process_metadata/gosigar_cid_provider.go @@ -55,7 +55,7 @@ func (p gosigarCidProvider) GetCid(pid int) (result string, err error) { cgroups, err := p.getProcessCgroups(pid) if err != nil { - p.log.Debugf("failed to get cgroups for pid=%v: %v", pid, err) + return "", fmt.Errorf("failed to get cgroups for pid=%v: %w", pid, err) } cid = p.getContainerID(cgroups) @@ -81,9 +81,6 @@ func newCidProvider(cgroupPrefixes []string, cgroupRegex *regexp.Regexp, process // returns an error if it failed to retrieve the cgroup info. func (p gosigarCidProvider) getProcessCgroups(pid int) (cgroup.PathList, error) { //return nil if we aren't supporting cgroups - if p.processCgroupPaths == nil { - return cgroup.PathList{}, nil - } pathList, err := p.processCgroupPaths.ProcessCgroupPaths(pid) if err != nil { return cgroup.PathList{}, fmt.Errorf("failed to read cgroups for pid=%v: %w", pid, err) diff --git a/libbeat/processors/cgroups.go b/libbeat/processors/cgroups.go index 8e54ae5535b..25d67fbe41a 100644 --- a/libbeat/processors/cgroups.go +++ b/libbeat/processors/cgroups.go @@ -18,6 +18,8 @@ package processors import ( + "io/fs" + "github.com/elastic/elastic-agent-system-metrics/metric/system/cgroup" "github.com/elastic/elastic-agent-system-metrics/metric/system/resolve" ) @@ -30,3 +32,12 @@ type InitCgroupHandler = func(rootfsMountpoint resolve.Resolver, ignoreRootCgrou type CGReader interface { ProcessCgroupPaths(pid int) (cgroup.PathList, error) } + +// NilCGReader does nothing +type NilCGReader struct { +} + +// ProcessCgroupPaths returns a blank pathLists and fs.ErrNotExist +func (*NilCGReader) ProcessCgroupPaths(_ int) (cgroup.PathList, error) { + return cgroup.PathList{}, fs.ErrNotExist +}