编写自定义 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. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版 原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!