diff --git a/internal/component/pyroscope/ebpf/ebpf_linux.go b/internal/component/pyroscope/ebpf/ebpf_linux.go index e3e15b4a60d..141839a735e 100644 --- a/internal/component/pyroscope/ebpf/ebpf_linux.go +++ b/internal/component/pyroscope/ebpf/ebpf_linux.go @@ -65,7 +65,7 @@ func New(logger log.Logger, reg prometheus.Registerer, id string, args Arguments if err != nil { return nil, err } - cfg.FileObserver = nfs + cfg.ExecutableReporter = nfs if dynamicProfilingPolicy { cfg.Policy = &dynamicprofiling.ServiceDiscoveryTargetsOnlyPolicy{Discovery: discovery} @@ -138,8 +138,10 @@ func (c *Component) Run(ctx context.Context) error { c.metrics.profilingSessionsTotal.Inc() defer func() { ctlr.Shutdown() - if c.cfg.FileObserver != nil { - c.cfg.FileObserver.Cleanup() + if c.cfg.ExecutableReporter != nil { + if nfs, ok := c.cfg.ExecutableReporter.(*irsymcache.Resolver); ok { + nfs.Cleanup() + } } }() diff --git a/internal/component/pyroscope/ebpf/reporter/pprof.go b/internal/component/pyroscope/ebpf/reporter/pprof.go index cddc34367dc..591633bb14c 100644 --- a/internal/component/pyroscope/ebpf/reporter/pprof.go +++ b/internal/component/pyroscope/ebpf/reporter/pprof.go @@ -93,7 +93,6 @@ func (p *PPROFReporter) ReportTraceEvent(trace *libpf.Trace, meta *samples.Trace ProcessName: meta.ProcessName, ExecutablePath: meta.ExecutablePath, ApmServiceName: meta.APMServiceName, - ExtraMeta: containerID, Pid: int64(meta.PID), Tid: int64(meta.TID), } @@ -163,9 +162,9 @@ func (p *PPROFReporter) reportProfile(ctx context.Context) { *traceEventsPtr = newEvents p.traceEvents.WUnlock(&traceEventsPtr) var profiles []PPROF - for _, ts := range reportedEvents { + for containerID, ts := range reportedEvents { for origin, events := range ts { - pp := p.createProfile(origin, events) + pp := p.createProfile(containerID, origin, events) profiles = append(profiles, pp...) } } @@ -178,7 +177,7 @@ func (p *PPROFReporter) reportProfile(ctx context.Context) { _ = level.Debug(p.log).Log("msg", "pprof report successful", "count", len(profiles), "total-size", sz) } -func (p *PPROFReporter) createProfile(origin libpf.Origin, events map[samples.TraceAndMetaKey]*samples.TraceEvents) []PPROF { +func (p *PPROFReporter) createProfile(containerID samples.ContainerID, origin libpf.Origin, events map[samples.TraceAndMetaKey]*samples.TraceEvents) []PPROF { defer func() { if p.cfg.ExtraNativeSymbolResolver != nil { p.cfg.ExtraNativeSymbolResolver.Cleanup() @@ -192,7 +191,7 @@ func (p *PPROFReporter) createProfile(origin libpf.Origin, events map[samples.Tr }) for traceKey, traceInfo := range events { - target := p.sd.FindTarget(uint32(traceKey.Pid), traceKey.ExtraMeta.(string)) + target := p.sd.FindTarget(uint32(traceKey.Pid), string(containerID)) if target == nil { continue } diff --git a/internal/component/pyroscope/ebpf/reporter/pprof_test.go b/internal/component/pyroscope/ebpf/reporter/pprof_test.go index 804f5f497de..112b26a72b8 100644 --- a/internal/component/pyroscope/ebpf/reporter/pprof_test.go +++ b/internal/component/pyroscope/ebpf/reporter/pprof_test.go @@ -9,7 +9,6 @@ import ( "github.com/google/pprof/profile" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/ebpf-profiler/host" "go.opentelemetry.io/ebpf-profiler/libpf/pfelf" "go.opentelemetry.io/ebpf-profiler/libpf" @@ -17,6 +16,7 @@ import ( "go.opentelemetry.io/ebpf-profiler/support" discovery "go.opentelemetry.io/ebpf-profiler/pyroscope/discovery" + "go.opentelemetry.io/ebpf-profiler/pyroscope/symb/irsymcache" ) func singleFrameTrace(ty libpf.FrameType, mappingFile libpf.FrameMappingFile, lineno libpf.AddressOrLineno, funcName, sourceFile string, sourceLine libpf.SourceLineno) libpf.Frames { @@ -73,6 +73,7 @@ func TestPPROFReporter_StringAndFunctionTablePopulation(t *testing.T) { } profiles := rep.createProfile( + samples.ContainerID(""), support.TraceOriginSampling, events, ) @@ -129,6 +130,7 @@ func TestPPROFReporter_NativeFrame(t *testing.T) { }, } profiles := rep.createProfile( + samples.ContainerID(""), support.TraceOriginSampling, events, ) @@ -172,6 +174,7 @@ func TestPPROFReporter_WithoutMapping(t *testing.T) { } profiles := rep.createProfile( + samples.ContainerID(""), support.TraceOriginSampling, events, ) @@ -230,6 +233,7 @@ func TestPPROFReporter_Bug(t *testing.T) { } profiles := rep.createProfile( + samples.ContainerID(""), support.TraceOriginSampling, events, ) @@ -259,12 +263,12 @@ Mappings func TestPPROFReporter_Demangle(t *testing.T) { fid := libpf.NewFileID(7, 13) key := symbolizerKey{ - fid: host.FileIDFromLibpf(fid), + fid: fid, addr: 0xcafe00de, } rep := newReporter() rep.cfg.ExtraNativeSymbolResolver = &symbolizer{ - symbols: map[symbolizerKey]samples.SourceInfo{ + symbols: map[symbolizerKey]irsymcache.SourceInfo{ key: { LineNumber: 9, FunctionName: libpf.Intern("_ZN15PlatformMonitor4waitEm"), @@ -316,6 +320,7 @@ func TestPPROFReporter_Demangle(t *testing.T) { } profiles := rep.createProfile( + samples.ContainerID(""), support.TraceOriginSampling, events, ) @@ -379,6 +384,7 @@ func TestPPROFReporter_UnsymbolizedStub(t *testing.T) { } profiles := rep.createProfile( + samples.ContainerID(""), support.TraceOriginSampling, events, ) @@ -406,23 +412,23 @@ Mappings } type symbolizer struct { - symbols map[symbolizerKey]samples.SourceInfo + symbols map[symbolizerKey]irsymcache.SourceInfo } type symbolizerKey struct { - fid host.FileID + fid libpf.FileID addr uint64 } -func (s symbolizer) ExecutableKnown(id host.FileID) bool { +func (s symbolizer) ExecutableKnown(id libpf.FileID) bool { return true } -func (s symbolizer) ObserveExecutable(id host.FileID, ref *pfelf.Reference) error { +func (s symbolizer) ObserveExecutable(id libpf.FileID, ref *pfelf.Reference) error { return nil } -func (s symbolizer) ResolveAddress(file host.FileID, addr uint64) (samples.SourceInfo, error) { +func (s symbolizer) ResolveAddress(file libpf.FileID, addr uint64) (irsymcache.SourceInfo, error) { return s.symbols[symbolizerKey{fid: file, addr: addr}], nil }