共计 1859 个字符,预计需要花费 5 分钟才能阅读完成。
Golang Context 生产利用案例(01): 链路追踪
如果在 公众号 文章发现状态为 已更新 ,倡议点击 查看原文 查看最新内容。
状态: 未更新
原文链接: https://typonotes.com/posts/2023/03/15/golang-context-in-acti…
看完本文
- 理解 链路追踪 和 OpenTelemetry 相干常识
- 理解 Context 值传递是如何在 链路追踪 的倒退历程上登台亮相的。
之前在 Golang 上下文 Context 源码解析(1): 值传递 文章中举了一个例子阐明解说 Context 的值传递,其中说到了 刘备 - 关羽 - 张飞 之间应用 Context 传递 曹操军队人数,
有敌人反馈说这个值应该是 业务参数 放在函数中作为 形参 传递,难以了解为什么会放在 Context 中。
func Guanyu(n int) {// statement}
func Zhangfei(n int) {// statement}
因而,这次咱们通过生产理论利用,来说一下 Context 的值传递。
链路追踪
想必大家也晓得,微服务治理是一个头疼的问题。因为服务泛滥且部署扩散,因而通过 调用链路 排查问题就十分重要了。实现这个的计划就叫 链路追踪,在微服务中十分重要。
能够说,开源我的项目 OpenTelemetry 在链路追踪层面,基本上曾经是事实标准了。
Github 地址: https://github.com/open-telemetry
这里有一个官网一步步实现链路追踪的案例,能够本人实现一下:
https://github.com/open-telemetry/opentelemetry-go/tree/main/example/fib
Context 在 链路追踪 中的利用
当初假如有 6 个服务,SvcA 1-3,SvcB 1-3,这 6 个服务可能散布在不同机器下面。
第一阶段
咱们晓得他们之间存在调用关系,然而任何证据撑持。所以从内部看来,他们之间就是齐全独立的的 6 个服务。
因为工夫紧,工作重,业务就这样上线了。
第二阶段
起初业务出了问题,除了靠记忆,就只能现场看代码找调用链路。排查过程异样艰巨。
于是有人提议说,不如咱们在每个申请中都带上 UUID,并且打印到日志外面,就晓得哪些服务在某个申请下,是有关系的。
于是就有了 TraceID
第三阶段
业务还是除了问题,这次排查过程相比上次就轻松多了,然而仍然发现了一些 困惑 的问题。 尽管能从日志工夫看到服务的调用程序,然而并不知道他们之间的调用关系,没方法无效的把他们组织起来。
于是就有人说,要不在日志中减少两个字段,表明他们调用的父子关系吧
于是就有了 ParentSpanID
和 SpanID
应用 Context 携带字段
当初好了咱们能通过 TraceID, SpanID, ParentSpanID
搞清楚服务之间的调用关系了。然而要怎么传递他们呢?
这些字段是 必定不能 间接放在参数外面,
- 这些字段不是业务参数,放进去会 净化 函数或办法。
- 即便当初放进去了,当前要保护 减少或缩小 怎么办?不可能每个中央服务都去改一次吧,服务外面还有那么多函数。从实践上来说,这个就是不合理的设计。
func Guanyu(n int, TraceID string, SpanID string, ParentSpanID string) {// statement}
func Zhangfei(n int, TraceID string, SpanID string, ParentSpanID string) {// statement}
第四阶段
于是又有人说了,要不咱们对立放在 Context
外面吧,
- Context 自身就是上下文,就具备传递性。
- 而且其设计实践上还能够存储有限多的数据。
这样咱们就只须要在在每个函数或者办法中多增加一个 Context 参数就行了,保护也不便。
func Guanyu(ctx context.Context, n int) {// statement}
func Zhangfei(ctx context.Context, n int) {// statement}
这样看起来,就清新很多了。而且这种构造 是不是很相熟?
OpenTelemetry 补充阐明
这里以 OpenTelemtry 间隔,是为了阐明 Context 的值传递的其中一个应用案例。
OpenTelemetry 在链路追踪上的实现,更欠缺,更弱小。
配合 Jaeger 这类可视化工具后,服务的所有净收眼底。
相互吹捧,共同进步
欢送和我一起学习提高,如果有什么问题,能够给我私信留言。或者
- 加我好友 线下探讨。
- 关注我的 公众号 – 老麦胖熊猫 或者 B 站账户 – 老麦胖熊猫 订阅最新文章和更多精彩内容