diff --git a/filebeat/autodiscover/defaults_aix.go b/filebeat/autodiscover/defaults_aix.go index 713b13ca8b3..a7583ff8778 100644 --- a/filebeat/autodiscover/defaults_aix.go +++ b/filebeat/autodiscover/defaults_aix.go @@ -17,9 +17,27 @@ //go:build aix +<<<<<<< HEAD:filebeat/autodiscover/defaults_aix.go package autodiscover +======= +import ( + "io/fs" + + "github.com/elastic/elastic-agent-system-metrics/metric/system/cgroup" + "github.com/elastic/elastic-agent-system-metrics/metric/system/resolve" +) +>>>>>>> 764ba96d34 (Create nil cgroups reader for processor, improve error handling (#41198)):libbeat/processors/cgroups.go // InitializeModule initializes this module. func InitializeModule() { // does nothing on aix } + +// 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 +} diff --git a/libbeat/processors/add_docker_metadata/add_docker_metadata.go b/libbeat/processors/add_docker_metadata/add_docker_metadata.go index d670713894d..563758a8777 100644 --- a/libbeat/processors/add_docker_metadata/add_docker_metadata.go +++ b/libbeat/processors/add_docker_metadata/add_docker_metadata.go @@ -110,6 +110,16 @@ func buildDockerMetadataProcessor(log *logp.Logger, cfg *conf.C, watcherConstruc } } +<<<<<<< HEAD +======= + reader, err := initCgroupPaths(resolve.NewTestResolver(config.HostFS), false) + if errors.Is(err, cgroup.ErrCgroupsMissing) { + reader = &processors.NilCGReader{} + } else if err != nil { + return nil, fmt.Errorf("error creating cgroup reader: %w", err) + } + +>>>>>>> 764ba96d34 (Create nil cgroups reader for processor, improve error handling (#41198)) return &addDockerMetadata{ log: log, watcher: watcher, @@ -277,11 +287,17 @@ func (d *addDockerMetadata) getProcessCgroups(pid int) (cgroup.PathList, error) return cgroups, nil } +<<<<<<< HEAD cgroups, err := processCgroupPaths(d.hostFS, pid) +======= + cgroups, err := d.cgreader.ProcessCgroupPaths(pid) +>>>>>>> 764ba96d34 (Create nil cgroups reader for processor, improve error handling (#41198)) 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 8bb8ecea5a9..0f6442c925a 100644 --- a/libbeat/processors/add_process_metadata/add_process_metadata.go +++ b/libbeat/processors/add_process_metadata/add_process_metadata.go @@ -160,6 +160,16 @@ func newProcessMetadataProcessorWithProvider(config config, provider processMeta } } +<<<<<<< HEAD +======= + reader, err := initCgroupPaths(resolve.NewTestResolver(config.HostPath), false) + if errors.Is(err, cgroup.ErrCgroupsMissing) { + reader = &processors.NilCGReader{} + } else if err != nil { + return nil, fmt.Errorf("error creating cgroup reader: %w", err) + } + +>>>>>>> 764ba96d34 (Create nil cgroups reader for processor, improve error handling (#41198)) // don't use cgroup.ProcessCgroupPaths to save it from doing the work when container id disabled if ok := containsValue(mappings, "container.id"); ok { if withCache && config.CgroupCacheExpireTime != 0 { 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 977a554f320..f45c85909a7 100644 --- a/libbeat/processors/add_process_metadata/add_process_metadata_test.go +++ b/libbeat/processors/add_process_metadata/add_process_metadata_test.go @@ -38,6 +38,55 @@ import ( "github.com/elastic/elastic-agent-system-metrics/metric/system/resolve" ) +<<<<<<< HEAD +======= +type testCGRsolver struct { + res func(pid int) (cgroup.PathList, error) +} + +func (t testCGRsolver) ProcessCgroupPaths(pid int) (cgroup.PathList, error) { + return t.res(pid) +} + +func newCGHandlerBuilder(handler testCGRsolver) processors.InitCgroupHandler { + return func(_ resolve.Resolver, _ bool) (processors.CGReader, error) { + return handler, nil + } +} + +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) { + return cgroup.NewReader(rootfsMountpoint, ignoreRootCgroups) + } + + proc, err := newProcessMetadataProcessorWithProvider(defaultConfig(), &procCache, false) + require.NoError(t, err) + + // ensure the underlying provider has been initialized properly + unwrapped, _ := proc.(*addProcessMetadata) + metadata, err := unwrapped.provider.GetProcessMetadata(os.Getpid()) + require.NoError(t, err) + require.NotNil(t, metadata.fields) +} + +>>>>>>> 764ba96d34 (Create nil cgroups reader for processor, improve error handling (#41198)) func TestAddProcessMetadata(t *testing.T) { logp.TestingSetup(logp.WithSelectors(processorName)) diff --git a/libbeat/processors/add_process_metadata/gosigar_cid_provider.go b/libbeat/processors/add_process_metadata/gosigar_cid_provider.go index 00c46f2b8bf..581a017282a 100644 --- a/libbeat/processors/add_process_metadata/gosigar_cid_provider.go +++ b/libbeat/processors/add_process_metadata/gosigar_cid_provider.go @@ -58,7 +58,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) @@ -84,7 +84,12 @@ func newCidProvider(hostPath resolve.Resolver, cgroupPrefixes []string, cgroupRe // getProcessCgroups returns a mapping of cgroup subsystem name to path. It // returns an error if it failed to retrieve the cgroup info. func (p gosigarCidProvider) getProcessCgroups(pid int) (cgroup.PathList, error) { +<<<<<<< HEAD pathList, err := p.processCgroupPaths(p.hostPath, pid) +======= + //return nil if we aren't supporting cgroups + pathList, err := p.processCgroupPaths.ProcessCgroupPaths(pid) +>>>>>>> 764ba96d34 (Create nil cgroups reader for processor, improve error handling (#41198)) if err != nil { var pathError *fs.PathError if errors.As(err, &pathError) {