GO 進(jìn)行編譯時(shí)插樁,實(shí)現(xiàn)零碼注入

Go 編譯時(shí)插樁

Go 語(yǔ)言的編譯時(shí)插樁是一種在編譯階段自動(dòng)注入監(jiān)控代碼的技術(shù),目的是在不修改業(yè)務(wù)代碼的情況下,實(shí)現(xiàn)對(duì)應(yīng)用程序的監(jiān)控和追蹤。

基本原理

Go 編譯時(shí)插樁的核心思想是通過(guò)在編譯過(guò)程中對(duì)源代碼進(jìn)行分析和修改,將監(jiān)控代碼注入到目標(biāo)函數(shù)中。具體步驟如下:

- 在編譯流程中,通過(guò)抽象語(yǔ)法樹(shù)(AST)分析源代碼。

- 根據(jù)預(yù)定義的規(guī)則(如配置文件或插樁框架),找到需要監(jiān)控的函數(shù)或方法。

- 在這些函數(shù)的入口和出口插入自定義的監(jiān)控代碼。

- 完成修改后的代碼繼續(xù)經(jīng)過(guò)正常的編譯流程,生成最終的可執(zhí)行文件。

優(yōu)勢(shì)

- 零侵入性:無(wú)需修改業(yè)務(wù)代碼,減少了對(duì)現(xiàn)有代碼的干擾。

- 性能優(yōu)化:由于插樁代碼經(jīng)過(guò)完整的編譯流程,不會(huì)產(chǎn)生不可預(yù)料的錯(cuò)誤,并且可以利用編譯器的優(yōu)化。

- 全面監(jiān)控:可以實(shí)現(xiàn)與 Java 監(jiān)控類似的全面監(jiān)控能力,包括鏈路追蹤、指標(biāo)統(tǒng)計(jì)、日志關(guān)聯(lián)等。

實(shí)踐

當(dāng)前主要是基于 Datadog 提供的工具 Orchestrion,用于在編譯時(shí)對(duì) Go 代碼進(jìn)行自動(dòng)插樁。它通過(guò)與 Go 工具鏈交互,在源代碼發(fā)送到編譯器之前對(duì)其進(jìn)行檢查和修改。

要求:

- Go 版本 ≥ 1.18+

- Go Module 管理項(xiàng)目

創(chuàng)建 DEMO

1、創(chuàng)建目錄

mkdir go-runtime-demo

cd go-runtime-demo

2、編寫(xiě) main.go

package main

import "net/http"

func main() {

? ? http.HandleFunc("/", helloFunc)

? ? http.ListenAndServe("localhost:18080", nil)

}

func helloFunc(w http.ResponseWriter, r *http.Request) {

? ? w.Write([]byte("ok"))

}

3、初始化目錄

go mod init http_service

go mod tidy

安裝 Orchestrion

1、下載依賴

go install github.com/DataDog/orchestrion@latest

2、創(chuàng)建連接點(diǎn)

即在上面的 go-runtime-demo 目錄下執(zhí)行以下命令:

orchestrion pin

執(zhí)行成功后在當(dāng)前目錄下生成orchestrion.tool.go 文件。

3、更新依賴

go mod tidy

編譯運(yùn)行

1、設(shè)置環(huán)境變量,由于 Datadog 默認(rèn)端口為 8125,需要調(diào)整端口推送到觀測(cè)云

export DD_SERVICE=go-runtime-demo

export DD_TRACE_AGENT_PORT=9529

2、使用 Orchestrion 編譯&運(yùn)行項(xiàng)目

在項(xiàng)目的根目錄下,使用以下命令進(jìn)行編譯:

orchestrion go build .

orchestrion go run .

3、查看日志

輸出以下日志則表示加載成功。

root@liurui:/home/liurui/code/go/go-runtime-demo# export DD_SERVICE=go-runtime-demo

root@liurui:/home/liurui/code/go/go-runtime-demo# export DD_TRACE_AGENT_PORT=9529

root@liurui:/home/liurui/code/go/go-runtime-demo# orchestrion go build .

root@liurui:/home/liurui/code/go/go-runtime-demo# orchestrion go run .

2025/02/17 14:02:42 Datadog Tracer v1.71.0 INFO: DATADOG TRACER CONFIGURATION {"date":"2025-02-17T14:02:42+08:00","os_name":"Linux Mint","os_version":"21.1 (Vera)","version":"v1.71.0","lang":"Go","lang_version":"go1.23.6","env":"","service":"http_service","agent_url":"http://localhost:9529/v0.4/traces","agent_error":"","debug":false,"analytics_enabled":false,"sample_rate":"NaN","sample_rate_limit":"disabled","trace_sampling_rules":null,"span_sampling_rules":null,"sampling_rules_error":"","service_mappings":null,"tags":{"runtime-id":"404bbb85-f951-4cdf-a5f5-436a275614f2"},"runtime_metrics_enabled":false,"runtime_metrics_v2_enabled":false,"profiler_code_hotspots_enabled":true,"profiler_endpoints_enabled":true,"dd_version":"","architecture":"amd64","global_service":"","lambda_mode":"false","appsec":false,"agent_features":....

觀測(cè)云

登錄[觀測(cè)云控制臺(tái)](https://console.guance.com/),點(diǎn)擊「應(yīng)用性能監(jiān)控」 -「鏈路」,查看鏈路信息。


通過(guò)編譯時(shí)插樁技術(shù),Go 開(kāi)發(fā)者可以在不修改業(yè)務(wù)代碼的情況下,快速實(shí)現(xiàn)對(duì)應(yīng)用程序的全面監(jiān)控和優(yōu)化,顯著提升開(kāi)發(fā)效率和運(yùn)維能力。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容