in metric/system/process/process_linux_common.go [284:311]
func getEnvData(hostfs resolve.Resolver, pid int, filter func(string) bool) (mapstr.M, error) {
path := hostfs.Join("proc", strconv.Itoa(pid), "environ")
data, err := os.ReadFile(path)
if errors.Is(err, os.ErrPermission) { // pass through permission errors
return nil, err
} else if err != nil {
return nil, fmt.Errorf("error opening file %s: %w", path, err)
}
env := mapstr.M{}
pairs := bytes.Split(data, []byte{0})
for _, kv := range pairs {
parts := bytes.SplitN(kv, []byte{'='}, 2)
if len(parts) != 2 {
continue
}
key := string(bytes.TrimSpace(parts[0]))
if key == "" {
continue
}
if filter == nil || filter(key) {
env[key] = string(bytes.TrimSpace(parts[1]))
}
}
return env, nil
}