程序调用追踪方法、装置以及存储介质与流程

文档序号:24426670发布日期:2021-03-26 23:09阅读:52来源:国知局
程序调用追踪方法、装置以及存储介质与流程

1.本公开涉及计算机技术领域,尤其涉及一种程序调用追踪方法、装置以及存储介质。


背景技术:

2.随着业务系统的复杂和微服务化,很多业务系统都按照功能进行拆分,每个拆分后的业务系统通常进行分布式部署,此中情况为系统间的跨进程的调用链监控加大了复杂度。目前,现有技术中缺少对于实例内以及跨进程调用的调用链监控技术方案。


技术实现要素:

3.有鉴于此,本发明要解决的一个技术问题是提供一种程序调用追踪方法、装置以及存储介质。
4.根据本公开的第一方面,提供一种程序调用追踪方法,包括:使用前置编译器对源程序代码进行初次编译,在所述源程序代码中获取织入点以及与被监控方法相对应的追踪声明信息;基于所述追踪声明信息生成与所述被监控方法相对应的追踪织入方法,使用织入器将所述追踪织入方法织入在所述织入点;使用后置编译器对织入所述追踪织入方法的初次编译代码进行再次编译,生成与所述源程序代码相对应的编译文件;在所述编译文件运行时,获取与所述追踪织入方法相对应的实例线程,生成与所述实例线程相对应的追踪标识号;通过所述追踪织入方法获取与所述被监控方法相对应的监控信息,基于所述追踪标识号对所述监控信息进行关联处理,生成与所述实例线程相对应的调用链信息。
5.可选地,所述在所述源程序代码中获取织入点以及与被监控方法相对应的追踪声明信息包括:如果判断在所述源程序代码中有追踪声明标识,则确定添加有所述追踪声明标识的被监控方法,将此被监控方法所在的位置确定为所述织入点,并基于所述追踪声明标识提取与被监控方法相对应的追踪声明信息。
6.可选地,所述使用织入器将所述追踪织入方法织入在所述织入点包括:基于所述追踪声明信息生成注解信息;其中,所述注解信息包括:应用名称、关键字、调用类型、调用链节点id;生成与所述追踪织入方法相对应的通知织入代码;其中,所述通知织入代码包含所述注解信息;使用所述织入器将所述通知织入代码织入在所述织入点;其中,所述通知织入代码包括:与基于面向切面编程aop机制的通知方法相对应的代码;所述通知方法包括:after、around、before和afterthrow方法中的至少一个方法。
7.可选地,生成用于使用执行计时器的计时代码;获取数据库实例和日志生成器实例,生成用于使用所述数据库实例和日志生成器实例的存储代码;将所述计时代码和所述存储代码织入在所述织入点。
8.可选地,所述在所述编译文件运行时,获取与所述追踪织入方法相对应的实例线程,生成与所述实例线程相对应的追踪标识号包括:在所述编译文件运行时,启动计时器,通过所述计时器追踪所述通知方法以及所述被监控方法的执行时间;通过反射器获取主执
行方法并执行,生成所述实例线程;执行所述before方法,通过所述before方法对所述注解信息进行解析并生成所述追踪标识号;在所述主执行方法执行完毕时,关闭所述计时器;所述通过所述追踪织入方法获取与所述被监控方法相对应的监控信息,基于所述追踪标识号对所述监控信息进行关联处理包括:执行所述after方法,通过所述after方法并基于所述追踪标识号对所述监控信息进行关联处理。
9.可选地,在生成所述追踪标识号后,建立所述实例线程的线程名与所述追踪标识号之间的映射关系,使用threadlocal存储所述映射关系;其中,在所述实例线程内,与各个被监控方法相对应的追踪标识号都相同。
10.可选地,所述调用类型包括:rpc和rpc_end;在远程过程调用rpc区间的最后一个被调用方法为rpc_end类型;所述方法还包括:基于所述调用类型获取各个rpc调用区间的第一个被调用方法和最后一个被调用方法;其中,所述被调用方法为所述被监控方法;在执行所述before方法时,通过所述before方法为与被执行的所述第一个被调用方法分配rpc识别码;在执行所述after方法时,如果确定所述最后一个被调用方法被执行,则通过所述after方法并基于所述追踪标识号对同一个rpc调用区间内的所有被调用方法的rpc识别码进行统一设置。
11.可选地,所述基于所述追踪标识号对所述监控信息进行关联处理,获取与所述实例线程相对应的调用链信息包括:在执行所述after方法时,将与同一个rpc调用区间内的所有被调用方法相对应的监控信息存储在所述数据库或日志系统内,并基于所述追踪标识号对此监控信息填充所述rpc识别码;其中,所述监控信息包括:方法调用信息和执行时间;基于所述rpc识别码以及所述方法调用信息和所述执行时间对所述监控信息进行串联处理,生成与所述实例线程内的各个rpc调用区间相对应的调用链信息。
12.可选地,所述编译文件包括:java的class文件;所述方法还包括:在通过java虚拟机jvm执行所述class文件时,对所述jvm配置用于打开监控功能的运行参数。
13.可选地,在所述jvm启动时,通过类加载器基于环境变量加载所述jvm运行所需的资源包;在所述资源包初始化过程中,初始化虚拟机运行期管理器,通过所述虚拟机运行期管理器加载所述jvm的运行参数,通过对应的解析器对所述运行参数进行匹配解析。
14.可选地,在所述调用链信息生成之后,对所述调用链信息进行可视化处理并通过可视化模块进行显示。
15.根据本公开的第二方面,提供一种程序调用追踪装置,包括:织入信息获取模块,用于使用前置编译器对源程序代码进行初次编译,在所述源程序代码中获取织入点以及与被监控方法相对应的追踪声明信息;追踪代码织入模块,用于基于所述追踪声明信息生成与所述被监控方法相对应的追踪织入方法,使用织入器将所述追踪织入方法织入在所述织入点;编译文件生成模块,用于使用后置编译器对织入所述追踪织入方法的初次编译代码进行再次编译,生成与所述源程序代码相对应的编译文件;追踪标识生成模块,用于在所述编译文件运行时,获取与所述追踪织入方法相对应的实例线程,生成与所述实例线程相对应的追踪标识号;监控信息处理模块,用于通过所述追踪织入方法获取与所述被监控方法相对应的监控信息,基于所述追踪标识号对所述监控信息进行关联处理,生成与所述实例线程相对应的调用链信息。
16.可选地,所述织入信息获取模块,具体用于如果判断在所述源程序代码中有追踪
声明标识,则确定添加有所述追踪声明标识的被监控方法,将此被监控方法所在的位置确定为所述织入点,并基于所述追踪声明标识提取与被监控方法相对应的追踪声明信息。
17.可选地,所述追踪代码织入模块,包括:代码生成单元,用于基于所述追踪声明信息生成注解信息;其中,所述注解信息包括:应用名称、关键字、调用类型、调用链节点id;生成与所述追踪织入方法相对应的通知织入代码;其中,所述通知织入代码包含所述注解信息;代码织入单元,用于使用所述织入器将所述通知织入代码织入在所述织入点;其中,所述通知织入代码包括:与基于面向切面编程aop机制的通知方法相对应的代码;所述通知方法包括:after、around、before和afterthrow方法中的至少一个方法。
18.可选地,所述代码生成单元,还用于生成用于使用执行计时器的计时代码;获取数据库实例和日志生成器实例,生成用于使用所述数据库实例和日志生成器实例的存储代码;所述代码织入单元,还用于将所述计时代码和所述存储代码织入在所述织入点。
19.可选地,所述追踪标识生成模块,包括:实例执行单元,用于在所述编译文件运行时,启动计时器,通过所述计时器追踪所述通知方法以及所述被监控方法的执行时间;通过反射器获取主执行方法并执行,生成所述实例线程;标识生成单元,用于执行所述before方法,通过所述before方法对所述注解信息进行解析并生成所述追踪标识号;所述实例执行单元,还用于在所述主执行方法执行完毕时,关闭所述计时器;所述监控信息处理模块,用于执行所述after方法,通过所述after方法并基于所述追踪标识号对所述监控信息进行关联处理。
20.可选地,所述标识生成单元,还用于在生成所述追踪标识号后,建立所述实例线程的线程名与所述追踪标识号之间的映射关系,使用threadlocal存储所述映射关系;其中,在所述实例线程内,与各个被监控方法相对应的追踪标识号都相同。
21.可选地,所述调用类型包括:rpc和rpc_end;在远程过程调用rpc区间的最后一个被调用方法为rpc_end类型;所述监控信息处理模块,包括:调用标识设置单元,用于基于所述调用类型获取各个rpc调用区间的第一个被调用方法和最后一个被调用方法;其中,所述被调用方法为所述被监控方法;在执行所述before方法时,通过所述before方法为与被执行的所述第一个被调用方法分配rpc识别码;在执行所述after方法时,如果确定所述最后一个被调用方法被执行,则通过所述after方法并基于所述追踪标识号对同一个rpc调用区间内的所有被调用方法的rpc识别码进行统一设置。
22.可选地,所述监控信息处理模块,包括:信息存储单元,用于在执行所述after方法时,将与同一个rpc调用区间内的所有被调用方法相对应的监控信息存储在所述数据库或日志系统内,并基于所述追踪标识号对此监控信息填充所述rpc识别码;其中,所述监控信息包括:方法调用信息和执行时间;关联处理单元,基于所述rpc识别码以及所述方法调用信息和所述执行时间对所述监控信息进行串联处理,生成与所述实例线程内的各个rpc调用区间相对应的调用链信息。
23.可选地,所述编译文件包括:java的class文件;所述装置还包括:虚拟机配置模块,用于在通过java虚拟机jvm执行所述class文件时,对所述jvm配置用于打开监控功能的运行参数。
24.可选地,所述虚拟机配置模块,还用于在所述jvm启动时,通过类加载器基于环境变量加载所述jvm运行所需的资源包;在所述资源包初始化过程中,初始化虚拟机运行期管
理器,通过所述虚拟机运行期管理器加载所述jvm的运行参数,通过对应的解析器对所述运行参数进行匹配解析。
25.可选地,调用信息显示模块,用于在所述调用链信息生成之后,通过可视化模块对所述调用链信息进行显示。
26.根据本公开的第三方面,提供一种程序调用追踪装置,包括:存储器;以及耦接至所述存储器的处理器,所述处理器被配置为基于存储在所述存储器中的指令,执行如上所述的方法。
27.根据本公开的第四方面,提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,所述指令被处理器执行如上的程序调用追踪方法。
28.本公开的程序调用追踪方法、装置以及存储介质,通过将追踪织入方法织入在织入点并进行编译,生成编译文件;在编译文件运行时生成与实例线程相对应的追踪标识,基于追踪标识对通过追踪织入方法获取的监控信息进行关联处理,生成与实例线程相对应的调用链信息;在编译期织入追踪方法代码,风险低、效率高,可以对实例内的调用进行监控,并实现跨进程调用跟踪并生成调用链信息,能够监控整个调用链性能,使得调用追踪的结果更具参考性,提高了用户体验。
附图说明
29.为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。
30.图1为根据本公开的程序调用追踪方法的一个实施例的模块示意图;
31.图2a为根据本公开的程序调用追踪方法的一个实施例的处理模型示意图,图2b为根据本公开的程序调用追踪方法的一个实施例的应用架构示意图;
32.图3a为根据本公开的程序调用追踪方法的一个实施例中的代码织入的流程示意图;图3b为根据本公开的程序调用追踪方法的一个实施例中的代码织入的过程示意图;
33.图4为根据本公开的程序调用追踪方法的一个实施例中的实例内监控方法调用过程的示意图;
34.图5为根据本公开的程序调用追踪方法的一个实施例中的监控执行的流程示意图;
35.图6为根据本公开的程序调用追踪方法的一个实施例中的设置rfc标识的流程示意图;
36.图7为跨进程调用模型的示意图;
37.图8为根据本公开的程序调用追踪方法的一个实施例中的生成调用链的流程示意图;
38.图9为根据本公开的程序调用追踪方法的一个实施例中的监控执行的方法调用示意图;
39.图10为根据本公开的程序调用追踪装置的一个实施例的模块示意图;
40.图11为根据本公开的程序调用追踪装置的一个实施例中的追踪代码织入模块的
模块示意图;
41.图12为根据本公开的程序调用追踪装置的一个实施例中的追踪标识生成模块的模块示意图;
42.图13为根据本公开的程序调用追踪装置的一个实施例中的监控信息此处理模块的模块示意图;
43.图14为根据本公开的程序调用追踪装置的另一个实施例的模块示意图;
44.图15为根据本公开的程序调用追踪装置的又一个实施例的模块示意图。
具体实施方式
45.下面参照附图对本公开进行更全面的描述,其中说明本公开的示例性实施例。下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本公开保护的范围。下面结合各个图和实施例对本公开的技术方案进行多方面的描述。
46.目前,现有的对于程序调用进行追踪的技术方案通常具有如下不足:只能监控基于mvc架构的controller层(controller层负责具体的业务模块流程的控制),对于实例内的调用无法监控;使用黑盒(black

box)技术实现,不能把整个调用节点串联起来,只能将各节点的监控信息集中输出等。
47.本公开提供一种基于注解(annotation

based)的程序调用追踪方法。图1为根据本公开的程序调用追踪方法的一个实施例的模块示意图,如图1所示:
48.步骤101,使用前置编译器对源程序代码进行初次编译,在源程序代码中获取织入点以及与被监控方法相对应的追踪声明信息。
49.在一个实施例中,aop(aspect oriented programming,面向切面编程)为通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术,是spring框架中的一个重要内容。利用aop可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性。
50.织入(weaving)为aop术语,用于把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。源程序代码可以为java代码等,用户在编程时可以在源程序代码中选取被监控方法,对被监控方法添加追踪声明信息以及设置注入点。
51.步骤102,基于追踪声明信息生成与被监控方法相对应的追踪织入方法,使用织入器将追踪织入方法织入在织入点。
52.在一个实施例中,追踪声明信息包括应用名称、关键字、调用类型等信息。追踪织入方法包括与基于面向切面编程aop机制的通知方法,通知方法包括:after、around、before和afterthrow方法中的至少一个方法。
53.步骤103,使用后置编译器对织入追踪织入方法的初次编译代码进行再次编译,生成与源程序代码相对应的编译文件。
54.在一个实施例中,编译文件包括java的class文件等。在通过java虚拟机jvm执行class文件时,对jvm进行配置,用于打开监控功能的运行参数。
55.步骤104,在编译文件运行时,获取与追踪织入方法相对应的实例线程,生成与实例线程相对应的traceid。traceid为追踪标识号。
56.步骤105,通过追踪织入方法获取与被监控方法相对应的监控信息,基于traceid对监控信息进行关联处理,生成与实例线程相对应的调用链信息。
57.在一个实施例中,调用链信息包括程序方法之间的调用拓扑信息等,能够获取各个业务、方法之间的调用关系。在调用链信息生成之后,对调用链信息进行可视化处理并通过可视化模块进行显示。例如,根据调用链信息生成调用关系拓扑图,在可视化界面中进行显示。
58.在一个实施例中,如图2a所示,源程序代码为.java文件,使用前置编译器对.java文件进行初次编译,生成初次编译文件.class文件;使用后置编译器对织入追踪织入方法的.class文件进行再次编译,生成与源程序代码相对应的编译文件,编译文件为含有织入代码的.class文件,通过jvm(java virtual machine,java虚拟机)执行编译文件。
59.如图2b所示,前置编译对.java文件进行初次编译,此次编译可以确定织入点所在编译位置。后置编译对织入后的代码进行编译,此次编译后生成最终的class文件。类加载用于加载文件。织入器用于在织入点处织入before、after、around、afterthrow方法代码。反射器用于通过反射获取类方法实例,用于生成traceid并织入到方法。
60.在一个实施例中,追踪声明标识可以为多种,例如为“@trace”等。如果判断在源程序代码中有追踪声明标识,则确定添加有追踪声明标识的被监控方法,将此被监控方法所在的位置确定为织入点,并基于追踪声明标识提取与被监控方法相对应的追踪声明信息,追踪声明信息包括应用名称、关键字、调用类型、调用链节点id等信息。
61.图3a为根据本公开的程序调用追踪方法的一个实施例中的代码织入的流程示意图,如图3a所示:
62.步骤301,基于追踪声明信息生成注解信息;其中,注解信息包括:应用名称、关键字、调用类型、调用链节点id。
63.步骤302,生成与追踪织入方法相对应的通知织入代码;其中,通知织入代码包含注解信息。
64.步骤303,使用织入器将通知织入代码织入在织入点。
65.在一个实施例中,通知织入代码包括与基于面向切面编程aop机制的通知方法相对应的代码;通知方法包括after、around、before和afterthrow等方法中的至少一个方法。after、around、before和afterthrow等方法为现有的通知方法,before方法为前置通知方法,after方法为后通知方法,around方法为环绕通知方法,afterthrow方法为抛出异常后通知方法。
66.步骤304,生成用于使用执行计时器的计时代码。
67.步骤305,获取数据库实例和日志生成器实例,生成用于使用数据库实例和日志生成器实例的存储代码。
68.步骤306,将计时代码和存储代码织入在织入点。可以使用现有的多种织入器将通知织入代码以及计时代码和存储代码织入在织入点。
69.在一个实施例中,用户在源程序代码中的被监控方法前添加追踪声明标识“@trace”,“@trace”的添加位置为织入点。用户在“@trace”后添加追踪声明信息,追踪声明信
息包含属性:appname、keyword、invoketype和segmentid等。appname为所在应用的名称;keyword为关键字,为贯穿调用链的唯一标识,如果不声明,则根据方法参数进行生成,需要保证参数一致;invoketype为调用类型,调用类型为native|rpc|rpc_end;segmentid为调用链节点id,由用户声明。
70.rpc(remote procedure call,远程过程调用)通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。rpc的主要目标是让构建分布式计算更容易、透明,在提供强大的远程调用能力时不损失本地调用的语义简洁性。rpc框架提供了一种透明调用机制,让使用者不必显式地区分本地调用和远程调用。用户在源程序代码中可以在被监控方法中使用rpc工具包中提供的方法,进行rpc调用。用户需要在源程序代码中确定被监控方法的调用类型。
71.被监控方法的调用类型可以为rpc类型,表明被监控方法为一个rpc区间中的一个节点,rpc区间即为rpc调用区间,包括多个被监控方法,rpc识别码可以为rpcuuid,是整个跟踪记录的主线。被监控方法的调用类型可以为rpc_end类型,表明被监控方法为一个rpc区间中的最后一个节点,即在rpc区间的最后一个节点需声明为rpc_end。每个rpc区间只在该rpc区间的首个rpc类型的被监控方法执行时,分配rpcuuid。在进行程序调用追踪时,一个rpc区间内的被调用方法使用traceid保持一致。
72.在源程序代码编译时,在织入点处织入after、around、before、afterthrow方法。在before方法中会为当前的方法分配一个traceid。从注解信息中获取签名方法,根据签名方法获取被监控方法的超类,在超类打开一个运行期访问入口,然后拿到被监控类的属性,通过set方法将新的traceid值赋入。
73.整个实例(线程)内的所有节点的traceid都一致,使用threadlocal存储,根据threadname进行映射,通过该值可以实现当前实例内的所有节点的traceid保持一致。threadlocal提供线程本地变量,如果创建threadlocal变量,访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题。
74.为了实现跨进程的一致性,需要使用rpcuuid来与其它rpc段进行关联。rpcuuid的生成有两种方式,一种是为整个调用链声明一个从起始到结尾的贯穿关键字keyword,另一种是自动在每个rpc区间的第一个节点处根据传入参数加密生成该值。after织入方法在本rpc区间最后一个方法执行时,将本rpc区间内的所有调用节点的rpcuuid通过traceid进行统一更新,可以通过rpcuuid将整个调用链串联起来。
75.如图3b所示,通过class loader加载rpc类,injector(织入器)将执行前、中、后的通知织入代码(织入代码)织入在织入点,即在系统编译期间会在被监控方法上织入监控代码,包含执行前、执行中、执行后三部分。获取数据库实例和日志生成器实例,将计时代码和存储代码织入在织入点。通过反射机制获取当前方法,对关键词进行加密处理。
76.在对源java文件编译时,直接在织入点处插入字节码不会产生多余的文件,相比于运行时织入的方式降低了异常风险和对执行效率的影响。在injector内编写要执行的织入代码,然后通过内置的编译工具将代码编译为字节码文件,可织入内容涵盖jvm规范内的所有操作符、指令集。
77.在一个实施例中,如图4所示,在jvm启动时,通过类加载器基于环境变量加载jvm
运行所需的资源包;在资源包初始化过程中,初始化虚拟机运行期管理器,通过虚拟机运行期管理器加载jvm的运行参数,通过对应的解析器对运行参数进行匹配解析。
78.对jvm配置监控开关,针对实例内调用监控,在系统运行前配置jvm运行参数

dinner

trace:trace=true,trigger=xxx.xxx.xxx,xxx.xxx.xxx为类的路径。jvm在启动时获取jre环境变量、jvm环境变量、jvm动态链接库,加载类库。
79.启动参数解析,引导类加载器通过环境变量加载jvm运行所需的必要资源包,在资源包初始化过程中会初始化runtimemxbean(虚拟机运行期管理器),通过该类来加载运行参数,该参数为本装置自定义格式,通过对应的解析器进行匹配解析,格式的形式为:

d+参数名+

:’+参数名+

=’+参数值,多个参数以英文半角逗号隔开。
80.图5为根据本公开的程序调用追踪方法的一个实施例中的监控执行的流程示意图,如图5所示:
81.步骤501,在编译文件运行时,启动计时器,通过计时器追踪通知方法以及被监控方法的执行时间。
82.步骤502,通过反射器获取main方法并执行,生成实例线程。main方法为主执行方法。
83.在一个实施例中,main方法是java应用程序的入口方法,java应用程序在运行的时候,第一个执行的方法就是main方法。
84.步骤503,执行before方法,通过before方法对注解信息进行解析并生成traceid。
85.步骤504,在main方法执行完毕时,关闭计时器。
86.步骤505,执行after方法,通过after方法并基于traceid对监控信息进行关联处理。
87.在生成traceid后,建立实例线程的线程名与traceid之间的映射关系,使用threadlocal存储映射关系;其中,在实例线程内,与各个被监控方法相对应的traceid都相同。在执行before方法时,如果threadlocal存储有traceid,则获取此traceid,如果threadlocal没有存储traceid,则生成traceid。
88.图6为根据本公开的程序调用追踪方法的一个实施例中的设置rfc标识的流程示意图,调用类型包括rpc和rpc_end;在远程过程调用rpc区间的最后一个被调用方法为rpc_end类型,如图6所示:
89.步骤601,基于调用类型获取各个rpc调用区间的第一个被调用方法和最后一个被调用方法。
90.步骤602,在执行before方法时,通过before方法为被执行的第一个被调用方法分配rpcuuid。
91.在一个实施例中,在编译文件运行时,与各个被监控方法相对应的before、after、around、afterthrow等会采集监控信息,监控信息包括方法调用信息、执行时间等,并且在监控信息中添加有traceid。监控信息可以存储在日志系统或数据库中。当rpc调用区间的第一个被调用方法执行时,通过before方法为被执行的rpc调用区间的第一个被调用方法分配rpcuuid并存储在监控信息中,rpcuuid可以采用多种方法生成,例如通过对关键字进行加密等方法。
92.步骤603,在执行after方法时,如果确定最后一个被调用方法被执行,则通过
after方法并基于traceid对同一个rpc调用区间内的所有被调用方法的rpcuuid进行统一设置。
93.在一个实施例中,可以在与最后一个被调用方法相对应的after方法执行时,将与同一个rpc调用区间内的所有被调用方法相对应的监控信息存储在数据库或日志系统内,基于traceid对此监控信息填充rpcuuid。也可以在其他被调用方法被执行时,与其他被调用方法相对应的after方法将与此被调用方法相对应的监控信息存储在数据库或日志系统内。
94.例如,在其他被调用方法被执行时,与其他被调用方法相对应的after方法将与此被调用方法相对应的监控信息存储在数据库或日志系统内。在执行after方法时,如果确定最后一个被调用方法被执行,基于traceid从数据库或日志文件中获取traceid相同的,并且,基于存储时间顺序获取存储时间在同一个rpc调用区间的第一个被调用方法的监控信息之后的全部其余监控信息(此第一个被调用方法的监控信息包括rpcuuid,并且,此rpcuuid是最新生成的),在此全部其余监控信息以及同一个rpc调用区间的最后一个被调用方法的监控信息中都添加第一个被调用方法的监控信息所包括的rpcuuid。
95.如图7所示,一个实例线程中可以有多个rpc调用区间,例如rpc调用区间1

4。基于调用类型rpc和rpc_end,获取各个rpc调用区间的第一个被调用方法和最后一个被调用方法。在执行before方法时,通过before方法为被执行的第一个被调用方法分配rpcuuid。在执行after方法时,如果确定最后一个被调用方法被执行,即执行的是与最后一个被调用方法相对应的after方法,则通过after方法并基于traceid对同一个rpc调用区间内的所有被调用方法的rpcuuid进行统一设置。可以通过rpcuuid生成各个rpc调用区间内的所有被调用方法之间的调用链信息。
96.图8为根据本公开的程序调用追踪方法的一个实施例中的生成调用链的流程示意图,如图8所示:
97.步骤801,在执行after方法时,将与同一个rpc调用区间内的所有被调用方法相对应的监控信息存储在数据库或日志系统内,并基于traceid对此监控信息填充rpcuuid;其中,监控信息包括方法调用信息和执行时间等。
98.步骤802,基于rpcuuid以及方法调用信息和执行时间对监控信息进行串联处理,生成与实例线程内的各个rpc调用区间相对应的调用链信息。
99.在一个实施例中,对于数据库类可以配置启动参数

dprint:type=mongodb|mysql,url=xxx。选配

dwarn:run=true|false,elapsed=xxx开关来打开或关闭报警,默认为关闭;若开启可根据用户配置的耗时进行监控报警。也可以配置mq类结果输出,例如调整type为type=kafka。
100.在一个实施例中,如图9所示,执行目标类的class文件在织入通知织入代码后会包含一个执行体advicebody,该执行体advicebody包含了原main方法的所有执行内容,此main方法的执行是被代理执行的。织入的通知方法的具体执行为:1、执行织入方法around方法,启动计时器,用于监控方法的执行时间;2、通过反射机制获得main方法,并执行;3、执行before方法,对注解进行解析并生成相关标识;4、关闭计时器,main方法执行完毕;5.执行after方法对监控结果进行加工和输出;重复上述的步骤1

5。
101.织入的通知织入代码被执行时,对当前线程的线程栈内的元素进行归集和排序来
获取其调用链的信息,该方式不会统计加载信息,只会统计调用过程和执行时间,生成的调用链信息会在执行后监控方法执行完毕后可以由日志层输出。
102.在一个实施例中,如图10所示,本公开提供一种程序调用追踪装置100,包括织入信息获取模块101、追踪代码织入模块102、编译文件生成模块103、追踪标识生成模块104和监控信息处理模块105。织入信息获取模块101使用前置编译器对源程序代码进行初次编译,在源程序代码中获取织入点以及与被监控方法相对应的追踪声明信息。追踪代码织入模块102基于追踪声明信息生成与被监控方法相对应的追踪织入方法,使用织入器将追踪织入方法织入在织入点。
103.编译文件生成模块103使用后置编译器对织入追踪织入方法的初次编译代码进行再次编译,生成与源程序代码相对应的编译文件。追踪标识生成模块104在编译文件运行时,获取与追踪织入方法相对应的实例线程,生成与实例线程相对应的traceid。监控信息处理模块105通过追踪织入方法获取与被监控方法相对应的监控信息,基于traceid对监控信息进行关联处理,生成与实例线程相对应的调用链信息。
104.在一个实施例中,织入信息获取模块101如果判断在源程序代码中有追踪声明标识,则确定添加有追踪声明标识的被监控方法,将此被监控方法所在的位置确定为织入点,并基于追踪声明标识提取与被监控方法相对应的追踪声明信息。
105.如图11所示,追踪代码织入模块102包括代码生成单元1021和代码织入单元1022。代码生成单元1021基于追踪声明信息生成注解信息;其中,注解信息包括应用名称、关键字、调用类型、调用链节点id等;代码生成单元1021生成与追踪织入方法相对应的通知织入代码;其中,通知织入代码包含注解信息。
106.代码织入单元1022使用织入器将通知织入代码织入在织入点;其中,通知织入代码包括:与基于面向切面编程aop机制的通知方法相对应的代码;通知方法包括after、around、before和afterthrow等方法。
107.代码生成单元1021生成用于使用执行计时器的计时代码;获取数据库实例和日志生成器实例,生成用于使用数据库实例和日志生成器实例的存储代码。代码织入单元1022将计时代码和存储代码织入在织入点。
108.如图12所示,追踪标识生成模块104包括实例执行单元1041和标识生成单元1042。实例执行单元1041在编译文件运行时,启动计时器,通过计时器追踪通知方法以及被监控方法的执行时间,通过反射器获取main方法并执行,生成实例线程。
109.标识生成单元1042执行before方法,通过before方法对注解信息进行解析并生成traceid。实例执行单元1041在main方法执行完毕时,关闭计时器。监控信息处理模块105执行after方法,通过after方法并基于traceid对监控信息进行关联处理。
110.标识生成单元1042在生成traceid后,建立实例线程的线程名与traceid之间的映射关系,使用threadlocal存储映射关系;其中,在实例线程内,与各个被监控方法相对应的traceid都相同。
111.如图13所示,监控信息处理模块105包括调用标识设置单元1051、信息存储单元1052和关联处理单元1053。调用类型包括rpc和rpc_end等,在远程过程调用rpc区间的最后一个被调用方法为rpc_end类型。调用标识设置单元1051基于调用类型获取各个rpc调用区间的第一个被调用方法和最后一个被调用方法,被调用方法为被监控方法。在执行before
方法时,调用标识设置单元1051通过before方法为被执行的第一个被调用方法分配rpcuuid。在执行after方法时,如果确定最后一个被调用方法被执行,则调用标识设置单元1051通过after方法并基于traceid对同一个rpc调用区间内的所有被调用方法的rpcuuid进行统一设置。
112.信息存储单元1052在执行after方法时,将与同一个rpc调用区间内的所有被调用方法相对应的监控信息存储在数据库或日志系统内,并基于traceid对此监控信息填充rpcuuid,其中,监控信息包括方法调用信息和执行时间。关联处理单元1053rpcuuid以及方法调用信息和执行时间对监控信息进行串联处理,生成与实例线程内的各个rpc调用区间相对应的调用链信息。
113.在一个实施例中,如图14所示,程序调用追踪装置100还包括虚拟机配置模块106和调用信息显示模块107。编译文件包括java的class文件等。虚拟机配置模块106在通过java虚拟机jvm执行class文件时,对jvm配置用于打开监控功能的运行参数。
114.虚拟机配置模块106在jvm启动时,通过类加载器基于环境变量加载jvm运行所需的资源包,在资源包初始化过程中,初始化虚拟机运行期管理器,通过虚拟机运行期管理器加载jvm的运行参数,通过对应的解析器对运行参数进行匹配解析。调用信息显示模块107在调用链信息生成之后,通过可视化模块对调用链信息进行显示。
115.在一个实施例中,图15为根据本公开的程序调用追踪装置的又一个实施例的模块示意图。如图15所示,该装置可包括存储器1501、处理器1502、通信接口1503以及总线1504。存储器1501用于存储指令,处理器1502耦合到存储器1501,处理器1502被配置为基于存储器1501存储的指令执行实现上述的程序调用追踪方法。
116.存储器1501可以为高速ram存储器、非易失性存储器(non

volatile memory)等,存储器1501也可以是存储器阵列。存储器1501还可能被分块,并且块可按一定的规则组合成虚拟卷。处理器1502可以为中央处理器cpu,或专用集成电路asic(application specific integrated circuit),或者是被配置成实施本公开的程序调用追踪方法的一个或多个集成电路。
117.在一个实施例中,本公开提供一种计算机可读存储介质,计算机可读存储介质存储有计算机指令,指令被处理器执行时实现如上任一个实施例中的程序调用追踪方法。
118.上述实施例提供的程序调用追踪方法、装置以及存储介质,通过将追踪织入方法织入在织入点并进行编译,生成编译文件;在编译文件运行时生成与实例线程相对应的追踪标识,基于追踪标识对通过追踪织入方法获取的监控信息进行关联处理,生成与实例线程相对应的调用链信息;在编译期织入追踪方法代码,风险低、效率高,可以对实例内的调用进行监控,并实现跨进程调用跟踪并生成调用链信息,能够监控整个调用链性能,使得调用追踪的结果更具参考性,提高了用户体验;并且不需要强制用户使用指定的rpc框架,用户无需关心实现细节;能够实现包括监控、存储、展示、报警等多方面的拓展支持。
119.可能以许多方式来实现本公开的方法和系统。例如,可通过软件、硬件、固件或者软件、硬件、固件的任何组合来实现本公开的方法和系统。用于方法的步骤的上述顺序仅是为了进行说明,本公开的方法的步骤不限于以上具体描述的顺序,除非以其它方式特别说明。此外,在一些实施例中,还可将本公开实施为记录在记录介质中的程序,这些程序包括用于实现根据本公开的方法的机器可读指令。因而,本公开还覆盖存储用于执行根据本公
开的方法的程序的记录介质。
120.本公开的描述是为了示例和描述起见而给出的,而并不是无遗漏的或者将本公开限于所公开的形式。很多修改和变化对于本领域的普通技术人员而言是显然的。选择和描述实施例是为了更好说明本公开的原理和实际应用,并且使本领域的普通技术人员能够理解本公开从而设计适于特定用途的带有各种修改的各种实施例。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1