編寫自定義 Ylang 分析器動態追蹤 Go 程式(使用 OpenResty XRay)
在本教程中,我們將演示如何編寫一個簡單的 Ylang 分析器,在 OpenResty XRay 中動態追蹤任意的 Go 程式。這個自定義分析器會在指定的 Go 函式入口新增一個動態探針,然後列印輸出一個 Go 變數的值。得益於我們的動態追蹤技術,這些分析器能以真正的非侵入的方式工作。這樣我們可以將效能開銷降至最低,同時也不用對目標 Go 程式和程序進行任何修改。
向 Go 變數插入兩個鍵值對
我們有一個 Go 語言編寫的 animal
程式。
使用 Vim 編輯器來檢視這個程式的原始碼。
可以看到這個程式中,Animal
是一個結構體。
該 Animal
結構體有兩個成員。food
的欄位型別是 string
,而 age
的欄位型別是 float32
。
showAnimals
函式顯示了 map
變數中的值。
它有一個型別為 map[string]Animal
的引數 animals
。
map[string]Animal
是一個 map
聚合型別。它的鍵型別為 string
,值型別為 Animal
。
在 main
函式中,向 animals
這個 map
變數插入兩個鍵值對。
我們用的是 Linux 發行版自帶的未經修改過的 Go 編譯器。
編譯這個程式。可以看到,不需要新增任何特殊選項。
這是該程式的輸出。
這個程式的執行速度非常快,只需 1 毫秒。
讓我們編寫一個自定義的 Ylang 分析器,來動態追蹤這個 Go 程式的執行。
編寫自定義 Ylang 分析器,動態追蹤 Go 程式
切換到 OpenResty XRay 的 Web 控制檯。
跳轉到 “Analyzers” 頁面。
點選 “Add new analyzer”。
在 “Analyzer name” 文字框中輸入分析器的名稱。
選擇 “YLang” 語言型別。
刪除預設提供的 Ylang 程式示例。
這裡我們在 main
包中的 Go 函式 showAnimals
的入口處,新增一個動態探針。
這個引數型別是一個鍵為 string
,值型別為 main.Animal
的 map
。
這個引數的名字是 animals
。
呼叫 _dump_go_val
來列印 animals
變數的值。
呼叫 _exit()
使分析器在執行完這個探針處理程式後退出。
儲存程式碼。
這是一個短生命週期的程式,因此我們選擇 “By Executables” 模式。
回到之前的終端視窗。執行 readlink -f
命令查詢可行檔案的路徑。複製它。
貼上可執行檔案的路徑。
點選 “Run” 開始執行。
分析器已經開始追蹤。
測試追蹤結果
切回我們的終端。
執行 Go 程式。程式仍能正常執行。
這個程式的用時和之前一樣,仍然只需 1 毫秒。
回到 Web 控制檯。我們可以看到 XRay 分析器準確列印出了 animals
引數變數的值。map
包含兩個鍵值對。
cow
鍵指向的值的型別是 main.Animal
。
main.Animal
有兩個成員,分別是 food
和 age
。
成員 food
的型別是字串,它的值是 “grass”。
這個字串的長度是 5。
main.Animal
的第二個欄位是 age
。
age
的型別是 float32
。
“bird” 的鍵值對與 “cow” 是類似的。
我們也可以根據實際需要,選擇 “By Processes” 模式。
或者選擇 “By Applications” 模式。
關於 OpenResty XRay
OpenResty XRay 是一個動態追蹤產品,它可以自動分析執行中的應用,以解決效能問題、行為問題和安全漏洞,並提供可行的建議。在底層實現上,OpenResty XRay 由我們的 Y 語言驅動,可以在不同環境下支援多種不同的執行時,如 Stap+、eBPF+、GDB 和 ODB。
關於作者
章亦春是開源 OpenResty® 專案創始人兼 OpenResty Inc. 公司 CEO 和創始人。
章亦春(Github ID: agentzh),生於中國江蘇,現定居美國灣區。他是中國早期開源技術和文化的倡導者和領軍人物,曾供職於多家國際知名的高科技企業,如 Cloudflare、雅虎、阿里巴巴, 是 “邊緣計算“、”動態追蹤 “和 “機器程式設計 “的先驅,擁有超過 22 年的程式設計及 16 年的開源經驗。作為擁有超過 4000 萬全球域名使用者的開源專案的領導者。他基於其 OpenResty® 開源專案打造的高科技企業 OpenResty Inc. 位於美國矽谷中心。其主打的兩個產品 OpenResty XRay(利用動態追蹤技術的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最適合微服務和分散式流量的全能型閘道器軟體),廣受全球眾多上市及大型企業青睞。在 OpenResty 以外,章亦春為多個開源專案貢獻了累計超過百萬行程式碼,其中包括,Linux 核心、Nginx、LuaJIT、GDB、SystemTap、LLVM、Perl 等,並編寫過 60 多個開源軟體庫。
關注我們
如果您喜歡本文,歡迎關注我們 OpenResty Inc. 公司的部落格網站 。也歡迎掃碼關注我們的微信公眾號:
翻譯
我們提供了英文版 原文和中譯版(本文)。我們也歡迎讀者提供其他語言的翻譯版本,只要是全文翻譯不帶省略,我們都將會考慮採用,非常感謝!