作者:古琦
在现代软件架构中,微服务已成为构建可扩展和灵活应用程序的流行方式。每个微服务负责应用程序的一部分功能,它们共同工作以提供完整的服务。由于微服务架构的分散特性,监控变得至关重要,有效的微服务监控是确保高可用性、可靠性和服务质量的关键组成部分,它支撑了整个系统的健康运行和业务的持续增长。
随着 Kubernetes 以及容器化的技术普及,Go 语言不止应用于云原生基础组件领域,在业务场景下有非常多的新兴业务都使用 Golang 作为编程语言首选,Golang 的 RPC 框架非常多,如 Gin、Kratos、Kitex 等,Golang 在微服务生态中愈趋成熟,通过最新的 TIOBE 的查看到 Golang 的排名进入前十,做好 Golang 微服务的应用监控至关重要。

应用监控 eBPF 版通过 eBPF 的技术实现了无侵入的 Golang 微服务可观测能力,可以获取 Golang 微服务的调用详情,同时能实现无侵入的 Golang 的 CPU Profiling、数据库调用分析。
详细产品介绍:多语言应用监控最优选,ARMS 应用监控 eBPF 版正式发布
eBPF 介绍
eBPF(扩展的 Berkeley 包过滤器)是一种强大的技术,允许开发人员在 Linux 内核中安全地运行预编译的程序,而不改变内核源码或加载外部模块。这一独特的能力使得 eBPF 成为构建现代、灵活且高效的应用监控工具的理想选择。

图 1.1 eBPF 示意图
在可观测性方面,eBPF 优势尤为突出:
- 实时性: eBPF 能够实时捕获和分析数据,为开发者提供即时的性能反馈。
- 精确性: 通过精细的 hook 函数(hook points),eBPF 可以在系统的具体点进行监控,从而准确地收集所需数据。
- 灵活性: 开发者可以编写定制的 eBPF 程序来监控特定事件,使其能够适应各种复杂的监控需求。
- 低开销: eBPF 程序直接在内核空间运行,避免了传统监控工具中频繁的用户空间和内核空间之间的上下文切换。
- 安全性: eBPF 程序在执行前必须通过内核的严格检查,确保不会危及系统安全。
Golang 微服务应用监控
将 Golang 应用添加到应用监控 eBPF 中,可以参考:help.aliyun.com/zh/arms/app...
如下图所示,将一个使用了 Gin 框架的 Golang 应用添加到应用监控eBPF中,如下图所示,在 Deployment 中增加以下配置:

添加完成后查看应用详情:

服务接口调用详情:

查看应用的调用请求详情,包含请求的 body、header、接口等信息:


持续剖析
应用监控 eBPF版 推出无侵入的应用持续剖析的能力,我们通过 eBPF 去获取应用程序的调用栈,同时在 eBPF 探针中实现对应的栈 ID 到方法的映射,可以查看应用的 CPU 火焰图,直观展现业务应用执行过程中 CPU 密集点,不需要做任何的代码修改。如下使用 Go-Gin 框架提供的 Http 服务,火焰图如下所示:

可以查看到处理 Http 请求的 CPU 百分比:

如果在服务中加入一个循环打印数据的功能:
scss
func Print() { for { fmt.Println("This will print indefinitely every second.") time.Sleep(1 * time.Second) // 每秒打印一次 }}
可以从火焰图中找到对应的 Print 函数,能快速定位 Golang 微服务中 CPU 的占比:

数据库分析
数据库是业务应用中使用最多的中间件产品,监控业务应用对数据的调用能够快速发现问题,比如慢 sql、调用数据库的响应时间等,应用监控 eBPF 版提供了针对数据库的调用分析页面,如下所示:

查看数据库调用的详情,其中展示了数据库的调用次数、sql 语句(聚合后)、平均耗时、慢调用次数(500ms)等信息。

网络监控
网络监控数据描述了应用对应的每个实例接收的包数、发送包数、Tcp Latency、Tcp 重传、Tcp Drop。

目前,应用监控 eBPF 版处于免费使用阶段,欢迎开发者体验与使用,点击此处,立即体验。
如果您在使用应用监控 eBPF 版中有任何问题,请联系答疑钉钉群(群号:35568145)获取帮助。