链路跟踪方法及装置、电子设备及介质与流程

未命名 09-24 阅读:72 评论:0


1.本公开涉及网络技术领域,尤其涉及一种链路跟踪方法及装置、电子设备及存储介质。


背景技术:

2.随着云计算技术的发展,越来越多的系统采用了复杂并且规模庞大的分布式的架构来部署,这些系统往往是由众多软件模块组合,可能采用了不同的编程语言,以微服务的形式部署在众多云服务器或者容器中。
3.若使用微服务形式响应服务请求,则会涉及到多个应用节点,并需要进行链路跟踪,如此,在发现异常可以根据链路跟踪的数据,定位到导致异常的云服务器和/或容器。
4.相关技术中进行链路跟踪的方式有两种:
5.第一种,基于云服务器和容器的日志数据和业务数据,通过日志数据和业务数据的关联分析实现异常的发生位置定位等,但是这种方式具有待处理的数据量大以及严重滞后的问题。
6.第二种:取代第一种,在微服务涉及的应用程序内进行埋点,通过埋入代码进行链路跟踪。但是这种方式,应用程序的代码埋入,需要获得应用程序的开发者的授权许可,且有多个应用程序时,需要对多个应用程序进行代码改造。故这种方式虽然可以减少基于跟踪数据的异常定位延时,但是实现的技术难度大。


技术实现要素:

7.本公开实施例提供了一种链路跟踪方法及装置、电子设备及存储介质,以减少对应用程序的代码改进的同时,简便实现链路的跟踪。
8.本公开实施例第一方面提供一种链路跟踪方法,由应用节点执行,包括:
9.利用集成在所述应用节点内核的传输控制协议(transmission control protocol,tcp)模块的代理模块,在所述tcp模块收发的tcp报文插入第一跟踪数据;
10.根据所述第一跟踪数据,生成并缓存第二跟踪数据;其中,所述第二跟踪数据,至少用于所述tcp 报文对应的服务调用的链路跟踪;
11.当所述第二跟踪数据的状态满足第一条件时,将所述第二跟踪数据发送收集模块。
12.本公开实施例第二方面提供一种链路跟踪方法,由包含分析模块的电子设备执行,包括:
13.接收到集成在应用节点内核的代理模块发送的第二跟踪数据之后,对所述第二跟踪数据进行完整性校验;
14.缓存通过所述完整性校验的所述第二跟踪数据并将通过所述完整性校验的第二跟踪数据发送给分析模块,其中,所述收集模块缓存的所述第二跟踪数据,所述第二跟踪数据,至少用于所述tcp报文对应的服务调用的链路跟踪。
15.本公开实施例第三方面提供一种链路跟踪方法,由包含分析模块的电子设备执行,包括:
16.接收收集模块发送的第二跟踪数据,其中,所述第二跟踪数据是集成在应用节点内核的代理模块生成的;
17.根据所述第二跟踪数据,生成一个跟踪id指代的服务调用的链路的拓扑图。
18.本公开实施例第四方面提供一种链路跟踪装置,包括:
19.插入模块,被配置为利用集成在所述应用节点内核的传输控制协议tcp模块的代理模块,在所述tcp 模块收发的tcp报文插入第一跟踪数据;
20.第一生成模块,被配置为根据所述第一跟踪数据,生成并缓存第二跟踪数据;其中,所述第二跟踪数据,至少用于所述tcp报文对应的服务调用的链路跟踪;
21.第一发送模块,被配置为当所述第二跟踪数据的状态满足第一条件时,将所述第二跟踪数据发送收集模块。
22.本公开实施例第五方面提供一种电子设备,所述电子设备包括:
23.存储器;
24.处理器,与所述存储器连接,用于通过执行存储在所述存储器上的计算机可执行指令,能够实现第一方面至第三方面任意一个技术方案提供的链路跟踪方法。
25.本公开实施例第六方面提供一种计算机存储介质,所述计算机存储介质存储有计算机可执行指令;所述计算机可执行指令被处理器执行后,能够实现第一方面至第三方面任意一个技术方案提供的链路跟踪方法。
26.本公开实施例提供的技术方案,代理模块集成在服务器操作系统的内核内,如此,该代理模块不再是集成在需要监控的应用程序上。如此一个应用节点安装有多个应用程序时,可以通过该集成在内核上一个代理模块实现不用应用收发的tcp报文的埋点,此处的埋点即为:第一跟踪数据插入tcp报文,在插入第一跟踪数据的同时,还会生成第二跟踪数据。插入tcp报文的第一跟踪数据可用于其他应用节点生成第二跟踪数据,而各个节点的第二跟踪数据提交给分析模块之后,可以用于该tcp报文涉及的服务调用的链路精确以及简便跟踪。
附图说明
27.图1为本公开实施例提供的一种链路跟踪方法的流程示意图;
28.图2为本公开实施例提供的一种跟踪id的流程示意图;
[0029][0030]
图3为本公开实施例提供的一种未插入跟踪部分tcp报文的示意图;
[0031]
图4为本公开实施例提供的一种插入跟踪部分tcp报文的示意图;
[0032]
图5为本公开实施例提供的一种链路跟踪方法的流程示意图;
[0033]
图6为本公开实施例提供的一种链路跟踪方法的流程示意图;
[0034]
图7为本公开实施例提供的一种链路跟踪工作的示意图;
[0035]
图8为本公开实施例提供的一种链路跟踪方法的流程示意图;
[0036]
图9为本公开实施例提供的一种链路跟踪方法的流程示意图;
[0037]
图10为本公开实施例提供的一种链路跟踪方法的流程示意图;
[0038]
图11为本公开实施例提供的一种链路跟踪方法的流程示意图;
[0039]
图12为本公开实施例提供的一种链路跟踪方法的流程示意图;
[0040]
图13为本公开实施例提供的一种链路跟踪装置的结构示意图;
[0041]
图14为本公开实施例提供的一种链路跟踪装置的结构示意图;
[0042]
图15是本公开实施例提供的一种链路跟踪装置的结构示意图;
[0043]
图16是本公开实施例提供的一种电子设备的结构示意图。
具体实施方式
[0044]
为了能够更加详尽地了解本公开的特点与技术内容,下面结合附图对本公开的实现进行详细阐述,所附附图仅供参考说明之用,并非用来限定本公开。
[0045]
如图1所示,本公开实施例提供一种链路跟踪方法,由应用节点执行,包括:
[0046]
s110:利用集成在所述应用节点内核的代理模块,在所述tcp模块收发的tcp报文插入第一跟踪数据;
[0047]
s120:根据所述第一跟踪数据,生成并缓存第二跟踪数据;其中,所述第二跟踪数据,至少用于所述tcp报文对应的服务调用的链路跟踪;
[0048]
s130:当所述第二跟踪数据的状态满足第一条件时,将所述第二跟踪数据发送收集模块。
[0049]
该服务调用的链路跟踪可由使用分布式链路跟踪工具来实现。该服务调用可为微服务的分布式调用。
[0050]
该应用节点可使用linux系统或者linux系统的衍生系统,具有内核。一个所述应用节点可对应于一个物理机或者主机或者虚拟机。一个所述应用节点操作系统内核内部署有一个所述代理模块(agent)。
[0051]
在该内核具有tcp模块,该tcp模块专门复杂该应用节点的tcp报文的发送和接收。
[0052]
在本公开实施例中,该代理模块集成再服务器操作系统的内核内,如此,该代理模块不再是集成在需要监控的应用程序上。如此一个应用节点安装有多个应用程序时,可以通过该集成在内核上一个代理模块实现不用应用收发的tcp报文的埋点,此处的埋点即为:第一跟踪数据插入tcp报文。
[0053]
在本公开实施例中,该第一跟踪数据可至少包括:该服务调用的一个全局id和节点(span)id,即所述跟踪id。
[0054]
图2所示为一种跟踪id的组成。
[0055]
该跟踪id可包括以下几个部分中的一个或多个:
[0056]
第一部分,由跟踪id的生成时间戳构成;
[0057]
第二部分,由产生该跟踪id的设备id构成;
[0058]
第三部分,流水序列号,根据产生该跟踪id的设备当前已产生的跟踪id确定。
[0059]
在图2中一个跟踪id包括64比特;该64比特可包括:41个比特携带时间戳,该时间戳为生成该跟踪id的时间戳。该64个比特的10个比特携带设备id,且12个比特为流水序列号。
[0060]
在图2中跟踪id的最高位为保留位。
[0061]
当然以上仅仅是一种产生跟踪id的方式。
[0062]
所述节点id和跟踪id的产生方式可以相同或者类似。
[0063]
图3所示为一种tcp报文,tcp报文包括:tcp首部(header)以及tcp数据部分。
[0064]
tcp首部包括:源端口、目标端口、序号、确认号以及校验位等各种固定内容。
[0065]
tcp数据部分为tcp报文传输的数据内容。
[0066]
在本公开实施例中,代理模块会在tcp模块收发的tcp报文中插入第一跟踪数据。
[0067]
如图4所示,tcp报文被插入第一跟踪数据之后,在tcp头部(也即tcp首部)和tcp数据部分之间插入有跟踪部分。该跟踪部分至少包括第一跟踪数据。
[0068]
若本节点并非服务调用的首节点,则本节点会存在父节点。此时,第一跟踪数据可包括:跟踪id、节点id以及父节点id。
[0069]
所述第二跟踪数据包含所述第一跟踪数据,且被所述第一跟踪数据的数据量多。示例性地,第二跟踪数据会包含本节点的一些状态信息,从而方便后续对本节点的微服务的响应质量进行监控等。
[0070]
所述tcp报文中插入的第一跟踪数据的长度可为预先设置的。如图4所示,所述第一跟踪数据可包括32个比特。在具体的实现过程中,插入tcp报文的第一跟踪数据的长度不局限于上述32个比特。
[0071]
在本公开实施例中,该收集模块可与代理模块部署在同一个应用节点,也可以部署在不同的应用节点。在一个微服务的分布系统中,每一个应用节点可部署一个代理模块,而可以仅仅部分应用节点部署有收集模块。若未部署有收集模块(collector)的应用节点,将自身代理模块收集的第二跟踪数据发送给部署有收集模块的应用节点。
[0072]
在一些实施例中,代理模块可以实时上报自身缓存的所有第二跟踪数据,例如,代理模块一旦缓存有新的第二跟踪数据,就将新缓存的第二跟踪数据发送给收集模块。
[0073]
在一些实施例中,为了减少代理模块向收集模块发送的第二跟踪数据的数据量,会在缓存的第二跟踪数据满足第一条件时才上报,从而减少地理模块向收集模块的数据上报次数。
[0074]
在一些实施例中,所述利用集成在所述应用节点内核的传输控制协议tcp模块的代理模块,在所述 tcp模块收发的tcp报文插入第一跟踪数据,包括以下至少之一:
[0075]
利用集成在所述应用节点内核的传输控制协议tcp模块的代理模块,在包含启动指令的tcp报插入所述第一跟踪数据;
[0076]
利用集成在所述应用节点内核的传输控制协议tcp模块的代理模块,在包含发送指令的tcp报插入所述第一跟踪数据;
[0077]
利用集成在所述应用节点内核的传输控制协议tcp模块的代理模块,在包含接收指令的tcp报插入所述第一跟踪数据;
[0078]
利用集成在所述应用节点内核的传输控制协议tcp模块的代理模块,在包含停止指令的tcp报插入所述第一跟踪数据。
[0079]
tcp报文包括很多种,客户端和应用节点之间一次tcp交互,会涉及启动数据传输启动(start) 指令、终止数据传输的终止(end)指令、指示发送数据的发送(send)指令和指示接收数据的(rcv) 指令。
[0080]
在本公开实施例中,为了减少第一跟踪数据不必要的插入,仅仅会对携带上述4种指令的tcp报文内插入所述第一跟踪数据。
[0081]
在一些实施例中,所述当所述第二跟踪数据的状态满足第一条件时,将所述第二跟踪数据发送收集模块,包括:
[0082]
当所述第二跟踪数据的数据量达到第一数据量阈值时,将所述第二跟踪数据发送给所述收集模块;
[0083]
和/或,
[0084]
当所述第二跟踪数据的上一次上报时刻与当前时刻之间的时间间隔达到第一间隔周期时,将所述第二跟踪数据发送给所述收集模块。
[0085]
若按照缓存的数据量上报,则代理节点缓存的数据量达到第一数据量阈值时,跟踪节点向收集模块上报一次第二跟踪数据。
[0086]
若是周期性上报,则当前时刻相距于上一次上报的时间间隔已经达到一个上报周期,则会将尚未上报的第二跟踪数据发送给收集模块一次。
[0087]
在一些实施例中,所述根据所述第一跟踪数据,生成并缓存第二跟踪数据,包括:
[0088]
根据本节点的服务调用状况信息,生成包含所述第一跟踪数据以及服务调用状况信息的第二跟踪数据;
[0089]
缓存所述第二跟踪数据。
[0090]
所述服务调用状况信息包括但不限于:服务调用的时间戳,例如该时间戳的精度可到毫秒或者微秒级别。
[0091]
代理模块本地缓存的是第二跟踪数据,而第一跟踪数据是插入到tcp报文中的数据。
[0092]
在一些实施例中,所述缓存所述第二跟踪数据,包括:
[0093]
利用双向队列缓存所述第二跟踪数据。
[0094]
代理模块可以使用各种队列缓存所述第二跟踪数据,例如,先进先出队列、先进后出队列和/或双向队列。由于双向队列的队尾和对首都可以操作,如此,使用双向队列缓存第二跟踪数据,方便后续代理模块对双向队列中的第二跟踪数据的处理。
[0095]
在一些实施例中,所述当所述第二跟踪数据的状态满足第一条件时,将所述第二跟踪数据发送收集模块,包括:
[0096]
当所述第二跟踪数据的状态满足所述第一条件时,根据协议缓存序列划化协议,生成所述第二跟踪数据的数据序列;
[0097]
将压缩后的所述数据序列发送给所述收集模块。
[0098]
示例性地,根据缓存协议(protocol buffer)将第二跟踪数据转换为protobuf序列,将为protobuf序列发送收集模块。protobuf序列具有序列化速度快,序列化之后的数据量少等特点。
[0099]
在一些实施例中,所述方法还包括:
[0100]
接收所述收集模块发送的采样配置信息,其中,所述采样配置信息至少包括:采样频率;
[0101]
所述利用集成在所述应用节点内核的传输控制协议tcp模块的代理模块,在所述tcp模块收发的 tcp报文插入第一跟踪数据,包括:
[0102]
利用集成在所述应用节点内核的传输控制协议tcp模块的代理模块,根据所述采样频率拦截所述 tcp模块收发的tcp报文;
[0103]
并在拦截的所述tcp报文中插入第一跟踪数据。
[0104]
例如,假设采用频率为1000,则所述代理模块在tcp模块收发1000个tcp报文中拦截一个tcp报文,然后插入第一跟踪数据。
[0105]
在本公开实施例中,代理模块是可以根据收集模块下发的采样配置信息进行tcp报文埋点频率的动态调整的。
[0106]
示例性地,所述第一跟踪数据至少包括:跟踪标识id以及节点id。
[0107]
又示例性地,所述第一跟踪数据还包括父节点标识。
[0108]
在一些实施例中,所述第二跟踪数据包括所述第一跟踪数据,还包括以下至少之一:所述tcp报文所涉及操作的操作名称;节点标签;本节点主机的网络协议ip地址;时间戳;链路的日志事件;日志信息;进程标识;所述tcp报文的长度。
[0109]
此处的时间戳为:服务调用在本节点中本节点响应的时间戳。
[0110]
该tcp报文的长度可为:不包含插入的第一跟踪数据的报文长度。
[0111]
示例性地,第二跟踪数据具体包含的内容可如表1所示的一项或多项。
[0112]
[0113][0114]
在一些实施例中,所述方法还包括:
[0115]
若所述第二跟踪数据包括敏感数据,在将所述第二跟踪数据发送给所述收集模块之前,加密所述敏感数据。
[0116]
示例性地,所述敏感数据可包括但不限于用户的个人数据等。利用对称加密或者非对称加密的方式加密所述第二跟踪数据中的敏感数据,如此敏感数据的保护。
[0117]
如图5所示,本公开实施例提供一种链路跟踪方法,由包含收集模块的电子设备执行,包括:
[0118]
s210:接收到集成在应用节点内核的代理模块发送的第二跟踪数据之后,对所述第二跟踪数据进行完整性校验;
[0119]
s220:缓存通过所述完整性校验的所述第二跟踪数据并将通过所述完整性校验的第二跟踪数据发送给分析模块,其中,所述收集模块缓存的所述第二跟踪数据,所述第二跟踪数据,至少用于所述tcp报文对应的服务调用的链路跟踪。
[0120]
本公开实施例的执行设备为包含收集模块的电子设备。
[0121]
该收集模块会接收集成应用节点内核的代理模块发送的第二跟踪数据,并对第二跟踪数据进行完成性校验,在完成校验之后缓存并发送给分析模块。
[0122]
分析模块,可至少分析tcp报文对应地服务调用的链路。
[0123]
该分析模块可以与收集模块位于同一个电子设备上,也可以是与所述收集模块部署在不同的电子设备上的模块。
[0124]
通过完整性校验,可以确保从代理模块接收的数据未被篡改,从而确保链路跟踪的正确性和精确性。
[0125]
在一些实施例中,所述方法还包括:
[0126]
丢弃未通过所述完整性校验的所述第二跟踪数据。
[0127]
即未通过完整性校验的第二跟踪数据是会被收集模块丢弃的脏数据,从而减少脏数据对链路跟踪的准确度和精确度的影响。
[0128]
在一些实施例中,所述方法还包括:
[0129]
当缓存的所述第二跟踪数据的状态达到第二条件时,将所述收集模块缓存的第二跟踪数据写入存储模块。
[0130]
当收集模块缓存一定量的第二跟踪数据之后,会将第二跟踪数据写入到存储模块,该存储模块可将第二跟踪数据持久化,示例性地,存储模块接收到该第二跟踪数据之后,将第二跟踪数据分布式存储到多个节点的数据库中。
[0131]
若将第二跟踪数据持久化,方便后续再次查看。
[0132]
在一些实施例中,所述当缓存的所述第二跟踪数据的状态达到第二条件时,将所述收集模块缓存的第二跟踪数据写入存储模块,包括以下至少之一:
[0133]
当所述第二跟踪数据的数据量达到第二数据量阈值时,将所述第二跟踪数据写入存储模块;
[0134]
和/或,
[0135]
当所述第二跟踪数据的上一次上报时刻与当前时刻之间的时间间隔达到第二间隔周期时,将所述第二跟踪数据写入存储模块。
[0136]
示例性地,所述第二数据量阈值可大于前述的第一数据量阈值,所述第二间隔周期可等于或大于前述第一间隔周期。
[0137]
总之,在本公开实施例中,所述收集模块缓存和写入到存储模块的第二跟踪数据都是经过完整性校验的数据。
[0138]
如图6所示,本公开实施例提供一种链路跟踪方法,由包含分析模块的电子设备执行,包括:
[0139]
s310:接收收集模块发送的第二跟踪数据,其中,所述第二跟踪数据是集成在应用节点内核的代理模块生成的;
[0140]
s320:根据所述第二跟踪数据,生成一个跟踪id指代的服务调用的链路的拓扑图。
[0141]
在一些实施例中,所述方法还包括:
[0142]
s330:根据所述拓扑图,得到所述服务调用的链路的dag。
[0143]
本公开实施例由部署有分析模块的电子设备执行。
[0144]
分析模块和收集模块可以部署在相同的电子设备(例如,应用节点)上,也可以部署在不同的电子设备上。
[0145]
总之,在本公开实施例中分析模块会接收收集模块发送的第二跟踪数据。然后该第二根据数据是由集成在应用节点内核上的代理模块生成的。
[0146]
分析模块收到第二跟踪数据之后,会根据跟踪id指代(涉及)的服务调用的调用两路的拓扑图。
[0147]
此处的拓扑图可为服务调用对应的调用链对应的应用节点之间的拓扑关系图。
[0148]
通过拓扑图的确定,可以知晓服务调用的调用链的链路跟踪。
[0149]
分析模块得到该拓扑图之后,进一步进行转换为dag。
[0150]
在一些实施例中,所述方法根据所述拓扑图,得到所述服务调用的链路的有向无环图dag,包括:
[0151]
当一个所述跟踪id涉及多个所述拓扑图时,将多个所述拓扑图聚合成一个有向无环图dag。
[0152]
若根据同一个跟踪id的第二跟踪数据分析出多个拓扑图时,根据多个拓扑图中节点之间的依赖关系和/或连接关系等,将多个拓扑图聚合成一个拓扑图,进而得到一个跟踪id对应的服务调用链路的dag。
[0153]
在一些实施例中,所述根据所述第二跟踪数据,生成一个跟踪id指代的服务调用的链路的拓扑图,包括:
[0154]
根据所述第二跟踪数据的跟踪id进行分组,得到同一个所述跟踪id的第二跟踪数据;
[0155]
根据所述同一个所述跟踪id的第二跟踪数据包含的节点标识和父节点标识,生成所述跟踪id对应的链路涉及的调用节点的拓扑图。
[0156]
从服务调用涉及的第二应用节点开始,则同一个跟踪id的第二跟踪数据总不仅会包括跟踪id,还会包括节点id(即本节点id)以及父节点id,如此可以根据本节点id和父节点id构建出拓扑图。
[0157]
在一些实施例中,所述方法还包括以下至少之一:
[0158]
根据所述拓扑图,将不同节点之间的调用关系信息写入跟踪表;
[0159]
根据所述拓扑图,将不同节点之间的依赖关系信息写入依赖表;
[0160]
根据所述第二跟踪数据,将节点的指标数据写入指标表;
[0161]
根据所述第二跟踪数据,将节点的日志数据写入日志表。
[0162]
在进行链路跟踪的同时,可以进一步根据拓扑图得到服务调用的调用关系信息写入到跟踪表,方便后续查询。
[0163]
将节点自身之间的依赖关系和/或反映业务之间依赖关系的节点之间的依赖关系写入到依赖表。
[0164]
不同的应用节点具有不同的工作性能,这些性能可以由指标数据来反映,因此可以根据第二跟踪数据中包含的指标数据,将对对应节点的指标数据写入指标表。
[0165]
在还有一实施例中,第二跟踪数据还可能包括日志数据,可以将日志数据写入日志表。
[0166]
参考图7和图8所示,skywalking为代表的opentracing的标准的链路均采用了基于标注的方案。它依赖于应用程序或中间件明确地标记一个所有服务全局id(也即前述的跟踪id),借此将一串请求关联起来。相比于黑盒模式,该方案不需要依赖统计推理,挺高了服务调用依赖的准确性。skywalking的链路实现方案有四部分组成:(1)数据收集模块(agent):通过跟踪依赖探针技术收集根据数据。
[0167]
(2)数据传输模块(也即收集模块,collector):通过kafka、grpc、http传输到skywalking reveiver 模块。
[0168]
(3)数据解析和分析模块(也简称分析模块,(flink jobs)):oap系统进行数据解析和分析。
[0169]
(4)数据存储模块(例如,数据库(data base,db)或者缓存(bookie):后端接口支持多种存储实现,例如es、mysql等。
[0170]
(5)用户界面(user interface,ui)模块:通过graphql进行查询,然后通过vue搭建的前端进行展示。
[0171]
本公开实施例本公开实施例本公开实施例提案提出了一种基于内核埋点实现的无侵入的分布式链路追踪的方法。
[0172]
本公开实施例所设计的总体架构图,如图8和图9所示:
[0173]
tcp协议实现的链路方案分为4个部分,各部分模块功能介绍如下:
[0174]
agent:安装在宿主机上,实现了tcp层的埋点、trace数据上报和采样率的动态调整。
[0175]
collector:可以实现水平扩展的数据接收模块,实现了trace数据格式校验。
[0176]
flink jobs:通过flink集群实现trace数据的聚合计算,聚合结果按照链路结果、
链路metrics结果以及依赖拓扑结果存储到db中。
[0177]
ui:提供三个视图,一、链路视图根据服务实例查看链路的整体视图,包含trace轨迹图、span之间的层级关系和每个span的相关信息。二、依赖拓扑图展示每个服务实例的拓扑依赖关系。三、性能指标视图,展示各个服务实例的各类性能指标。
[0178]
本公开实施例中的agent模块的集成在linux的内核(kernel)中,会在tcp协议的请求和响应中进行埋点/
[0179]
如图9显示。对于每个tcp请求和响应,agent都会进行埋点操作。当请求进入到kernel的tcp接收模块后,agent会拦截到这条请求,这里只需针对start/send/rcv/end四个指令实施埋点操作。图 9中展示有三个主机或者容器在响应服务调用(request)时的示意图。显然各个主机或者容器都部署有代理模块,且代理模块是部署在内核内。
[0180]
满足该条件后获取到tcp的头部,tcp报文头的数据格式定义如图3所示,然后agent通过在选项中添加不超过40个字节的跟踪相关的数据已达到埋点的作用。本对应选项部分不超过40个字节的空间,本公开实施例设计了一种数据格式已达到实现埋点的效果也不至于过多增加报文的大小,具体设计如图4 所示。
[0181]
跟踪(trace)id和节点(span)id,可均通过snowflake算法生成,snowflake算法生成的64位id =1位符号位+41位时间戳+10位机器id+12位序列。id的组成结构如图2所示。
[0182]
agent接收到调用请求后会解析tcp头中跟踪部分数据,查看traceid和span id。
[0183]
如果不存在,则通过snowflake算法生成出跟踪(trace)id和节点(span)id插入到tcp报文头中,同时生成一份埋点数据上报到collector模块,数据格式按照图8格式定义。在发送tcp报文前,agent 在组成tcp报文前,依然会将traceid、spanid、parentspanid插入到报文头中传递给下一个节点,同时按照表1的数据格式发送数据到collector模块中。
[0184]
跟踪数据中时间戳(timestamp)代表当前机器的时间戳,跟踪(trace)id和节点(span)id、父节点(span)id是tcp报文头中的跟踪部分数据。
[0185]
进程(process)id是内核态tcp模块接收或者发送到用户态的进程id,threadid是内核态tcp模块接收或者发送到用户态的线程id,operationname是tcp对应的指令操作,只包括start/send/rcv/end 四个指令,host是指所在主机的ip,msgsize是指当次tcp传输的报文大小,tags是一个map数据格式用于存储补充的标签内容,logs用于保存发生链路异常是的日志信息,包含发生时间和具体时间描述。
[0186]
agent端通过protobuf序列化方式对跟踪数据进行压缩序列化发送到collector端,针对日志(logs) 中的敏感数据采用aes非对称加密算法实现加密。同时在agent的发送端设计了一个双向队列用于缓存待发送的跟踪数据,通过设置一个时间窗口和大小窗口,两者谁先满足就会触发一次数据上报,agent会对每一批次的trace数据通过zlib的压缩算法实现一次压缩以减少网络传输的数据量。
[0187]
agent中的采样率配置可以通过接受collector的指令下发来实现动态改变。例如采样率设置成了 1/1000,agent会在会在这一时刻后的一次tcp请求或者中实现tcp报文头的埋点和上报trace数据到 collector模块,后续的相同process id产生的999次tcp请求或者响应将不再埋点。当接受到新的采样率后,重新进行tcp报文头埋点和上报trace数据,丢弃的报文数量重新计算。
[0188]
图10是收集模块(collector)的组成架构图。收集模块模块被设计成计算和存储
分离的无状态的组件,因此理论上可以实现无限水平扩展的,支持独立部署和通过k8s实现collector的部署。
[0189]
分配器(dispatcher)由统一负责对外的消息接收和发送tcp模块和用于管理服务内部配置的http 模块组成。
[0190]
tcp模块主要用于接收agent上报的跟踪数据和下发采样率的控制指令,完成压缩数据的解压缩处理。
[0191]
http模块主要用于collector集群的管理接口,包括跟踪数据的保留周期,副本数以及采样率的设置等。
[0192]
首先ledger会校验上报的trace数据的格式和必填项是否完整,会丢弃不完整的trace数据。
[0193]
出于性能的考虑,消息会被分发到ledger上缓存,当缓存的消息数达到一定数据会通过bk client 持久化到bookie集群中。然后每个实例中会有个定时调度的任务负责ledger上缓存数据的副本创建。采用控制器(sampling controller)是用于调整agent的采样率的配置模块,可以通过dispatcher接收到前端发出的修改请求然后再通过tcp模块下发到所有的agent上。
[0194]
图11展示了收集模块(collector)模块完成trace数据上报的完整的数据时序关系。
[0195]
首先,dispatcher中的tcp模块启动一个tcp监听的端口。
[0196]
然后接收到agent上报的trace数据完成解压后分发给ledger模块。
[0197]
ledger完成trace数据的完整性校验,如果校验失败直接丢弃数据,校验成功后缓存到缓存模块,等一个批次的数据条数窗口和时间窗口(只需满足其一)后完成批次数据写入到bookie中,然后通过异步的方式返回结果给agent。
[0198]
分析模块(例如,flink jobs),
[0199]
为了实现对实时跟踪数据的链路分析和拓扑分析,本公开实施例采用了flink实时计算引擎。这里将 collector消费端设置成flink任务的source,此时trace数据就会不断地从collector流向flink任务。
[0200]
datastream《iterable《span》》traces=spans
[0201]

.filter((filterfunction《span》)span-》span.isclient()||span.isserver())
[0202]
.name(filter_local_spans)
[0203]

.keyby((keyselector《span,string》)span-》string
[0204]
.format("%d:%d",span.gettraceidhigh(),span.gettraceidlow()))
[0205]

.window(eventtimesessionwindows.withgap(time.minutes(3)))
[0206]

.apply(new spantotracewindowfunction()).name(spans_to_traces)
[0207]

.map(new adjusterfunction《》()).name(dedupe_span_ids)
[0208]

.map(new countspansandloglargetraceidfunction()).name(count_spans);
[0209]

datastream《dependency》 dependencies=traces .flatmap(new tracetodependencies()).name(trace_to_dependencies).keyby(key-》key.getparent()+ key.getchild()).timewindow(time.minutes(30)).sum("callcount").name
(preaggregate_dependencie s);
[0210]
filter((filterfunction《span》)span-》span.isclient()||span.isserver())只保留有client或server标签的 span。
[0211]
keyby((keyselector《span,string》)span-》string.format("%d:%d",span.gettraceidhigh(), span.gettraceidlow()))-基于traceidhigh和traceidlow的组合将span数据分组。
[0212]
window(eventtimesessionwindows.withgap(time.minutes(3)))-为每个trace创建一个gap为3分钟的会话窗口。表示对于某个trace,如果3分钟内没有新的span数据到达,就认为窗口结束,进而触发后续的聚合操作。
[0213]
spantotracewindowfunction-负责将会话窗口里的节点数据收集到一起。一个节点的节点(span) 数据包括一个节点的第二跟踪数据。
[0214]
adjusterfunction负责去除一个trace里的重复span。
[0215]
countspansandloglargetraceidfunction以10秒为单位,统计span数量随时间的分布;
[0216]
flatmap(new tracetodependencies())-遍历一个trace的所有span数据,收集该trace表征的拓扑关系。keyby(key-》key.getparent()+key.getchild())-将具有相同父子关系的dependency分到一组。
[0217]
timewindow(time.minutes(30)).sum("callcount")-为每对依赖关系创建一个30分钟的时间窗口,窗口结束触发计数操作。
[0218]
这里将es设置为flink任务的sink,当依赖关系因满足时间窗口的触发条件被计算完毕后,将以 dependencies(ts,ts_index,dependencies)的形式持久化到es中。
[0219]
图12描述了flink job,根据跟踪(trace)数据,最终汇聚成调用拓扑关系的过程。
[0220]
首先,flink任务从collector按照protobuf序列化方式不断的消费数据按照traceid进行分组;
[0221]
然后,根据spanid和parentspanid计算每个跟踪id的调用拓扑图;
[0222]
最后,将每个trace的拓扑图汇聚成dag图。还会将trace调用关系写入trace表中,依赖拓扑关系写入到依赖(dependency)表中,每个节点的指标数据写入到指标(metrics)表中。
[0223]
每个节点(span)的日志(log)数据写入到日志表中。
[0224]
在写入日志表之前会对敏感数据做解密处理。
[0225]
本公开实施例会计算出两个节点存在的竞争的关系,通过跟踪数据中的ip字段可以轻松知道不同的节点中的竞争关系的节点,通过flink job计算可以在最终的拓扑图上呈现出这一关系,并且会有竞争关系节点的指标(metrics)展示。这一功能将很好的用于分析异常的根本原因,可能是应为同一主机的资源竞争导致其他链路中的某一节点出现故障。
[0226]
ui展示通过根据flink job计算出来的跟踪(trace)表、依赖(dependency)表以及指标(metrics) 表,从而展示不同维度的链路的视图。
[0227]
本公开实施例提出的一种基于内核埋点实现的无侵入的分布式链路追踪的方法,具体如下:
[0228]
通过在内核(kernel)中tcp模块的发送和接收模块的埋点实现的对应用无侵入方式的链路追踪,利用tcp模块能够获取到用户态的相关标签内容以及ip层的相关数据完成了trace数据的封装和上报,这一点是以往的分布式追踪系统未考虑和涉及的。
[0229]
通过在收集(collector)模块中添加采样控制(sampling control)可以实现动态接收用户对于采样率的设置,然后通过广播方式下发指令到agent模块实现采样率的动态实时修改。然后agent模块根据采样率的设置对于无需上报的trace数据不再进行tcp头部的设置以减小tcp数据的传输量,对于tcp传输副作用小。这一设计在skywalking为代表的的opentracing的方案中考虑不全面。
[0230]
通过flink jobs计算出单一跟踪链中的节点调用关系的同时也将同一主机或者容器的竞争关系加入到最终的拓扑展示中,这在做根因分析的时候将提升问题定界的准确性,这一设计在以往的分布式追踪系统中均为考虑和涉及到。
[0231]
通过对跟踪数据中的敏感字段做加密处理,这样在传输过程中及时被拦截到也不能获取到敏感字段的信息。
[0232]
对于应用无侵入,虽然skywalking对于java语言开发的应用通过字节码增强技术能够实现较低的侵入性,只需添加agent的jar包和启动应用时添加agent的相关配置,但是依然需要修改应用的启动方式和重启应用。本公开实施例只需在需要追踪的应用节点上安装tcp层的agent服务即可完成应用埋点和trace 数据上报。
[0233]
动态修改采样率,skywalking仅仅能够支持应用启动前的采样率设置,不能实时接收上层下发的采样率设置,造成了在业务流量较大时的性能占用,可能会影响到到业务。本公开实施例通过建立collector 模块和agent模块的采样率的控制指令广播机制实现了采样率的动态配置,另外agent模块的采样率的生效方式,及通过是否在tcp头部加入trace数据来实现是否采样大大降低了数据传输的大小,对业务的影响大大降低。
[0234]
竞争关系的拓扑呈现,本公开实施例在skywalking的拓扑展示图的基础上增加了竞争关系的展示和竞争关系的metrics统计显示,以至于在做故障定位和根因分析时提供了有力的依据,能够提供问题分析的准确性。
[0235]
敏感数据的加密处理,本公开实施例在埋点上报阶段通过aes非对称加密算法实现了数据加密传输,保障了数据的安全性。
[0236]
如图13所示,本公开实施例提供一种链路跟踪装置,包括:
[0237]
插入模块110,被配置为利用集成在所述应用节点内核的代理模块,在所述tcp模块收发的tcp报文插入第一跟踪数据;
[0238]
第一生成模块120,被配置为根据所述第一跟踪数据,生成并缓存第二跟踪数据;其中,所述第二跟踪数据,至少用于所述tcp报文对应的服务调用的链路跟踪;
[0239]
第一发送模块130,被配置为当所述第二跟踪数据的状态满足第一条件时,将所述第二跟踪数据发送收集模块。
[0240]
在一些实施例中,该链路跟踪装置可为包含代理模块的应用节点。
[0241]
在一些实施例中,插入模块110、第一生成模块120以及第一发送模块130可为程序模块;所述程序模块被处理器执行之后,能够实现上述操作。
[0242]
在一些实施例中,插入模块110、第一生成模块120以及第一发送模块130可为软硬结合模块;所述软硬结合模块包括但限于各种可编程阵列;所述可编程阵列包括但不限于:
现场可编程阵列和/或复杂可编程阵列。
[0243]
在一些实施例中,插入模块110、第一生成模块120以及第一发送模块130可为纯硬件模块;所述纯硬件模块包括但不限于专用集成电路。
[0244]
在一些实施例中,所述插入模块110,被配置为执行以下至少之一:
[0245]
利用集成在所述应用节点内核的传输控制协议tcp模块的代理模块,在包含启动指令的tcp报插入所述第一跟踪数据;
[0246]
利用集成在所述应用节点内核的传输控制协议tcp模块的代理模块,在包含发送指令的tcp报插入所述第一跟踪数据;
[0247]
利用集成在所述应用节点内核的传输控制协议tcp模块的代理模块,在包含接收指令的tcp报插入所述第一跟踪数据;
[0248]
利用集成在所述应用节点内核的传输控制协议tcp模块的代理模块,在包含停止指令的tcp报插入所述第一跟踪数据。
[0249]
在一些实施例中,所述第一发送模块130,用于当所述第二跟踪数据的数据量达到第一数据量阈值时,将所述第二跟踪数据发送给所述收集模块;和/或,
[0250]
当所述第二跟踪数据的上一次上报时刻与当前时刻之间的时间间隔达到第一间隔周期时,将所述第二跟踪数据发送给所述收集模块。
[0251]
在一些实施例中,所述生成模块,用于根据本节点的服务调用状况信息,生成包含所述第一跟踪数据以及服务调用状况信息的第二跟踪数据;
[0252]
所述装置还包括:
[0253]
第一缓存模块,用于缓存所述第二跟踪数据。
[0254]
在一些实施例中,所述第一缓存模块,具体用于利用双向队列缓存所述第二跟踪数据。
[0255]
在一些实施例中,所述第一发送模块130,用于当所述第二跟踪数据的状态满足所述第一条件时,根据协议缓存序列划化协议,生成所述第二跟踪数据的数据序列;将压缩后的所述数据序列发送给所述收集模块。
[0256]
在一些实施例中,所述装置还包括:
[0257]
第一接收模块,被配置为接收所述收集模块发送的采样配置信息,其中,所述采样配置信息至少包括:采样频率;
[0258]
所述插入模块110,被配置为利用集成在所述应用节点内核的传输控制协议tcp模块的代理模块,根据所述采样频率拦截所述tcp模块收发的tcp报文;
[0259]
并在拦截的所述tcp报文中插入第一跟踪数据。
[0260]
在一些实施例中,所述第一跟踪数据至少包括:跟踪标识id以及节点id。
[0261]
在一些实施例中,所述第一跟踪数据还包括父节点标识。
[0262]
在一些实施例中,所述第二跟踪数据包括所述第一跟踪数据,还包括以下至少之一
[0263]
所述tcp报文所涉及操作的操作名称;
[0264]
节点标签;
[0265]
本节点主机的网络协议ip地址;
[0266]
时间戳;
[0267]
链路的日志事件;
[0268]
日志信息;
[0269]
进程标识;
[0270]
所述tcp报文的长度。
[0271]
在一些实施例中,所述第一发送模块130,还用于若所述第二跟踪数据包括敏感数据,在将所述第二跟踪数据发送给所述收集模块之前,加密所述敏感数据。
[0272]
如图14所示,本公开实施例提供一种链路跟踪装置,包括:
[0273]
第二接收模块210,用于接收到集成在应用节点内核的代理模块发送的第二跟踪数据之后,对所述第二跟踪数据进行完整性校验;
[0274]
第二缓存模块220,用于缓存通过所述完整性校验的所述第二跟踪数据并将通过所述完整性校验的第二跟踪数据发送给分析模块,其中,所述收集模块缓存的所述第二跟踪数据,所述第二跟踪数据,至少用于所述tcp报文对应的服务调用的链路跟踪。
[0275]
在一些实施例中,该链路跟踪装置可为包含收集模块的电子设备。
[0276]
在一些实施例中,第二接收模块210以及第二缓存模块220可为程序模块;所述程序模块被处理器执行之后,能够实现上述操作。
[0277]
在一些实施例中,第二接收模块210以及第二缓存模块220可为软硬结合模块;所述软硬结合模块包括但限于各种可编程阵列;所述可编程阵列包括但不限于:现场可编程阵列和/或复杂可编程阵列。
[0278]
在一些实施例中,第二接收模块210以及第二缓存模块220可为纯硬件模块;所述纯硬件模块包括但不限于专用集成电路。
[0279]
在一些实施例中,所述装置还包括:
[0280]
丢弃模块,用于丢弃未通过所述完整性校验的所述第二跟踪数据。
[0281]
在一些实施例中,所述装置还包括:
[0282]
第二发送模块,用于当缓存的所述第二跟踪数据的状态达到第二条件时,将所述收集模块缓存的第二跟踪数据写入存储模块。
[0283]
在一些实施例中,所述第二发送模块,具体用于执行以下至少之一:
[0284]
当所述第二跟踪数据的数据量达到第二数据量阈值时,将所述第二跟踪数据写入存储模块;
[0285]
和/或,
[0286]
当所述第二跟踪数据的上一次上报时刻与当前时刻之间的时间间隔达到第二间隔周期时,将所述第二跟踪数据写入存储模块。
[0287]
如图15所示,本公开实施例提供一种链路跟踪装置包括:
[0288]
第三接收模块310,用于接收收集模块发送的第二跟踪数据,其中,所述第二跟踪数据是集成在应用节点内核的代理模块生成的;
[0289]
第二生成模块320,用于根据所述第二跟踪数据,生成一个跟踪id指代的服务调用的链路的拓扑图。
[0290]
在一些实施例中,该链路跟踪装置可为包含分析模块的电子设备。
[0291]
在一些实施例中,第三接收模块310以及第二生成模块320可为程序模块;所述程序模块被处理器执行之后,能够实现上述操作。
[0292]
在一些实施例中,第三接收模块310以及第二生成模块320可为软硬结合模块;所述软硬结合模块包括但限于各种可编程阵列;所述可编程阵列包括但不限于:现场可编程阵列和/或复杂可编程阵列。
[0293]
在一些实施例中,第三接收模块310以及第二生成模块320可为纯硬件模块;所述纯硬件模块包括但不限于专用集成电路。
[0294]
在一些实施例中,所述装置还包括:
[0295]
聚合模块,用于当一个所述跟踪id涉及多个所述拓扑图时,将多个所述拓扑图聚合成一个有向无环图dag。
[0296]
在一些实施例中,所述第二生成模块320,具体用于根据所述第二跟踪数据的跟踪id进行分组,得到同一个所述跟踪id的第二跟踪数据;根据所述同一个所述跟踪id的第二跟踪数据包含的节点标识和父节点标识,生成所述跟踪id对应的链路涉及的调用节点的拓扑图。
[0297]
在一些实施例中,所述装置还包括处理模块,用于执行以下至少之一:
[0298]
根据所述拓扑图,将不同节点之间的调用关系信息写入跟踪表;
[0299]
根据所述拓扑图,将不同节点之间的依赖关系信息写入依赖表;
[0300]
根据所述第二跟踪数据,将节点的指标数据写入指标表;
[0301]
根据所述第二跟踪数据,将节点的日志数据写入日志表。
[0302]
如图16所示,本公开实施例提供一种电子设备,所述电子设备包括:
[0303]
存储器;
[0304]
处理器,与所述存储器连接,用于通过执行存储在所述存储器上的计算机可执行指令,能够实现前述任意实施例提供的链路跟踪方法,例如执行如图1、图5、图6至图12任意所示的链路跟踪方法。
[0305]
该电子设备可为终端设备和/或服务平台中的服务器。
[0306]
如图16所示,该电子设还可包括网络接口,该网络接口可用于通过网络和对端设备进行交互。
[0307]
本公开实施例提供一种计算机存储介质,所述计算机存储介质存储有计算机可执行指令;所述计算机可执行指令被处理器执行后,能够实现前述任意实施例提供的链路跟踪方法,例如执行如图1、图5、图6至图12任意所示的链路跟踪方法。
[0308]
该计算机存储介质为非瞬间存储介质。
[0309]
本公开实施例所记载的技术方案之间,在不冲突的情况下,可以任意组合。
[0310]
在本公开所提供的几个实施例中,应该理解到,所揭露的方法和智能设备,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
[0311]
上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元,即可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。
[0312]
另外,在本公开各实施例中的各功能单元可以全部集成在一个第二处理单元中,也可以是各单元分别单独作为一个单元,也可以n个或n个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
[0313]
以上所述,仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本公开的保护范围之内。

技术特征:
1.一种链路跟踪方法,其特征在于,由应用节点执行,包括:利用集成在所述应用节点内核的代理模块,在传输控制协议tcp模块收发的tcp报文插入第一跟踪数据;根据所述第一跟踪数据,生成并缓存第二跟踪数据;其中,所述第二跟踪数据,至少用于所述tcp报文对应的服务调用的链路跟踪;当所述第二跟踪数据的状态满足第一条件时,将所述第二跟踪数据发送收集模块。2.根据权利要求1所述的方法,其特征在于,所述根据所述第一跟踪数据,生成并缓存第二跟踪数据,包括:根据本节点的服务调用状况信息,生成包含所述第一跟踪数据以及服务调用状况信息的第二跟踪数据;缓存所述第二跟踪数据。3.根据权利要求1或2所述的方法,其特征在于,所述方法还包括:接收所述收集模块发送的采样配置信息,其中,所述采样配置信息至少包括:采样频率;所述利用集成在所述应用节点内核的代理模块,在所述tcp模块收发的tcp报文插入第一跟踪数据,包括:利用集成在所述应用节点内核的代理模块,根据所述采样频率拦截所述tcp模块收发的tcp报文;并在拦截的所述tcp报文中插入第一跟踪数据。4.根据权利要求1所述的方法,其特征在于,所述方法还包括:若所述第二跟踪数据包括敏感数据,在将所述第二跟踪数据发送给所述收集模块之前,加密所述敏感数据。5.一种链路跟踪方法,其特征在于,由包含收集模块的电子设备执行,包括:接收到集成在应用节点内核的代理模块发送的第二跟踪数据之后,对所述第二跟踪数据进行完整性校验;缓存通过所述完整性校验的所述第二跟踪数据并将通过所述完整性校验的第二跟踪数据发送给分析模块,其中,所述收集模块缓存的所述第二跟踪数据,所述第二跟踪数据,至少用于所述tcp报文对应的服务调用的链路跟踪。6.一种链路跟踪方法,其特征在于,由包含分析模块的电子设备执行,包括:接收收集模块发送的第二跟踪数据,其中,所述第二跟踪数据是集成在应用节点内核的代理模块生成的;根据所述第二跟踪数据,生成一个跟踪id指代的服务调用的链路的拓扑图。7.根据权利要求6所述的方法,其特征在于,所述方法还包括:当一个所述跟踪id涉及多个所述拓扑图时,将多个所述拓扑图聚合成一个有向无环图dag。8.一种链路跟踪装置,其特征在于,包括:插入模块,被配置为利用集成在所述应用节点内核的代理模块,在所述tcp模块收发的tcp报文插入第一跟踪数据;第一生成模块,被配置为根据所述第一跟踪数据,生成并缓存第二跟踪数据;其中,所
述第二跟踪数据,至少用于所述tcp报文对应的服务调用的链路跟踪;第一发送模块,被配置为当所述第二跟踪数据的状态满足第一条件时,将所述第二跟踪数据发送收集模块。9.一种电子设备,其特征在于,所述电子设备包括:存储器;处理器,与所述存储器连接,用于通过执行存储在所述存储器上的计算机可执行指令,能够实现权利要求1至4、5或6至7任一项提供的链路跟踪方法。10.一种计算机存储介质,其特征在于,所述计算机存储介质存储有计算机可执行指令;所述计算机可执行指令被处理器执行后,能够实现权利要求1至4、5或6至7任一项提供的链路跟踪方法。

技术总结
本公开公开了一种链路跟踪方法及装置、电子设备及存储介质。由应用节点执行的链路跟踪方法可包括:利用集成在所述应用节点内核的传输控制协议TCP模块的代理模块,在所述TCP模块收发的TCP报文插入第一跟踪数据;根据所述第一跟踪数据,生成并缓存第二跟踪数据;其中,所述第二跟踪数据,至少用于所述TCP报文对应的服务调用的链路跟踪;当所述第二跟踪数据的状态满足第一条件时,将所述第二跟踪数据发送收集模块。集模块。集模块。


技术研发人员:黄海波
受保护的技术使用者:中国移动通信集团有限公司
技术研发日:2022.07.04
技术公布日:2023/9/23
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

航空商城 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

评论

相关推荐