分布式追踪的形态
1. 分布式追踪基础与范围管理
在Go等语言中,可使用用户管理的进程上下文对象编写伪代码,而Java或C#等语言则可利用线程本地存储实现类似功能。关键在于,要将跨度上下文传递给想要创建跨度的子函数,可通过函数参数传递单个跨度对象来实现。
不过,为每个方法签名添加跨度上下文的做法不太优雅。此时,可借助范围管理器来简化这一过程。范围管理器利用线程本地存储自动保存对活动跨度的引用,从而创建新的子跨度。
2. 对追踪友好的微服务和无服务器架构
分布式追踪与微服务、无服务器架构是天生的搭档,但并非所有微服务在追踪方面都是平等的。以下是一些操作建议和注意事项:
- 建议操作 :
- 优先考虑白盒检测 :微服务应足够小,以便能进行基于库的检测实践,将追踪代码集成到服务中。这样不仅能更准确地确定追踪数据的范围,还能随着服务的更新逐步完善追踪功能。
- 捕获语义信息 :为生成的跨度附加相关的语义属性,如OpenTelemetry的span.kind属性,以更全面准确地了解服务的运行情况。
- 创建重要属性 :添加如主机名、区域或数据中心、服务版本等属性,还可考虑添加README属性或指向内部系统的指针,方便人们获取更多服务信息。同时,确保对入站和出站请求进行追踪,最好由RPC库自动处理跨度的创建过程。
- 从已知问题入手 :针对特定的问题区域、对延迟敏感的服务或其他关注领域,先从这些地方开始构建追踪,以便更快地了解和解决