OpenTelemetry Go Auto Instrumentation

414
下载
opentelemetry-go-auto-instrumentation 是阿里巴巴开源的基于OpenTelemetry规范的Golang应用无侵入编译时注入监控方案,可以在用户完全不修改业务代码的情况下对用户的Golang应用进行监控。

Golang Agent可观测性的全面升级与新特性介绍


背景

自2024年6月26日,ARMS发布了针对Golang应用的可观测性监控[1]功能以来,阿里云 ARMS 团队与程序语言与编译器团队一直致力于不断优化和提升该系统的各项功能,旨在为开发者提供更加全面和深入的应用性能监控体验。

在这段时间内,ARMS推出了多项关键功能,包括:

  • 全链路的追踪:支持前端、网关、后端服务的全链路追踪,实现端到端的全链路打通。
  • CPU Profiling:通过提供详细的CPU使用情况分析,帮助开发者识别性能瓶颈,优化代码执行效率。
  • 内存 Profiling:Golang Agent引入内存使用分析工具,帮助监测内存分配和泄漏情况,提高应用的内存管理能力,确保服务的稳定性。
  • 本地错慢全采:新增的错慢全采功能使得系统能够捕捉到应用中的错误和延迟事件,从而帮助团队快速诊断问题,提升用户体验。
  • 新增插件:为扩展监控能力,Golang Agent新增多个插件,支持不同场景和需求,用户可以灵活组合使用,满足个性化监控需求。
  • 日志Trace关联:通过将日志与执行路径关联,提升了问题追踪的效率,开发者能够快速定位故障根源,从而减少故障恢复时间。
  • 动态开关:为了更好地满足不同环境和使用场景的需求,Golang Agent实现了动态开关功能,允许用户灵活控制监控开启和关闭,提高系统的灵活性和可管理性。
  • 性能提升:性能上相比1.0.0提升了35%+以上,极大的降低了资源的消耗。
  • Windows:支持Windows环境编译、运行, 与Linux、Mac上都有相同的体验。

通过这一系列的功能升级,ARMS希望能够帮助开发者更好地理解和优化他们的Golang应用,从而提升整体服务质量和用户满意度。未来,ARMS将继续关注用户反馈,持续改进和扩展监控功能,为Golang应用的可观测性提供更强有力的支持。接下来我将逐个介绍一下Golang Agent的新增功能:

全链路追踪

为了实现前端 + 网关 + 后端服务的全链路追踪,Golang Agent支持了常见的Trace透传协议如w3c、b3、jaeger、EagleEye,实现多个不同类型的语言的应用之间Trace透传,Golang服务内部支持Span Context的透传,无需要手动传递context,即可实现服务内部链路打通,同时还支持跟OpenTracing SDK、OTel SDK兼容,针对自定义的span同样可以做到传递。

持续剖析

pprof 是 Go 语言内置的性能分析工具,允许开发者分析程序的 CPU 和内存使用情况。通过引入 net/http/pprof 包,开发者可以在 HTTP 服务器中开启性能分析功能,从而实时获取程序的运行状态、堆栈信息和内存分配情况等。

但是手动的在代码里面添加pprof的端口,获取对应的应用运行情况需要请求这个应用,同时需要有图表展示,使用比较非常麻烦,同时长时间开启pprof可能会有一定的性能开销,因此Agent在功能上支持随开随关,可以通过开关动态控制这个采集过程,还支持了pprof数据的在线查看和对比。

CPU Profiling

通过开启持续剖析的能力,就可以在应用诊断上查看到对应时间段的CPU Profiling 数据,同时可以支持Profiling数据的对比,通过 CPU Profiling的视图可以非常方便找出服务的性能瓶颈。

内存Profiling

除了CPU Profiling外,内存的Profiling同样重要,对于分析内存的异常分配、内存泄漏起到关键作用,通过开关打开内存热点后,在性能分析类型下可以看到应用的内存分配大小、内存分配的次数。

本地错慢全采

由于采样率的限制,并非每条调用链都能被采集和上报,这在遇到问题时常常导致无法追踪到应用的调用链路。为了解决这一问题,除了调整采样率外,在Agent中针对错误和处理缓慢的请求实施全采样策略。这一措施确保所有发生的错误和缓慢请求都能被及时捕捉到,从而为后续问题的分析提供有效依据。

同时,为了优化性能,对如Redis等关键服务的调用进行压缩处理,以避免过多的span导致Trace链路变得过于冗长。这一措施不仅减少了上报的数据量,还提升了系统整体的追踪效率。通过这些改进希望能够更准确地定位和分析应用中的问题,为开发团队提供更可靠的支持。

可以看到优化前的span展示如下所示(这里对redis 进行了循环10次的get、set请求):

开启错慢全采后:

span减少非常多,同时对于错误和慢的span会全部上报,这样既保证了问题查询,又能进行数据压缩降低成本。

新增插件

从1.1.0 版本的20款插件,目前Golang Agent的1.3.0版本支持了38款插件,新增了很多常用的SDK支持,如

消息:kafka

RPC:hertz、thrift、iris、fiber、kratos

SQL/NoSQL:elasticsearch、redisv8、redisgo(https://github.com/gomodule/redigo)

日志框架:logrus、zap、zerolog,以及golang的log、slog。

对于OpenTracing Go SDK也做了支持,通过OpenTracing SDK的创建Span、Span End 等操作都可以无需修改即可在Trace链路进行绑定。

针对函数计算FCGo的SDK(https://github.com/aliyun/fc-runtime-go-sdk),有在函数计算下部署Golang应用的场景,针对FC Event的接收和处理的监控,使用Golang Agent编译对应的FC Go程序,在FC运行接收流量后可以在Arms 控制台查看到应用对应的监控情况[2]。

更多的插件相关的支持和对应的版本,可以查看[3]。

日志Trace关联

通过错慢全采的能力完善了Trace采样导致的Span被丢弃的问题,为了更好的定位到问题的原因,将TraceId、SpanId打印到对应的调用日志中,在日志插件支持方面支持了logrus、zap、go自身log、slog以及zerolog等日志框架。

动态开关

针对Agent提供的非常多的功能和插件,为了能实现功能的按需开启,在应用配置上增加了非常多动态开关能力:

  • 针对每个插件,Agent提供了插件的动态开关,默认情况下打开,如不需要采集某些SDK的数据,可以动态关闭:

  • 日志关联配置,可以将TraceId、SpanId关联到对应的日志上,并在ARMS控制台实现日志Trace关联,这里可以配置对应的日志采集的Project、LogStore等:

  • 持续剖析,可以配置CPU Profiling、内存Profiling的动态开关:

  • 数据库配置,可以配置是否展示sql语句的请求参数、sql语句的长度配置、sql超时配置等:

  • 接口调用配置,设置接口的超时时间、对哪些接口、状态码进行过滤:

Windows

之前的版本在Linux、Mac上进行编译运行,在新的1.3.0 版本中增加了对Windows的编译和运行的支持。

RoadMap

1、代码热点,通过持续剖析技术定时采集请求线程堆栈快照,真实还原代码执行的第一现场。

2、自定义扩展,方便快速定制开发。

3、Golang的内存泄漏、goroutine泄漏等异常事件的检测

同时基于OpenTelemetry的协议的Golang Agent 已经开源[4],目前已经发布到0.2.0 版本,支持了超过15+的插件[4]。

[1] https://mp.weixin.qq.com/s/6GspMI6nsRYTc6qlMT—XQ

[2] https://help.aliyun.com/zh/arms/application-monitoring/user-guide/use-the-arms-golang-probe-in-function-compute-fc-environment?spm=a2c4g.11186623.0.0.6b821af5fydalG

[3]https://help.aliyun.com/zh/arms/application-monitoring/developer-reference/go-components-and-frameworks-supported-by-arms-application-monitoring?spm=5176.arms.console-base_help.dexternal.4c0df16735iKF3

[4] https://github.com/alibaba/opentelemetry-go-auto-instrumentation


observability.cn Authors 2024 | Documentation Distributed under CC-BY-4.0
Copyright © 2017-2024, Alibaba. All rights reserved. Alibaba has registered trademarks and uses trademarks.
浙ICP备2021005855号-32