go agent是什么东西?给新手小白看的简单介绍!

吉云

最近手头有个Go写的服务,跑着跑着有时候就感觉不太对劲,响应慢,但是看日志又看不出个所以然,挺头疼的。

之前搞Java的时候,遇到这种问题,直接上一些agent工具,什么内存分析、链路追踪,一套下来基本就能找到问题在哪。但到Go这边,感觉就没那么方便,毕竟Go没Java那种虚拟机层面的东西,搞动态挂载agent好像不太行。

后来听群里老哥们聊天,说现在Go也有类似的“探针”或者叫“agent”,专门用来搞可观测性,监控程序内部状态啥的。我就来兴趣,想自己动手试试看这玩意儿到底好不好用。

go agent是什么东西?给新手小白看的简单介绍!

开始折腾

我就去网上搜搜,发现确实有不少方案。有的是开源的,像SkyWalking就有Go的探针;有的是云厂商搞的,比如阿里云的ARMS也支持Go。看介绍,它们实现的方式好像有点特别,不是像Java那样跑起来再挂,而是要在编译的时候就把agent的代码织入到你自己的代码里去。听起来就感觉有点麻烦,意味着每次想用或者更新agent,都得重新编译整个项目。

不管怎样,实践出真知嘛我决定先拿那个开源的SkyWalking Go试试水,毕竟不花钱,搞砸也不心疼。

第一步, 先是把SkyWalking Go Agent的库给弄下来。这个还跟着官方文档,用`go get`命令就装上。

第二步, 就是最关键的一步,要把这个agent集成到我的项目代码里。官方文档说要在`main`函数或者程序的入口处,加几行初始化的代码。还得改编译命令,用它提供的一个工具来编译,而不是直接用`go build`。

    go agent是什么东西?给新手小白看的简单介绍!

  • 我先备份下我的项目代码,怕给改坏。
  • 然后小心翼翼地在我项目的`*`文件里,加上初始化SkyWalking Agent的代码,主要是设置服务名,还有连接后端Collector的地址。
  • 接着就是编译。这个过程稍微有点绕,不是直接`go build`,而是要用SkyWalking Go提供的一个编译工具或者脚本。我按照文档试下,第一次还报错,好像是环境变量没设置对。折腾一小会儿,总算编译通过,生成一个新的可执行文件。

看看效果

编译好之后,我就把这个新编译出来的程序跑起来。我本地也搭一个SkyWalking的后端和UI界面,用来接收和展示数据。

go agent是什么东西?给新手小白看的简单介绍!

程序跑起来后,稍微发几个请求过去模拟用户访问。然后我赶紧刷新SkyWalking的UI界面。

还真有数据!

界面上能看到我设置的服务名,点进去能看到拓扑图(虽然我这个服务简单,没啥复杂的拓扑),关键是能看到接口的调用追踪(trace)信息!

  • 哪个接口被调用。
  • 花多少时间。
  • go agent是什么东西?给新手小白看的简单介绍!

  • 如果接口内部还调用其他函数或者数据库啥的(需要进一步插桩),也能串联起来看。

这下感觉心里踏实多,不再是两眼一抹黑。虽然不能说有它就能立马解决所有性能问题,但至少提供一个非常直观的观察窗口,知道时间都花在哪儿,哪块儿是瓶颈。

一点感想

这回实践Go Agent的过程还算顺利,虽然编译那块儿比平时麻烦点,但最终效果是达到预期。

这种编译时插桩的方式,有利有弊。

go agent是什么东西?给新手小白看的简单介绍!

好处是:性能影响可能相对可控,因为它在编译期就把监控代码融合进去。

坏处是:确实不够灵活。每次开关监控或者升级agent版本,都得重新编译部署,对于追求快速迭代的场景来说,可能有点重。

不过对于Go这种追求性能和简洁的语言来说,这也许是一个当前比较合适的折中方案。至少,它让我多一个排查线上问题的有力武器。下次再遇到服务响应慢的问题,我心里就有底多。

这回就先折腾到这,后面有空再研究研究其他家的Go Agent,看看有没有更方便或者功能更强的。

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]