You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@skywalking.apache.org by wu...@apache.org on 2022/08/06 11:45:04 UTC
[skywalking-rover] branch main updated: Fix the uprobe link error in Container mode (#45)
This is an automated email from the ASF dual-hosted git repository.
wusheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-rover.git
The following commit(s) were added to refs/heads/main by this push:
new d956eae Fix the uprobe link error in Container mode (#45)
d956eae is described below
commit d956eaede57b62108b78bca48045bd09ba88e653
Author: mrproliu <74...@qq.com>
AuthorDate: Sat Aug 6 19:45:00 2022 +0800
Fix the uprobe link error in Container mode (#45)
---
pkg/profiling/task/network/linker.go | 44 ++++++++++++++++++++++++------------
pkg/profiling/task/network/runner.go | 2 +-
pkg/profiling/task/network/ssl.go | 10 ++++----
3 files changed, 36 insertions(+), 20 deletions(-)
diff --git a/pkg/profiling/task/network/linker.go b/pkg/profiling/task/network/linker.go
index 46015bb..c2d8396 100644
--- a/pkg/profiling/task/network/linker.go
+++ b/pkg/profiling/task/network/linker.go
@@ -75,6 +75,14 @@ type Linker struct {
closers []io.Closer
errors error
closeOnce sync.Once
+
+ linkedUProbes map[string]bool
+}
+
+func NewLinker() *Linker {
+ return &Linker{
+ linkedUProbes: make(map[string]bool),
+ }
}
type UProbeExeFile struct {
@@ -180,35 +188,43 @@ func (m *Linker) OpenUProbeExeFile(path string) *UProbeExeFile {
}
}
-func (m *UProbeExeFile) AddLink(symbol string, enter, exit *ebpf.Program, pid int) {
- m.AddLinkWithType(symbol, true, enter, pid)
- m.AddLinkWithType(symbol, false, exit, pid)
+func (m *UProbeExeFile) AddLink(symbol string, enter, exit *ebpf.Program) {
+ m.AddLinkWithType(symbol, true, enter)
+ m.AddLinkWithType(symbol, false, exit)
}
-func (m *UProbeExeFile) AddLinkWithType(symbol string, enter bool, p *ebpf.Program, pid int) {
+func (m *UProbeExeFile) AddLinkWithType(symbol string, enter bool, p *ebpf.Program) {
if !m.found {
return
}
- var fun func(symbol string, prog *ebpf.Program, opts *link.UprobeOptions) (link.Link, error)
+ var t string
if enter {
- fun = m.realFile.Uprobe
+ t = "enter"
} else {
- fun = m.realFile.Uretprobe
+ t = "exit"
}
- var t string
+ // check already linked
+ uprobeIdentity := fmt.Sprintf("%s_%s_%t", m.addr, symbol, enter)
+ if m.liker.linkedUProbes[uprobeIdentity] {
+ log.Debugf("the uprobe already attached, so ignored. file: %s, symbol: %s, type: %s", m.addr, symbol, t)
+ return
+ }
+ m.liker.linkedUProbes[uprobeIdentity] = true
+
+ var fun func(symbol string, prog *ebpf.Program, opts *link.UprobeOptions) (link.Link, error)
if enter {
- t = "enter"
+ fun = m.realFile.Uprobe
} else {
- t = "exit"
+ fun = m.realFile.Uretprobe
}
- lk, err := fun(symbol, p, &link.UprobeOptions{PID: pid})
+ lk, err := fun(symbol, p, nil)
if err != nil {
- m.liker.errors = multierror.Append(m.liker.errors, fmt.Errorf("file: %s, symbol: %s, type: %s, pid: %d, error: %v",
- m.addr, symbol, t, pid, err))
+ m.liker.errors = multierror.Append(m.liker.errors, fmt.Errorf("file: %s, symbol: %s, type: %s, error: %v",
+ m.addr, symbol, t, err))
} else {
- log.Debugf("attach to the uprobe, file: %s, symbol: %s, type: %s, pid: %d", m.addr, symbol, t, pid)
+ log.Debugf("attach to the uprobe, file: %s, symbol: %s, type: %s", m.addr, symbol, t)
m.liker.closers = append(m.liker.closers, lk)
}
}
diff --git a/pkg/profiling/task/network/runner.go b/pkg/profiling/task/network/runner.go
index 7b00c19..935aa5a 100644
--- a/pkg/profiling/task/network/runner.go
+++ b/pkg/profiling/task/network/runner.go
@@ -65,7 +65,7 @@ type Runner struct {
func NewGlobalRunnerContext() *Runner {
return &Runner{
bpfContext: NewContext(),
- linker: &Linker{},
+ linker: NewLinker(),
}
}
diff --git a/pkg/profiling/task/network/ssl.go b/pkg/profiling/task/network/ssl.go
index aac49bf..ab69f96 100644
--- a/pkg/profiling/task/network/ssl.go
+++ b/pkg/profiling/task/network/ssl.go
@@ -90,12 +90,12 @@ func processOpenSSLProcess(pid int, bpf *bpfObjects, linker *Linker, modules []*
// attach the linker
libSSLLinker := linker.OpenUProbeExeFile(libsslPath)
- libSSLLinker.AddLink("SSL_write", bpf.OpensslWrite, bpf.OpensslWriteRet, pid)
- libSSLLinker.AddLink("SSL_read", bpf.OpensslRead, bpf.OpensslReadRet, pid)
+ libSSLLinker.AddLink("SSL_write", bpf.OpensslWrite, bpf.OpensslWriteRet)
+ libSSLLinker.AddLink("SSL_read", bpf.OpensslRead, bpf.OpensslReadRet)
return linker.HasError()
}
-func processEnvoyProcess(pid int, bpf *bpfObjects, linker *Linker, modules []*profiling.Module) error {
+func processEnvoyProcess(_ int, bpf *bpfObjects, linker *Linker, modules []*profiling.Module) error {
moduleName := "/envoy"
processModules, err := findProcessModules(modules, moduleName)
if err != nil {
@@ -123,8 +123,8 @@ func processEnvoyProcess(pid int, bpf *bpfObjects, linker *Linker, modules []*pr
// attach the linker
libSSLLinker := linker.OpenUProbeExeFile(envoyModule.Path)
- libSSLLinker.AddLink("SSL_write", bpf.OpensslWrite, bpf.OpensslWriteRet, pid)
- libSSLLinker.AddLink("SSL_read", bpf.OpensslRead, bpf.OpensslReadRet, pid)
+ libSSLLinker.AddLink("SSL_write", bpf.OpensslWrite, bpf.OpensslWriteRet)
+ libSSLLinker.AddLink("SSL_read", bpf.OpensslRead, bpf.OpensslReadRet)
return linker.HasError()
}