链路监控追踪的原理是什么?

Elastic APM , SkywalkingAPM工具的监控追踪的原理是什么?如下图:

是如何拿到比如 http , rpc , redis ,mysql , amqp 等链路的具体执行时间的?网上找到一些说法,但是具体觉得描述的太简单了。如下:

发起方生成一个全局的traceId,整个链中都采用同一个traceId

每次请求都会产生独立的spanId,每个spanId记录每次请求时间、请求内容和响应时间等。 PS:这里
订单调用会员产生一个spanId,会员调用消息会产生另外一个spanId

通讯时,会在请求头中传递该traceId和spanId。

大概明白这个就是整体的思路,但是如果要自己实现的话,感觉离具体还差的很远?比如自己要写一个链路监控又要怎么做呢?

比如监控 Node.js 应用 , 我看 Elastic APM 监控 http 请求,也是分库的 ,支持基于 http/https 写的库,所以 request 等是支持, 对于 axios 好像就不支持,而 ws 协议,官方文档也给的是 websocket 库,对 socket.io 库也没有,不同的库会有什么影响吗?

是因为这些库的实现方式不一样,然后 Elastic APM 去监控拿 请求时间、请求内容和响应时间 等也对应写代码去支持吗?

阅读 3.2k
2 个回答

链路追踪说白了就是在你的代码中的某个节点上, 把traceid, 时间, 以及其他的一些信息发送到链路追踪的服务器.

至于你看的库是因为它们的封装程度比较高.所以看起来比较复杂
go-skywalking的库比较简单
tracer是一个一个Skywalking的客户端连接,一共只有4个接口,其实就是一个功能
通过traceid生成不同类型的span

// 这个代码不保证能正常运行
// tracer.CreateEntrySpan()
// tracer.CreateExitSpan()
// tracer.CreateExitSpanWithContext()
span,_ := tracer.CreateLocalSpan()
// 给span增加一些信息
span.Tag("a","b")
span.SetPeer("aaaa")
// 把span发到skywalking
span.End()

如果简单地使用这个库的话,对代码侵入性比较高,你需要在所有调用数据库,调用http,调用websocket等之前和之后都写一段上面的代码 才能做到链路追踪.

于是开发者就会想一些办法, 使得链路追踪的接入更加简单.比如java就有JavaAgent和ASM字节码的方案. go的话可以通过ORM框架RPC框架提供的hook,python的话可以通过装饰器去实现比较简单的接入的方案. 至于有没有开源方案,这就要看社区是否活跃了,所以会有这种request支持,axios不支持的情况.

Java是利用JavaAgent和ASM字节码来做探针实现SkyWorking的链路追踪

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题