像Elastic APM , Skywalking
等APM
工具的监控追踪的原理是什么?如下图:
是如何拿到比如 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
去监控拿 请求时间、请求内容和响应时间 等也对应写代码去支持吗?
链路追踪说白了就是在你的代码中的某个节点上, 把traceid, 时间, 以及其他的一些信息发送到链路追踪的服务器.
至于你看的库是因为它们的封装程度比较高.所以看起来比较复杂
go-skywalking的库比较简单
tracer是一个一个Skywalking的客户端连接,一共只有4个接口,其实就是一个功能
通过traceid生成不同类型的span
如果简单地使用这个库的话,对代码侵入性比较高,你需要在所有调用数据库,调用http,调用websocket等之前和之后都写一段上面的代码 才能做到链路追踪.
于是开发者就会想一些办法, 使得链路追踪的接入更加简单.比如java就有JavaAgent和ASM字节码的方案. go的话可以通过ORM框架RPC框架提供的hook,python的话可以通过装饰器去实现比较简单的接入的方案. 至于有没有开源方案,这就要看社区是否活跃了,所以会有这种
request支持,axios不支持
的情况.