deepflow
deepflow copied to clipboard
[QA] 通过wasm采集数据的一些问题
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{})
}
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
- [X] I agree to follow this project's Code of Conduct