@@ -55,19 +55,43 @@ type Manager struct {
55
55
}
56
56
57
57
// NewManager returns a new [Manager].
58
- func NewManager (logger * slog.Logger , otelController * opentelemetry.Controller , cp ConfigProvider , probes ... probe.Probe ) (* Manager , error ) {
58
+ func NewManager (logger * slog.Logger , otelController * opentelemetry.Controller , pid process. ID , cp ConfigProvider , probes ... probe.Probe ) (* Manager , error ) {
59
59
m := & Manager {
60
60
logger : logger ,
61
61
probes : make (map [probe.ID ]probe.Probe ),
62
62
otelController : otelController ,
63
63
cp : cp ,
64
64
}
65
65
66
- err := m .registerProbes (probes )
66
+ funcs := make (map [string ]any )
67
+ for _ , p := range probes {
68
+ if err := m .registerProbe (p ); err != nil {
69
+ return nil , err
70
+ }
71
+
72
+ for _ , s := range p .Manifest ().Symbols {
73
+ funcs [s .Symbol ] = nil
74
+ }
75
+ }
76
+
77
+ pa := process .NewAnalyzer (logger , pid )
78
+
79
+ var err error
80
+ m .proc , err = pa .Analyze (funcs )
67
81
if err != nil {
68
82
return nil , err
69
83
}
70
84
85
+ alloc , err := process .Allocate (logger , pid )
86
+ if err != nil {
87
+ return nil , err
88
+ }
89
+ m .proc .Allocation = alloc
90
+
91
+ m .logger .Info ("loaded process info" , "process" , m .proc )
92
+
93
+ m .filterUnusedProbes ()
94
+
71
95
return m , nil
72
96
}
73
97
@@ -103,23 +127,11 @@ func (m *Manager) registerProbe(p probe.Probe) error {
103
127
return nil
104
128
}
105
129
106
- // GetRelevantFuncs returns the instrumented functions for all managed probes.
107
- func (m * Manager ) GetRelevantFuncs () map [string ]interface {} {
108
- funcsMap := make (map [string ]interface {})
109
- for _ , i := range m .probes {
110
- for _ , s := range i .Manifest ().Symbols {
111
- funcsMap [s .Symbol ] = nil
112
- }
113
- }
114
-
115
- return funcsMap
116
- }
117
-
118
- // FilterUnusedProbes filterers probes whose functions are already instrumented
130
+ // filterUnusedProbes filterers probes whose functions are already instrumented
119
131
// out of the Manager.
120
- func (m * Manager ) FilterUnusedProbes ( target * process. Info ) {
132
+ func (m * Manager ) filterUnusedProbes ( ) {
121
133
existingFuncMap := make (map [string ]interface {})
122
- for _ , f := range target .Functions {
134
+ for _ , f := range m . proc .Functions {
123
135
existingFuncMap [f .Name ] = nil
124
136
}
125
137
@@ -237,14 +249,14 @@ func (m *Manager) ConfigLoop(ctx context.Context) {
237
249
}
238
250
}
239
251
240
- func (m * Manager ) Load (ctx context.Context , target * process. Info ) error {
252
+ func (m * Manager ) Load (ctx context.Context ) error {
241
253
if len (m .probes ) == 0 {
242
254
return errors .New ("no instrumentation for target process" )
243
255
}
244
256
if m .cp == nil {
245
257
return errors .New ("no config provider set" )
246
258
}
247
- if target == nil {
259
+ if m . proc == nil {
248
260
return errors .New ("target details not set - load is called on non-initialized instrumentation" )
249
261
}
250
262
m .stateMu .Lock ()
@@ -255,12 +267,11 @@ func (m *Manager) Load(ctx context.Context, target *process.Info) error {
255
267
}
256
268
257
269
m .currentConfig = m .cp .InitialConfig (ctx )
258
- err := m .loadProbes (target )
270
+ err := m .loadProbes ()
259
271
if err != nil {
260
272
return err
261
273
}
262
274
263
- m .proc = target
264
275
m .state = managerStateLoaded
265
276
266
277
return nil
@@ -330,7 +341,7 @@ func (m *Manager) Stop() error {
330
341
defer m .probeMu .Unlock ()
331
342
332
343
m .logger .Debug ("Shutting down all probes" )
333
- err := m .cleanup (m . proc )
344
+ err := m .cleanup ()
334
345
335
346
// Wait for all probes to stop.
336
347
m .runningProbesWG .Wait ()
@@ -339,30 +350,30 @@ func (m *Manager) Stop() error {
339
350
return err
340
351
}
341
352
342
- func (m * Manager ) loadProbes (target * process. Info ) error {
353
+ func (m * Manager ) loadProbes () error {
343
354
// Remove resource limits for kernels <5.11.
344
355
if err := rlimitRemoveMemlock (); err != nil {
345
356
return err
346
357
}
347
358
348
- exe , err := openExecutable (target .ID .ExePath ())
359
+ exe , err := openExecutable (m . proc .ID .ExePath ())
349
360
if err != nil {
350
361
return err
351
362
}
352
363
m .exe = exe
353
364
354
- if err := m .mount (target ); err != nil {
365
+ if err := m .mount (); err != nil {
355
366
return err
356
367
}
357
368
358
369
// Load probes
359
370
for name , i := range m .probes {
360
371
if isProbeEnabled (name , m .currentConfig ) {
361
372
m .logger .Info ("loading probe" , "name" , name )
362
- err := i .Load (exe , target , m .currentConfig .SamplingConfig )
373
+ err := i .Load (exe , m . proc , m .currentConfig .SamplingConfig )
363
374
if err != nil {
364
375
m .logger .Error ("error while loading probes, cleaning up" , "error" , err , "name" , name )
365
- return errors .Join (err , m .cleanup (target ))
376
+ return errors .Join (err , m .cleanup ())
366
377
}
367
378
}
368
379
}
@@ -371,16 +382,16 @@ func (m *Manager) loadProbes(target *process.Info) error {
371
382
return nil
372
383
}
373
384
374
- func (m * Manager ) mount (target * process. Info ) error {
375
- if target .Allocation != nil {
376
- m .logger .Debug ("Mounting bpffs" , "allocation" , target .Allocation )
385
+ func (m * Manager ) mount () error {
386
+ if m . proc .Allocation != nil {
387
+ m .logger .Debug ("Mounting bpffs" , "allocation" , m . proc .Allocation )
377
388
} else {
378
389
m .logger .Debug ("Mounting bpffs" )
379
390
}
380
- return bpffsMount (target )
391
+ return bpffsMount (m . proc )
381
392
}
382
393
383
- func (m * Manager ) cleanup (target * process. Info ) error {
394
+ func (m * Manager ) cleanup () error {
384
395
ctx := context .Background ()
385
396
err := m .cp .Shutdown (context .Background ())
386
397
for _ , i := range m .probes {
@@ -394,14 +405,5 @@ func (m *Manager) cleanup(target *process.Info) error {
394
405
}
395
406
396
407
m .logger .Debug ("Cleaning bpffs" )
397
- return errors .Join (err , bpffsCleanup (target ))
398
- }
399
-
400
- func (m * Manager ) registerProbes (probes []probe.Probe ) error {
401
- for _ , p := range probes {
402
- if err := m .registerProbe (p ); err != nil {
403
- return err
404
- }
405
- }
406
- return nil
408
+ return errors .Join (err , bpffsCleanup (m .proc ))
407
409
}
0 commit comments