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()
 }