线上监控 Perl 应用中的程序异常(使用 OpenResty XRay)
在本教程中,我们将介绍如何使用 OpenResty XRay 线上检测分析 Perl 应用中的程序异常。OpenResty XRay 能够检测和分析 Perl 在线进程中的代码异常,包括那些不会导致进程崩溃的被捕获的异常。这些代码路径是 OpenResty XRay 自动分析和解读 Perl 源码级别的异常火焰图得来的。它将最大限度地减少对性能的影响。因此,OpenResty XRay 非常适合对性能开销和延迟敏感的生产环境。
使用引导式分析功能分析 Perl 应用中的程序异常
在浏览器中打开 OpenResty XRay 的 Web 控制台。
确保当前分析的机器是正确的。
如果当前的机器不对,您可以在下面的列表中重新选择。
进入“Guided Analysis“页面。
这里看到系统能分析的不同的问题类型。
选择“Errors & exceptions”。
点击“Next”。
选择之前的 Perl 应用。
选择“Whole application“。
确保应用的类型是正确的。通常默认值就是对的。
OpenResty XRay 可以同时分析多种不同的语言层面。这里保持 Perl 和 C/C++ 都选中的状态。
我们还可以设置最长的分析时间。这里保持默认的 300 秒不变。
开始分析。
系统将持续执行多轮分析。目前它正在运行第一轮分析。
第一轮分析已经完成,现在进入第二轮。
停止分析。
可以看到自动生成了一份分析报告。
这是我们要分析的问题类型,“Errors & exceptions”。
报告展示了抛出最多 Perl 程序异常的代码路径。
Perl_die
是 Perl 虚拟机内部用于抛出异常的函数。
Core
模块下的 download_file
是业务代码中用于下载文件的函数。
这一系列函数属于 Dancer 2 网络框架。
例如,Core::Route::execute
执行匹配路由的处理函数。
_dispatch_route
用于分发当前的 web 请求到对应的路由处理程序。
点击“More“查看更多细节。
这条热代码路径是从这个 Perl 级别的异常火焰图自动推导出来的。
下面是对问题更详细的解释和建议。
这里提到 perl_die
函数可以通过错误消息检测到 Perl 脚本执行时的异常。
它解释了我们之前看到的 download_file
函数。
让我们回到原始的热代码路径。
将鼠标悬停在这个函数的绿框上。
在提示框中可以看到 Perl 函数的源文件名和完整路径。
这行 Perl 源码的行号是 100。
点击这个图标,复制这个函数的源文件路径。
用 vim 编辑器打开源文件。粘贴我们刚才复制的文件路径。您可以使用任何您喜欢的编辑器。
正如 OpenResty XRay 建议的那样跳转到第 100 行。
这是由于把一个 Perl 数组变量引用当作哈希表引用时出现的情况。这个异常其实会被更上层的 Perl 代码捕获住,所以并不会让应用终止。而即便如此,OpenResty XRay 仍能准确检测到这样的异常,并报告给用户。
全自动分析报告
OpenResty XRay 也可以自动监控在线进程,并生成分析报告。
切换到“Insights”页面。
您可以在“Insights”页面中找到以日和周为周期的自动报告。所以您不是非得用“Guided Analysis”功能。
当然,“Guided Analysis”对于应用的开发和演示是很有用的。
关于 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. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!