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站账户 – 老麦胖熊猫 订阅最新文章和更多精彩内容