前提
上周,我发布了goanalysis工具的首个版本,并得到了广大用户的积极反馈与支持。随着关注度的增加,许多用户表达了对如何有效利用该工具的兴趣和疑问。
经过深入考量后,我决定对goanalysis进行重大升级以更好地满足用户需求。
本文旨在详细介绍最新版goanalysis的功能特性及其使用方法,并引导大家访问体验网站。
主要功能包括:
运行时性能分析:提供应用程序在实际执行过程中性能指标的深度洞察。静态源代码分析:通过扫描源代码来识别潜在的问题或优化机会,无需实际运行程序即可完成。
启动服务器
通过goanalysis,启动服务器:
goanalysis server
默认端口号设置为8000。请通过浏览器访问地址 http://<IP地址>:8000。在页面上定位并点击“程序运行分析”选项后,需将运行过程中生成的数据库文件(DB文件)路径输入至指定文本框内,随后即可启动分析流程。
运行时分析
在大多数编程语言中,函数被视为最基本且首要的执行单元,所有的程序流程均通过函数来实现。Go语言(Golang)同样遵循这一原则。
为了对指定的Go项目进行重写,请首先将该项目复制到目标服务器上。接着,访问相关网页界面,在提供的插桩输入框内填入该Go项目的目录路径。建议使用绝对路径以确保准确无误。完成路径填写后,点击“一键插桩”按钮,从而启动整个项目的自动重写过程。重写操作结束后,您可以直接运行修改后的项目。具体步骤可参考附图所示。
原理概述如下:goanalysis工具将对目标项目的全部Go源文件执行抽象语法树(AST)分析。在此过程中,它会在所有函数中插入含有functrace.Trace()调用的defer语句。当程序运行并进入这些被标记的函数时,当前函数的参数、所属的goroutine以及调入点信息会被记录下来,并存储到SQLite3数据库中。值得注意的是,此过程会产生一个本地数据库文件,其命名格式为trace_0.db,每次新的运行都会创建一个新的数据库文件,文件名中的数字序号会依次递增,这些数据库文件默认保存在程序的工作目录下。
在对修改后的Go项目进行了充分测试之后,需将生成的所有本地数据库文件复制到安装有goanalysis工具的服务器上,以便进行后续的数据分析或处理工作(未来计划开发一个自动化上传功能来简化这一流程)。
也可以执行命令模式:
goanalysis rewrite -d <path>
“
请注意,当启用重写功能时,系统将默认过滤包含“log”和“context”关键字的内容。在启动Go应用程序时,可以通过设置环境变量 IgnoreNames=log,context 来指定希望被过滤的关键字列表。这种方式允许用户根据需求自定义忽略的标识符。
分析功能
运行时分析概览
整体运行性能指标:
总计的goroutine数量;函数平均执行时间;最大调用深度。
热点函数详细分析:
执行时间分布;调用频率统计。
Goroutine执行详情列表:
堆栈信息展示:提供每个goroutine的完整调用堆栈视图,包括函数调用链及其参数值;调用关系可视化:自动生成各goroutine间的调用关系图谱。
函数级深入查询与分析
用户可以指定任意感兴趣的函数作为查询目标。系统将列出所有直接或间接调用了该目标函数的方法,并在下方界面中呈现结果。示例输出如下所示(此处可插入具体示意图)。
以上内容旨在为开发人员提供一套全面且直观的应用程序运行状态监控工具,以支持更高效的性能优化和故障排查工作。
使用场景
在接手现有项目时,如果具备编译能力或能够将已编译的文件部署到开发及测试环境中,并在一段时间运行后获取数据库文件,那么通过这种方式,可以迅速识别出哪些代码段是活跃且必要的,哪些则可能是冗余或不再使用的。此方法对于快速掌握项目的实际运作机制十分有效。对于第三方库源码的理解,以nsqd(一个用Go语言编写的轻量级消息队列服务)为例,建议结合其官方提供的示例程序来进行学习。同时进行动态演示与静态代码分析,这样不仅可以直观地感受到该工具的强大功能,还能深入理解其实现细节和工作原理。这种方法有助于开发者更全面地掌握第三方组件的应用场景和技术特点。
静态分析
若需全面了解所有函数间的调用关系,仅依赖运行时分析可能无法完全覆盖。因此,推荐采用其他方法对整个代码库进行深入剖析。为此,我们提供了一种静态分析工具,能够有效满足这一需求。
请在输入框中指定Go项目的路径,然后启动分析流程。分析过程结束后,系统将在下方的数据库文件列表中自动生成一条新的记录。您可以通过点击该记录来查看详细的分析结果。
可以展示当前整个分析内容;
函数上下游分析
在输入框中键入您感兴趣的函数名称,即可查看该函数的上游及下游调用关系,并展示其完整的调用链路。这种可视化呈现方式非常直观且信息丰富。
使用场景
理解源代码中函数间的相互依赖关系以及包之间的关联结构。在进行代码修改时,能够迅速评估当前变更的影响范围。(对于后续GitLab中集成的代码变动影响分析功能,我正在着手规划。)
测试地址
尊敬的用户,
您可以通过访问以下公网地址体验相关功能:http://175.178.49.104:8000/。
对于运行时分析功能,请在相应的输入框内填写路径 /root/code/nsq/apps/nsqd/trace_0.db。静态代码分析部分,则建议使用路径 /root/code/nsq/apps/nsqd 作为输入。
本项目的源码托管于 GitHub,具体链接为:https://github.com/toheart/goanalysis。
“
请注意,本次提供的服务仅用于演示与体验目的。由于资源有限,该服务器的服务期限仅为一个月,并且不包含任何敏感或有价值的数据。因此,恳请大家合理使用,避免任何形式的攻击行为,共同维护良好的网络环境。
感谢您的理解与合作!
敬上
总结
我用心打磨了这个版本整整一周,不断进行优化和改进。由于时间紧迫,加上工作版本追赶的原因,还有一些功能暂时没有来得及加入。
如果你喜欢我的项目,希望能得到你的支持——无论是关注我还是在GitHub上给项目点个星。每一份支持对我来说都是巨大的鼓励,真的非常感谢!
后续,我会继续更新专栏《K8S源码阅读》,这个专栏会从架构,更多的编码思考,代码设计的角度来解析K8S巨作。(挖个大坑)
公众号:小唐云原生
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。