在本教程中,我們將演示如何編寫一個簡單的 Ylang 分析器,在 OpenResty XRay 中動態追蹤任意的 Go 程式。這個自定義分析器會在指定的 Go 函式入口新增一個動態探針,然後列印輸出一個 Go 變數的值。得益於我們的動態追蹤技術,這些分析器能以真正的非侵入的方式工作。這樣我們可以將效能開銷降至最低,同時也不用對目標 Go 程式和程序進行任何修改。

向 Go 變數插入兩個鍵值對

我們有一個 Go 語言編寫的 animal 程式。

Screenshot

使用 Vim 編輯器來檢視這個程式的原始碼。

Screenshot

可以看到這個程式中,Animal 是一個結構體。

Screenshot

Animal 結構體有兩個成員。food 的欄位型別是 string,而 age 的欄位型別是 float32

Screenshot

showAnimals 函式顯示了 map 變數中的值。

Screenshot

它有一個型別為 map[string]Animal 的引數 animals

Screenshot

map[string]Animal 是一個 map 聚合型別。它的鍵型別為 string,值型別為 Animal

Screenshot

main 函式中,向 animals 這個 map 變數插入兩個鍵值對。

Screenshot

我們用的是 Linux 發行版自帶的未經修改過的 Go 編譯器。

Screenshot

編譯這個程式。可以看到,不需要新增任何特殊選項。

Screenshot

這是該程式的輸出。

Screenshot

這個程式的執行速度非常快,只需 1 毫秒。

Screenshot

讓我們編寫一個自定義的 Ylang 分析器,來動態追蹤這個 Go 程式的執行。

Screenshot

編寫自定義 Ylang 分析器,動態追蹤 Go 程式

切換到 OpenResty XRay 的 Web 控制檯。

Screenshot

跳轉到 “Analyzers” 頁面。

Screenshot

點選 “Add new analyzer”。

Screenshot

在 “Analyzer name” 文字框中輸入分析器的名稱。

Screenshot

選擇 “YLang” 語言型別。

Screenshot

刪除預設提供的 Ylang 程式示例。

Screenshot

這裡我們在 main 包中的 Go 函式 showAnimals 的入口處,新增一個動態探針。

Screenshot

這個引數型別是一個鍵為 string,值型別為 main.Animalmap

Screenshot

這個引數的名字是 animals

Screenshot

呼叫 _dump_go_val 來列印 animals 變數的值。

Screenshot

呼叫 _exit() 使分析器在執行完這個探針處理程式後退出。

Screenshot

儲存程式碼。

Screenshot

這是一個短生命週期的程式,因此我們選擇 “By Executables” 模式。

Screenshot

回到之前的終端視窗。執行 readlink -f 命令查詢可行檔案的路徑。複製它。

Screenshot

貼上可執行檔案的路徑。

Screenshot

點選 “Run” 開始執行。

Screenshot

分析器已經開始追蹤。

Screenshot

測試追蹤結果

切回我們的終端。

Screenshot

執行 Go 程式。程式仍能正常執行。

Screenshot

這個程式的用時和之前一樣,仍然只需 1 毫秒。

Screenshot

回到 Web 控制檯。我們可以看到 XRay 分析器準確列印出了 animals 引數變數的值。map 包含兩個鍵值對。

Screenshot

cow 鍵指向的值的型別是 main.Animal

Screenshot

main.Animal 有兩個成員,分別是 foodage

Screenshot

成員 food 的型別是字串,它的值是 “grass”。

Screenshot

這個字串的長度是 5。

Screenshot

main.Animal 的第二個欄位是 age

Screenshot

age 的型別是 float32

Screenshot

“bird” 的鍵值對與 “cow” 是類似的。

Screenshot

我們也可以根據實際需要,選擇 “By Processes” 模式。

Screenshot

或者選擇 “By Applications” 模式。

Screenshot

關於 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、LuaJITGDBSystemTapLLVM、Perl 等,並編寫過 60 多個開源軟體庫。

關注我們

如果您喜歡本文,歡迎關注我們 OpenResty Inc. 公司的部落格網站 。也歡迎掃碼關注我們的微信公眾號:

我們的微信公眾號

翻譯

我們提供了英文版 原文和中譯版(本文)。我們也歡迎讀者提供其他語言的翻譯版本,只要是全文翻譯不帶省略,我們都將會考慮採用,非常感謝!