deepflow icon indicating copy to clipboard operation
deepflow copied to clipboard

[QA] 通过wasm采集数据的一些问题

Open gbling opened this issue 1 year ago • 0 comments

Search before asking

  • [X] I had searched in the issues and found no similar feature requirement.

DeepFlow Component

Agent

What you expected to happen

背景

目前公司内基础架构是通过请求query中的traceId字段串联整个链路,早先有提过一个issue咨询这种方式如何串联链路,有个小伙伴提示可以通过x-request-id串联整个链路,这样的改造会涉及到所有系统,变更较多,综合评估使用wasm插件的方式将tracerId从query取到,写到header中,参考例子一、以及例子二测试但似乎没什么效果

package main

import (
	"bufio"
	"bytes"
	"github.com/deepflowio/deepflow-wasm-go-sdk/sdk"
	_ "github.com/wasilibs/nottinygc"
	"net/http"
)

type httpHook struct {
	sdk.DefaultParser
}

func (p httpHook) HookIn() []sdk.HookBitmap {
	return []sdk.HookBitmap{
		sdk.HOOK_POINT_PAYLOAD_PARSE,
	}
}

func (p httpHook) OnHttpReq(ctx *sdk.HttpReqCtx) sdk.Action {
	return sdk.ActionNext()
}

func (p httpHook) OnHttpResp(ctx *sdk.HttpRespCtx) sdk.Action {
	return sdk.ActionNext()
}

func (p httpHook) OnCheckPayload(baseCtx *sdk.ParseCtx) (uint8, string) {
	return 1, ""
}

func (p httpHook) OnParsePayload(baseCtx *sdk.ParseCtx) sdk.Action {
	payload, err := baseCtx.GetPayload()
	if err != nil {
		return sdk.ActionAbortWithErr(err)
	}

	// 打印 payload 的长度和内容,用于调试
	sdk.Warn("Payload length:", len(payload))
	sdk.Warn("Payload content:", string(payload))

	// 创建一个读取器来解析 HTTP 请求
	reader := bufio.NewReader(bytes.NewReader(payload))
	req, err := http.ReadRequest(reader)
	if err != nil {
		return sdk.ActionAbortWithErr(err)
	}

	tracerID := req.URL.Query().Get("distinctRequestId")
	sdk.Info("distinctRequestId:", tracerID)

	// 如果查询参数中有 `distinctRequestId`,则设置到 `Header` 中
	if tracerID != "" {
		req.Header.Set("XX-TRACE-ID", tracerID)
	}

	return sdk.ActionNext()
}

func main() {
	sdk.Warn("wasm register http hook")
	sdk.SetParser(httpHook{})
}

package main

import (
	"bufio"
	"bytes"
	"github.com/deepflowio/deepflow-wasm-go-sdk/sdk"
	_ "github.com/wasilibs/nottinygc"
	"net/http"
)

type httpHook struct {
	sdk.DefaultParser
}

func (p httpHook) HookIn() []sdk.HookBitmap {
	return []sdk.HookBitmap{
		sdk.HOOK_POINT_HTTP_REQ,
		sdk.HOOK_POINT_HTTP_RESP,
	}
}

/*
假设HTTP请求如下:

	GET /user_info?username=test&type=1 HTTP/1.1
	Custom-Trace-Info: trace_id: xxx, span_id: sss
*/
func (p httpHook) OnHttpReq(ctx *sdk.HttpReqCtx) sdk.Action {
	baseCtx := &ctx.BaseCtx

	// 获取请求Payload
	payload, err := baseCtx.GetPayload()
	if err != nil {
		sdk.Error("Failed to get payload: ", err)
		return sdk.ActionAbortWithErr(err)
	}

	// 解析HTTP请求
	req, err := http.ReadRequest(bufio.NewReader(bytes.NewReader(payload)))
	if err != nil {
		sdk.Error("Failed to parse HTTP request: ", err)
		return sdk.ActionAbortWithErr(err)
	}

	sdk.Info("haha", req.URL.Query().Get("distinctRequestId"))

	// 获取查询参数
	query := req.URL.Query()
	tracerId := query.Get("distinctRequestId")

	// 如果 distinctRequestId 为空,设置默认值
	if tracerId == "" {
		tracerId = "default-trace-id"
		sdk.Warn("distinctRequestId not found, using default value")
	} else {
		sdk.Info("distinctRequestId: ", tracerId)
	}

	// 设置自定义的请求头
	req.Header.Set("XX-TRACE-ID", string(tracerId))

	// 继续处理请求
	return sdk.ActionNext()
}

func (p httpHook) OnHttpResp(ctx *sdk.HttpRespCtx) sdk.Action {
	return sdk.ActionNext()
}

func (p httpHook) OnParsePayload(ctx *sdk.ParseCtx) sdk.Action {
	return sdk.ActionNext()
}

func main() {
	sdk.Warn("wasm register http hook")
	sdk.SetParser(httpHook{})
}

image

How to reproduce

No response

DeepFlow version

# kubectl exec -it -n deepflow deploy/deepflow-server -- deepflow-server -v
Name: deepflow-server community edition
Branch: v6.6.4
CommitID: 6d70ea94436eb89fb3f0f1d3b45fbca15375f45c
RevCount: 11095
Compiler: go version go1.21.13 linux/amd64
CompileTime: 2024-09-12 06:53:08
# kubectl exec -it -n deepflow ds/deepflow-agent -- deepflow-agent -v
Defaulted container "deepflow-agent" out of: deepflow-agent, configure-sysctl (init)
11095-6d70ea94436eb89fb3f0f1d3b45fbca15375f45c
Name: deepflow-agent community edition
Branch: v6.6.4
CommitId: 6d70ea94436eb89fb3f0f1d3b45fbca15375f45c
RevCount: 11095
Compiler: rustc 1.77.1 (7cf61ebde 2024-03-27)
CompileTime: 2024-09-12 06:54:16

DeepFlow agent list

ID   NAME                                    TYPE     CTRL_IP          CTRL_MAC            STATE    GROUP     EXCEPTIONS   REVISION       UPGRADE_REVISION   
1    cn-zhangjiakou.10.173.252.128-V2        K8S_VM   10.173.252.128   00:16:3e:0f:3c:61   NORMAL   default                v6.6.4 11095                      
2    cn-zhangjiakou.10.173.244.238-V30       K8S_VM   10.173.244.238   00:16:3e:03:db:62   NORMAL   default                v6.6.4 11095                      
3    cn-zhangjiakou.10.173.252.131-V12       K8S_VM   10.173.252.131   00:16:3e:1f:36:21   NORMAL   default                v6.6.4 11095                      
4    cn-zhangjiakou.10.173.253.171-V11       K8S_VM   10.173.253.171   00:16:3e:09:f0:09   NORMAL   default                v6.6.4 11095                      
5    cn-zhangjiakou.10.173.253.173-V10       K8S_VM   10.173.253.173   00:16:3e:05:72:38   NORMAL   default                v6.6.4 11095                      
6    cn-zhangjiakou.10.173.253.205-V4        K8S_VM   10.173.253.205   00:16:3e:13:ff:5a   NORMAL   default                v6.6.4 11095                      
7    cn-zhangjiakou.10.173.254.3-V32         K8S_VM   10.173.254.3     00:16:3e:23:ff:62   NORMAL   default                v6.6.4 11095                      
8    taqu-test9-10.173.254.4-V34             K8S_VM   10.173.254.4     00:16:3e:24:f6:85   NORMAL   default                v6.6.4 11095                      
9    cn-zhangjiakou.10.173.231.5-V5          K8S_VM   10.173.231.5     00:16:3e:21:b0:0b   NORMAL   default                v6.6.4 11095                      
10   cn-zhangjiakou.10.173.253.172-V31       K8S_VM   10.173.253.172   00:16:3e:14:a9:93   NORMAL   default                v6.6.4 11095                      
11   cn-zhangjiakou.10.173.244.239-V6        K8S_VM   10.173.244.239   00:16:3e:12:28:4d   NORMAL   default                v6.6.4 11095                      
12   cn-zhangjiakou.10.173.253.255-V21       K8S_VM   10.173.253.255   00:16:3e:1e:e8:d6   NORMAL   default                v6.6.4 11095                      
13   cn-zhangjiakou.10.173.254.2-V33         K8S_VM   10.173.254.2     00:16:3e:1a:95:92   NORMAL   default                v6.6.4 11095                      
14   taqu-test9-10.173.253.251-V1            K8S_VM   10.173.253.251   00:16:3e:26:6d:41   NORMAL   default                v6.6.4 11095                      
15   cn-zhangjiakou.10.173.232.194-V13       K8S_VM   10.173.232.194   00:16:3e:04:5c:a8   NORMAL   default                v6.6.4 11095                      
16   cn-zhangjiakou.10.173.251.12-V27        K8S_VM   10.173.251.12    00:16:3e:1e:82:26   NORMAL   default                v6.6.4 11095                      
17   cn-zhangjiakou.10.173.251.13-V9         K8S_VM   10.173.251.13    00:16:3e:10:b0:93   NORMAL   default                v6.6.4 11095                      
18   cn-zhangjiakou.10.173.250.231-V7        K8S_VM   10.173.250.231   00:16:3e:0b:8a:8b   NORMAL   default                v6.6.4 11095                      
19   cn-zhangjiakou.10.173.254.1-V19         K8S_VM   10.173.254.1     00:16:3e:07:7f:76   NORMAL   default                v6.6.4 11095                      
20   cn-zhangjiakou.10.173.254.0-V17         K8S_VM   10.173.254.0     00:16:3e:0b:e8:75   NORMAL   default                v6.6.4 11095                      
21   cn-zhangjiakou.10.173.244.240-V14       K8S_VM   10.173.244.240   00:16:3e:08:e6:9b   NORMAL   default                v6.6.4 11095                      
22   cn-zhangjiakou.10.173.224.89-V3         K8S_VM   10.173.224.89    00:16:3e:00:53:a5   NORMAL   default                v6.6.4 11095                      
23   cn-zhangjiakou.10.173.246.202-V16       K8S_VM   10.173.246.202   00:16:3e:15:35:c3   NORMAL   default                v6.6.4 11095                      
24   taqu-test10-10.173.253.254-V22          K8S_VM   10.173.253.254   00:16:3e:05:73:08   NORMAL   default                v6.6.4 11095                      
25   cn-zhangjiakou.10.173.251.166-V28       K8S_VM   10.173.251.166   00:16:3e:0f:5a:c1   NORMAL   default                v6.6.4 11095                      
26   taqu-test-eff-gray-10.173.254.6-V20     K8S_VM   10.173.254.6     00:16:3e:21:be:8c   NORMAL   default                v6.6.4 11095                      
27   taqu-test-eff-online-10.173.254.7-V26   K8S_VM   10.173.254.7     00:16:3e:09:9a:ab   NORMAL   default                v6.6.4 11095                      
28   cn-zhangjiakou.10.173.244.229-V23       K8S_VM   10.173.244.229   00:16:3e:0f:fc:f1   NORMAL   default                v6.6.4 11095                      
29   cn-zhangjiakou.10.173.238.97-V18        K8S_VM   10.173.238.97    00:16:3e:19:89:19   NORMAL   default                v6.6.4 11095                      
30   cn-zhangjiakou.10.173.253.204-V25       K8S_VM   10.173.253.204   00:16:3e:21:e4:e3   NORMAL   default                v6.6.4 11095                      
31   cn-zhangjiakou.10.173.224.88-V8         K8S_VM   10.173.224.88    00:16:3e:03:36:bd   NORMAL   default                v6.6.4 11095                      
32   cn-zhangjiakou.10.174.145.50-V24        K8S_VM   10.174.145.50    00:16:3e:04:90:45   NORMAL   default                v6.6.4 11095                      
33   cn-zhangjiakou.10.173.253.170-V29       K8S_VM   10.173.253.170   00:16:3e:13:72:12   NORMAL   default                v6.6.4 11095                      
34   cn-zhangjiakou.10.173.231.4-V15         K8S_VM   10.173.231.4     00:16:3e:00:fa:98   NORMAL   default                v6.6.4 11095                      

Kubernetes CNI

Kubernetes : 1.22.10
Docker: 19.03.15, build 99e3ed8919
CNI: terway-eniip v1.6.1

Operation-System/Kernel version

# awk -F '=' '/PRETTY_NAME/ { print $2 }' /etc/os-release
"Alibaba Cloud Linux (Aliyun Linux) 2.1903 LTS (Hunting Beagle)"
# uname -r
4.19.91-26.al7.x86_64

Anything else

No response

Are you willing to submit a PR?

  • [X] Yes I am willing to submit a PR!

Code of Conduct

gbling avatar Oct 23 '24 15:10 gbling