This is an automated email from the ASF dual-hosted git repository.

liuhan 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 2462d62  Make the Profiling module compatible with more linux systems 
(#66)
2462d62 is described below

commit 2462d62638b9a0418539eea32b264e1986860c94
Author: mrproliu <[email protected]>
AuthorDate: Wed Dec 7 10:32:13 2022 +0800

    Make the Profiling module compatible with more linux systems (#66)
---
 .github/workflows/rover.yaml                           |  4 ++--
 CHANGES.md                                             |  1 +
 bpf/profiling/network/netmonitor.c                     | 11 +++++++++++
 bpf/profiling/network/socket.h                         | 16 +++++++++++++++-
 pkg/profiling/task/network/analyze/layer4/events.go    |  3 +++
 pkg/profiling/task/network/bpf/linker.go               | 14 +++++++++-----
 pkg/profiling/task/network/runner.go                   | 14 +++++++-------
 pkg/profiling/task/offcpu/runner.go                    | 15 ++++++++++++++-
 pkg/tools/profiling/api.go                             | 18 ++++++++++++++++++
 test/e2e/base/env                                      |  4 ++--
 .../profiling/network/http1-sampled-traces-cases.yaml  |  6 +++---
 11 files changed, 85 insertions(+), 21 deletions(-)

diff --git a/.github/workflows/rover.yaml b/.github/workflows/rover.yaml
index ce0fdbe..dbb60e0 100644
--- a/.github/workflows/rover.yaml
+++ b/.github/workflows/rover.yaml
@@ -69,7 +69,7 @@ jobs:
   e2e-test:
     name: E2E test
     needs: [ docker ]
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     timeout-minutes: 60
     strategy:
       fail-fast: false
@@ -142,7 +142,7 @@ jobs:
   https-e2e-test:
     name: HTTPS E2E test
     needs: [ docker ]
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     timeout-minutes: 60
     strategy:
       fail-fast: false
diff --git a/CHANGES.md b/CHANGES.md
index 073d815..5dfde35 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -8,6 +8,7 @@ Release Notes.
 * Enhancing the render context for the Kubernetes process.
 * Simplify the logic of network protocol analysis.
 * Upgrade Go library to `1.18`, eBPF library to `0.9.3`.
+* Make the Profiling module compatible with more Linux systems.
 
 #### Bug Fixes
 
diff --git a/bpf/profiling/network/netmonitor.c 
b/bpf/profiling/network/netmonitor.c
index 1a6f922..0a36d18 100644
--- a/bpf/profiling/network/netmonitor.c
+++ b/bpf/profiling/network/netmonitor.c
@@ -1255,6 +1255,17 @@ int tcp_drop(struct pt_regs *ctx) {
     return 0;
 }
 
+SEC("kprobe/kfree_skb_reason")
+int kfree_skb_reason(struct pt_regs *ctx) {
+    struct sock *s = (void *)PT_REGS_PARM1(ctx);
+    enum skb_drop_reason reason = PT_REGS_PARM2(ctx);
+
+    if (reason > SKB_DROP_REASON_NOT_SPECIFIED) {
+        send_socket_exception_operation_event(ctx, 
SOCKET_EXCEPTION_OPERATION_TYPE_DROP, s);
+    }
+    return 0;
+}
+
 #include "openssl.c"
 #include "go_tls.c"
 #include "node_tls.c"
\ No newline at end of file
diff --git a/bpf/profiling/network/socket.h b/bpf/profiling/network/socket.h
index bb813ca..7af5ea8 100644
--- a/bpf/profiling/network/socket.h
+++ b/bpf/profiling/network/socket.h
@@ -75,4 +75,18 @@ struct user_msghdr {
 struct mmsghdr {
        struct user_msghdr msg_hdr;
        unsigned int msg_len;
-} __attribute__((preserve_access_index));
\ No newline at end of file
+} __attribute__((preserve_access_index));
+
+struct sk_buff {
+       struct sock             *sk;
+} __attribute__((preserve_access_index));
+
+enum skb_drop_reason {
+       SKB_DROP_REASON_NOT_SPECIFIED,
+       SKB_DROP_REASON_NO_SOCKET,
+       SKB_DROP_REASON_PKT_TOO_SMALL,
+       SKB_DROP_REASON_TCP_CSUM,
+       SKB_DROP_REASON_TCP_FILTER,
+       SKB_DROP_REASON_UDP_CSUM,
+       SKB_DROP_REASON_MAX,
+};
\ No newline at end of file
diff --git a/pkg/profiling/task/network/analyze/layer4/events.go 
b/pkg/profiling/task/network/analyze/layer4/events.go
index 641c2fb..ee3083d 100644
--- a/pkg/profiling/task/network/analyze/layer4/events.go
+++ b/pkg/profiling/task/network/analyze/layer4/events.go
@@ -35,6 +35,9 @@ type SocketExceptionOperationEvent struct {
        RemoteAddrV4   uint32
        RemoteAddrV6   [16]uint8
        RemoteAddrPort uint32
+       LocalAddrV4    uint32
+       LocalAddrV6    [16]uint8
+       LocalAddrPort  uint32
        Type           base.SocketExceptionOperationType
 }
 
diff --git a/pkg/profiling/task/network/bpf/linker.go 
b/pkg/profiling/task/network/bpf/linker.go
index b1969a9..774068d 100644
--- a/pkg/profiling/task/network/bpf/linker.go
+++ b/pkg/profiling/task/network/bpf/linker.go
@@ -98,19 +98,23 @@ type UProbeExeFile struct {
        realFile *link.Executable
 }
 
-func (m *Linker) AddLink(linkF LinkFunc, p *ebpf.Program, trySymbolNames 
...string) {
+func (m *Linker) AddLink(linkF LinkFunc, symbolWithPrograms 
map[string]*ebpf.Program) {
        var lk link.Link
        var err error
        var realSym string
-       for _, n := range trySymbolNames {
-               lk, err = linkF(n, p, nil)
+       for symbol, p := range symbolWithPrograms {
+               lk, err = linkF(symbol, p, nil)
                if err == nil {
-                       realSym = n
+                       realSym = symbol
                        break
                }
        }
        if err != nil {
-               m.errors = multierror.Append(m.errors, fmt.Errorf("open %s 
error: %v", trySymbolNames, err))
+               symbolNames := make([]string, 0)
+               for s := range symbolWithPrograms {
+                       symbolNames = append(symbolNames, s)
+               }
+               m.errors = multierror.Append(m.errors, fmt.Errorf("open %s 
error: %v", symbolNames, err))
        } else {
                log.Debugf("attach to the kprobe: %s", realSym)
                m.closers = append(m.closers, lk)
diff --git a/pkg/profiling/task/network/runner.go 
b/pkg/profiling/task/network/runner.go
index bdaf369..20c3112 100644
--- a/pkg/profiling/task/network/runner.go
+++ b/pkg/profiling/task/network/runner.go
@@ -143,8 +143,8 @@ func (r *Runner) Start(ctx context.Context, task 
*base.ProfilingTask, processes
        bpfLoader.AddSysCall("connect", bpfLoader.SysConnect, 
bpfLoader.SysConnectRet)
        bpfLoader.AddSysCall("accept", bpfLoader.SysAccept, 
bpfLoader.SysAcceptRet)
        bpfLoader.AddSysCall("accept4", bpfLoader.SysAccept, 
bpfLoader.SysAcceptRet)
-       bpfLoader.AddLink(link.Kretprobe, bpfLoader.SockAllocRet, "sock_alloc")
-       bpfLoader.AddLink(link.Kprobe, bpfLoader.TcpConnect, "tcp_connect")
+       bpfLoader.AddLink(link.Kretprobe, 
map[string]*ebpf.Program{"sock_alloc": bpfLoader.SockAllocRet})
+       bpfLoader.AddLink(link.Kprobe, map[string]*ebpf.Program{"tcp_connect": 
bpfLoader.TcpConnect})
 
        // write/receive data
        bpfLoader.AddSysCall("send", bpfLoader.SysSend, bpfLoader.SysSendRet)
@@ -161,13 +161,13 @@ func (r *Runner) Start(ctx context.Context, task 
*base.ProfilingTask, processes
        bpfLoader.AddSysCall("recvfrom", bpfLoader.SysRecvfrom, 
bpfLoader.SysRecvfromRet)
        bpfLoader.AddSysCall("recvmsg", bpfLoader.SysRecvmsg, 
bpfLoader.SysRecvmsgRet)
        bpfLoader.AddSysCall("recvmmsg", bpfLoader.SysRecvmmsg, 
bpfLoader.SysRecvmmsgRet)
-       bpfLoader.AddLink(link.Kprobe, bpfLoader.TcpRcvEstablished, 
"tcp_rcv_established")
-       bpfLoader.AddLink(link.Kprobe, bpfLoader.SecuritySocketSendmsg, 
"security_socket_sendmsg")
-       bpfLoader.AddLink(link.Kprobe, bpfLoader.SecuritySocketRecvmsg, 
"security_socket_recvmsg")
+       bpfLoader.AddLink(link.Kprobe, 
map[string]*ebpf.Program{"tcp_rcv_established": bpfLoader.TcpRcvEstablished})
+       bpfLoader.AddLink(link.Kprobe, 
map[string]*ebpf.Program{"security_socket_sendmsg": 
bpfLoader.SecuritySocketSendmsg})
+       bpfLoader.AddLink(link.Kprobe, 
map[string]*ebpf.Program{"security_socket_recvmsg": 
bpfLoader.SecuritySocketRecvmsg})
 
        // retransmit/drop
-       bpfLoader.AddLink(link.Kprobe, bpfLoader.TcpRetransmit, 
"tcp_retransmit_skb")
-       bpfLoader.AddLink(link.Kprobe, bpfLoader.TcpDrop, "tcp_drop")
+       bpfLoader.AddLink(link.Kprobe, 
map[string]*ebpf.Program{"tcp_retransmit_skb": bpfLoader.TcpRetransmit})
+       bpfLoader.AddLink(link.Kprobe, map[string]*ebpf.Program{"tcp_drop": 
bpfLoader.TcpDrop, "kfree_skb_reason": bpfLoader.KfreeSkbReason})
 
        if err := bpfLoader.HasError(); err != nil {
                _ = bpfLoader.Close()
diff --git a/pkg/profiling/task/offcpu/runner.go 
b/pkg/profiling/task/offcpu/runner.go
index 85a8f9b..149747e 100644
--- a/pkg/profiling/task/offcpu/runner.go
+++ b/pkg/profiling/task/offcpu/runner.go
@@ -44,6 +44,7 @@ import (
 //go:generate go run github.com/cilium/ebpf/cmd/bpf2go -no-global-types 
-target bpfel -cc $BPF_CLANG -cflags $BPF_CFLAGS bpf 
$REPO_ROOT/bpf/profiling/offcpu.c -- -I$REPO_ROOT/bpf/include 
-D__TARGET_ARCH_x86
 
 var log = logger.GetLogger("profiling", "task", "offcpu")
+var defaultKernelSymbol = "finish_task_switch"
 
 type ProcessStack struct {
        UserStackID   uint32
@@ -116,7 +117,7 @@ func (r *Runner) Run(ctx context.Context, notify 
base.ProfilingRunningSuccessNot
        }
        r.bpf = &objs
 
-       kprobe, err := link.Kprobe("finish_task_switch", 
objs.DoFinishTaskSwitch, nil)
+       kprobe, err := link.Kprobe(r.findMatchesSymbol(), 
objs.DoFinishTaskSwitch, nil)
        if err != nil {
                return fmt.Errorf("link to finish task swtich failure: %v", err)
        }
@@ -127,6 +128,18 @@ func (r *Runner) Run(ctx context.Context, notify 
base.ProfilingRunningSuccessNot
        return nil
 }
 
+func (r *Runner) findMatchesSymbol() string {
+       if r.kernelProfiling == nil {
+               return defaultKernelSymbol
+       }
+       res, err := 
r.kernelProfiling.FindSymbolByRegex(`finish_task_switch(\.\w+\.\d+)?`)
+       if err != nil {
+               log.Warnf("found symbol error: %v", err)
+               return defaultKernelSymbol
+       }
+       return res
+}
+
 func (r *Runner) Stop() error {
        var err error
        r.base.ShutdownOnce.Do(func() {
diff --git a/pkg/tools/profiling/api.go b/pkg/tools/profiling/api.go
index 0c25e2b..cf57adb 100644
--- a/pkg/tools/profiling/api.go
+++ b/pkg/tools/profiling/api.go
@@ -18,6 +18,9 @@
 package profiling
 
 import (
+       "fmt"
+       "regexp"
+
        "github.com/apache/skywalking-rover/pkg/logger"
 
        "github.com/ianlancetaylor/demangle"
@@ -138,6 +141,21 @@ func (i *Info) FindSymbolAddress(name string) uint64 {
        return 0
 }
 
+func (i *Info) FindSymbolByRegex(rep string) (string, error) {
+       compile, err := regexp.Compile(rep)
+       if err != nil {
+               return "", err
+       }
+       for _, m := range i.Modules {
+               for _, sym := range m.Symbols {
+                       if compile.MatchString(sym.Name) {
+                               return sym.Name, nil
+                       }
+               }
+       }
+       return "", fmt.Errorf("cannot found any matches symbol: %s", rep)
+}
+
 func (m *Module) contains(addr uint64) (uint64, bool) {
        for _, r := range m.Ranges {
                if addr >= r.StartAddr && addr < r.EndAddr {
diff --git a/test/e2e/base/env b/test/e2e/base/env
index 6283ee3..434bc95 100644
--- a/test/e2e/base/env
+++ b/test/e2e/base/env
@@ -14,7 +14,7 @@
 # limitations under the License.
 
 SW_CTL_COMMIT=0883266bfaa36612927b69e35781b64ea181758d
-SW_OAP_COMMIT=bcd9f7a56b99ca612711ed3a540bdae5f46e9171
+SW_OAP_COMMIT=108260681ea9657217488685779a20cb84c2f288
 SW_KUBERNETES_COMMIT_SHA=0f3ec68e5a7e1608cec8688716b848ed15e971e5
 
-SW_AGENT_GO_COMMIT=216f122d942cb683f48578d3014cc5ea83637582
\ No newline at end of file
+SW_AGENT_GO_COMMIT=216f122d942cb683f48578d3014cc5ea83637582
diff --git a/test/e2e/cases/profiling/network/http1-sampled-traces-cases.yaml 
b/test/e2e/cases/profiling/network/http1-sampled-traces-cases.yaml
index 5a90cb9..d441ebd 100644
--- a/test/e2e/cases/profiling/network/http1-sampled-traces-cases.yaml
+++ b/test/e2e/cases/profiling/network/http1-sampled-traces-cases.yaml
@@ -17,7 +17,7 @@
 cases:
   # slow traces
   - query: |
-      curl -s https://${service_host}:${service_10443}/consumer-zipkin > 
/dev/null;
+      curl -s -k https://${service_host}:${service_10443}/consumer-zipkin > 
/dev/null;
       sleep 5;
       swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql 
records list \
         --name=sampled_slow_trace_record --service-name service 
--instance-name test --process-name service \
@@ -41,14 +41,14 @@ cases:
     expected: expected/skywalking-trace.yml
   # not founds
   - query: |
-      curl -s https://${service_host}:${service_10443}/consumer?type=notfound 
> /dev/null;
+      curl -s -k 
https://${service_host}:${service_10443}/consumer?type=notfound > /dev/null;
       sleep 5;
       swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql 
records list \
         --name=sampled_status_4xx_trace_record --service-name service 
--instance-name test --process-name service \
         --dest-service-name service --dest-instance-name test 
--dest-process-name UNKNOWN_REMOTE 20
     expected: expected/status-4xx-traces.yml
   - query: |
-      curl -s https://${service_host}:${service_10443}/consumer?type=error > 
/dev/null;
+      curl -s -k https://${service_host}:${service_10443}/consumer?type=error 
> /dev/null;
       sleep 5;
       swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql 
records list \
         --name=sampled_status_5xx_trace_record --service-name service 
--instance-name test --process-name service \

Reply via email to