[golang] 在 golang 项目中如何使用 requestId 来追踪请求的调用栈

20 天前
 Charlie17Li

背景

偶然发现外部系统都会使用 requestId 来追踪请求的调用栈,但是我参与的项目中没有,排查问题时非常依赖于日志中的各种关键字,定位 bug 时只能一边看代码,一边使用各种关键字追踪这个请求的调用栈。

尤其是当这个服务有多个实例的时候,不可能登录到每个实例看请求打在哪个实例上,只能在日志平台一点点根据关键字排查,但这个日志平台出现过吞日志等问题(不知道是不是没上报成功还是啥),增加定位问题的难度

想知道大家排查问题时有什么最佳实践吗,基于 requestId 是不是一个好方法呢?

1522 次点击
所在节点    程序员
29 条回复
nulIptr
20 天前
搜索关键字 opentracing
Charlie17Li
20 天前
@nulIptr 我理解 OpenTracing 是用来解决微服务中请求在多个服务间的调用链路,对吗?我现在面临的问题是:一个服务内的调用逻辑
main1234
20 天前
在 http 做个 middleware ,middleware 会判断
1.如果 header 中有 X-Request-ID ,使用该 id 作为 requestID
2.如果 header 中没有,会生成 requestID
将 requestID 放到 ctx 中

然后 ctx 从上传到下,log 时候将 ctx 中的 requestID 取出来打印,请求时候将 id 放到 header 中
gaobh
20 天前
EFK 把日志拿出来再看就顺多了
Desdemor
20 天前
链路追踪 你搜搜,这不是最基本的吗,有的框架本身就自带
Sendya
20 天前
@Charlie17Li #2 opentracing 用于服务内的调用链路一样很好用,可以记录到每一个函数调用,参数,等数据
kingcanfish
20 天前
直接 debug.Stack() 打印调用栈到日志里不行吗
Ayanokouji
20 天前
requestID 只能解决一部分问题,不能解决全部问题。
go 的 error 和 log 是个技术活,可以看看我之前的帖子,参考下思路 /t/1101542
Ayanokouji
20 天前
@Ayanokouji 我现在采用的方案是 oops
hashakei
20 天前
一般的基础框架会封装的,实际是在 context 透传下去的。
Nitromethane
20 天前
@kingcanfish 打堆栈在生产环境可能会影响性能
sophos
20 天前
现在不应该是 OpenTelemetry 了吗,Opentracing 前两年就被废弃了 ;-)

仅供参考:
https://github.com/go-kod/kod/blob/main/interceptor/ktrace/trace.go
https://github.com/go-kod/kod-ext/blob/main/core/otel/otel.go
simonlu9
20 天前
刚好写了个插件,可以参考一下 https://github.com/simonlu9/log-alarm-spring-boot
jrwt
20 天前
一个服务内的多个实例的调用逻辑不也是走网络吗?我们这边是自己定义的网络协议,协议内部就预留请求 id 部分,没有则生成,有就直接使用,在日志打印出来,采集起来,就完事了。
layxy
20 天前
说白了就是在请求链路记录 requestId,可以封装下日志,打印的时候带 requestId,这样排查问题就简单了,现在 go 的日志框架例如 zap 支持结构化日志,直接扔到 es 或者其他存储里也省事,省的解析了
maxwellz
20 天前
@Ayanokouji #9 我也在用这个,但是有一个问题,有时候会忘,直接用 fmt.Errorf 或者 err 在某一层被设置为了其他类型的 err ,这种情况你是咋解决的,提供一个封装好的 error 模块嘛
FarmerChillax
20 天前
现在肯定用 opentelemetry ,Opentracing 已经被废弃了
vhwwls
20 天前
@FarmerChillax #17 正解,用 OTEL 才是对的,OpenTracing 和 OpenCensus 已经 Archived 了。
vhwwls
20 天前
@Charlie17Li #2 OpenTracing 已经没了,用 OpenTelemetry 。
Corrots
20 天前
都是发 opentelemetry 和 opentracing ,这些链路追踪 tracing 的采样率不可能开到 100%,对性能影响还蛮大的。

其实就可以按照 #3 说的方式来,在 http 通过 middleware 在 header 中添加 X-Request-ID ,前端 web 和 客户端最好也能配合改造下。这样对于大量微服务的业务场景,可以通过 X-Request-ID 将请求在微服务间串起来

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/1107367

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX