OpenTelemetry Go Auto Instrumentation

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

上下文传播


opentelemetry-go-auto-instrumentation 中的上下文传播受到 Apache-Skywalking 的启发。OpenTelemetry 中的 Context 是一种在分布式系统中传播跟踪相关信息的设计。基于 Context 的传播,分布式服务(又称 Spans)可以连接在一起,形成一个完整的调用链(又称 Trace)。OpenTelemetry 将与跟踪相关的信息保存在 Golang 的 context.Context 中,并要求用户正确传递 context.Context。如果在调用链中没有正确传递 context.Context,调用链就会中断。为了解决这个问题,当 opentelemetry-go-auto-instrumentation 创建一个 span 时,opentelemetry-go-auto-instrumentation 会将其保存到 Golang 的 goroutine (即 GLS)中,而当 opentelemetry-go-auto-instrumentation 创建一个新的 goroutine 时,opentelemetry-go-auto-instrumentation 也会从当前 goroutine 中复制相应的数据结构。当 opentelemetry-go-auto-instrumentation 以后需要创建一个新的 span 时,opentelemetry-go-auto-instrumentation 会从 GLS 中查询最近创建的 span 作为父级,这样 opentelemetry-go-auto-instrumentation 就有机会保护调用链的完整性。

Baggage是 OpenTelemetry 中的一种数据结构,用于在 Trace 中共享键值对。Baggage存储在 context.Context 中,并与 context.Context 一起传播。如果 context.Context 没有在调用链中正确传播,后续服务将无法读取Baggage。为了解决这个问题,当 opentelemetry-go-auto-instrumentation 将Baggage保存到 context.Context 时,opentelemetry-go-auto-instrumentation 也会将其保存到 GLS。当 context.Context 没有正确传递时,opentelemetry-go-auto-instrumentation 会尝试从 GLS 读取Baggage,这样就可以在这种情况下读取Baggage。


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