Golang探針提供自訂擴充能力,您可以在不修改原有代碼的基礎上注入自訂功能,從而實現通過請求參數、Body來定位問題。本文以Net/HTTP為例介紹如何使用Golang探針的自訂擴充能力擷取要求標頭和回應標頭。
前提條件
確認當前應用的Golang版本在1.18及以上。
- 重要
請確認編譯語句已參考接入文檔修改為
./instgo go build xxx
。
操作步驟
在非當前專案的目錄下建立rules檔案夾,並使用
go mod init rules
命令初始化該檔案夾,然後在rules檔案夾下建立包含以下代碼的rules.go檔案。以下代碼即為需要注入的自訂擴充功能。
package rules import ( "encoding/json" "fmt" "github.com/alibaba/opentelemetry-go-auto-instrumentation/pkg/api" "net/http" ) func httpClientEnterHook(call api.CallContext, t *http.Transport, req *http.Request) { header, _ := json.Marshal(req.Header) fmt.Println("request header is ", string(header)) } func httpClientExitHook(call api.CallContext, res *http.Response, err error) { header, _ := json.Marshal(res.Header) fmt.Println("response header is ", string(header)) }
修改config.json設定檔,添加以下內容將hook代碼注入到
net/http::(*Transport).RoundTrip
。[ { "ImportPath":"net/http", "Function":"RoundTrip", "OnEnter":"httpClientEnterHook", "ReceiverType": "*Transport", "OnExit": "httpClientExitHook", "Path": "/extension/rules" //替換為rules檔案夾的絕對路徑 } ]
編寫測試Demo。
在不同於rules檔案夾的目錄下建立一個demo應用的檔案夾,並使用
go mod init demo
命令初始化,然後在demo檔案夾下建立包含以下代碼的net_http.go檔案。package main import ( "context" "net/http" ) func main() { req, err := http.NewRequestWithContext(context.Background(), "GET", "http://www.baidu.com", nil) if err != nil { panic(err) } req.Header.Set("otelbuild", "true") client := &http.Client{} resp, err := client.Do(req) defer resp.Body.Close() }
切換到demo目錄,使用instgo工具編譯並執行程式。
$ ./instgo set --rule=../config.json $ INSTGO_CACHE_DIR=./ ./instgo go build net_http.go 如果是需要在Linux系統運行 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 INSTGO_CACHE_DIR=./ ./instgo go build net_http.go $ 運行./net_http
如果輸出以下內容, 表示注入成功,外掛程式已生效。
完整的範例程式碼請參見nethttp。
說明除了上述介紹的通過擴充方式列印請求和返回的Header外,自訂擴充能力還可以用於SQL注入檢測、日誌列印、出參和入參列印等。