From 9572d833fa1806a9bb41bff8930c13cd1073d5ca Mon Sep 17 00:00:00 2001 From: Tolya Korniltsev Date: Fri, 22 Nov 2024 15:51:37 +0700 Subject: [PATCH] Revert "fix: detect python apps better (#3712)" This reverts commit 543d6555708c5b7326b49c623538041b5d680404. --- ebpf/python/procinfo.go | 16 ---------------- ebpf/python/pyperf_pid_data.go | 12 ++++++++++-- ebpf/sd/target.go | 1 - ebpf/session.go | 25 +------------------------ 4 files changed, 11 insertions(+), 43 deletions(-) diff --git a/ebpf/python/procinfo.go b/ebpf/python/procinfo.go index 8ee0c112bc..f334cbcab3 100644 --- a/ebpf/python/procinfo.go +++ b/ebpf/python/procinfo.go @@ -3,7 +3,6 @@ package python import ( "bufio" "fmt" - "os" "path/filepath" "regexp" "strconv" @@ -22,21 +21,6 @@ type ProcInfo struct { var rePython = regexp.MustCompile("/.*/((?:lib)?python)(\\d+)\\.(\\d+)(?:[mu]?(-pyston\\d.\\d)?(?:\\.so)?)?(?:.1.0)?$") -func GetProcInfoForPid(pid uint32) (ProcInfo, error) { - mapsFD, err := os.Open(fmt.Sprintf("/proc/%d/maps", pid)) - if err != nil { - return ProcInfo{}, fmt.Errorf("reading proc maps %d: %w", pid, err) - } - defer mapsFD.Close() - - info, err := GetProcInfo(bufio.NewScanner(mapsFD)) - - if err != nil { - return ProcInfo{}, fmt.Errorf("GetPythonProcInfo error %s: %w", fmt.Sprintf("/proc/%d/maps", pid), err) - } - return info, nil -} - // GetProcInfo parses /proc/pid/map of a python process. func GetProcInfo(s *bufio.Scanner) (ProcInfo, error) { res := ProcInfo{} diff --git a/ebpf/python/pyperf_pid_data.go b/ebpf/python/pyperf_pid_data.go index a75ec0bc2d..e59f262de6 100644 --- a/ebpf/python/pyperf_pid_data.go +++ b/ebpf/python/pyperf_pid_data.go @@ -1,6 +1,7 @@ package python import ( + "bufio" "debug/elf" "fmt" "os" @@ -11,9 +12,16 @@ import ( ) func GetPyPerfPidData(l log.Logger, pid uint32, collectKernel bool) (*PerfPyPidData, error) { - info, err := GetProcInfoForPid(pid) + mapsFD, err := os.Open(fmt.Sprintf("/proc/%d/maps", pid)) if err != nil { - return nil, err + return nil, fmt.Errorf("reading proc maps %d: %w", pid, err) + } + defer mapsFD.Close() + + info, err := GetProcInfo(bufio.NewScanner(mapsFD)) + + if err != nil { + return nil, fmt.Errorf("GetPythonProcInfo error %s: %w", fmt.Sprintf("/proc/%d/maps", pid), err) } var pythonMeat []*symtab.ProcMap if info.LibPythonMaps == nil { diff --git a/ebpf/sd/target.go b/ebpf/sd/target.go index e349fdf111..f252113eb5 100644 --- a/ebpf/sd/target.go +++ b/ebpf/sd/target.go @@ -41,7 +41,6 @@ const ( OptionCollectKernel = labelMetaPyroscopeOptionsPrefix + "collect_kernel" OptionPythonFullFilePath = labelMetaPyroscopeOptionsPrefix + "python_full_file_path" OptionPythonEnabled = labelMetaPyroscopeOptionsPrefix + "python_enabled" - OptionPythonProfilingType = labelMetaPyroscopeOptionsPrefix + "python_profiling_type" OptionPythonBPFDebugLogEnabled = labelMetaPyroscopeOptionsPrefix + "python_bpf_debug_log" OptionPythonBPFErrorLogEnabled = labelMetaPyroscopeOptionsPrefix + "python_bpf_error_log" OptionDemangle = labelMetaPyroscopeOptionsPrefix + "demangle" diff --git a/ebpf/session.go b/ebpf/session.go index e085a39327..d816f751d6 100644 --- a/ebpf/session.go +++ b/ebpf/session.go @@ -691,7 +691,7 @@ func (s *session) selectProfilingType(pid uint32, target *sd.Target) procInfoLit } exe := filepath.Base(exePath) - if s.pythonEnabled(target) && isPythonProfilingType(pid, exe, target) { + if s.pythonEnabled(target) && strings.HasPrefix(exe, "python") || exe == "uwsgi" { return procInfoLite{pid: pid, comm: string(comm), typ: pyrobpf.ProfilingTypePython} } return procInfoLite{pid: pid, comm: string(comm), typ: pyrobpf.ProfilingTypeFramepointers} @@ -903,29 +903,6 @@ func (s *session) pythonEnabled(target *sd.Target) bool { return enabled } -func isPythonProfilingType(pid uint32, exe string, target *sd.Target) bool { - if v, present := target.GetFlag(sd.OptionPythonProfilingType); present { - return v - } - if strings.HasPrefix(exe, "python") { - return true - } - if exe == "uwsgi" { - return true - } - if exe == "streamlit" { - return true - } - pi, err := python.GetProcInfoForPid(pid) // todo(korniltsev): reorganize code to not do this twice - if err != nil { - return false - } - if pi.PythonMaps != nil || pi.LibPythonMaps != nil { - return true - } - return false -} - func (s *session) pythonBPFDebugLogEnabled(target *sd.Target) bool { enabled := s.options.PythonBPFDebugLogEnabled if v, present := target.GetFlag(sd.OptionPythonBPFDebugLogEnabled); present {