技术领域
[0001] 本发明涉及计算机技术领域,尤其涉及一种异常监控的方法和装置。
相关背景技术
[0002] 新上线的系统,由于没有经过足够的测试,有很多代码会抛出各种异常。本来运行正常的系统,由于某种原因,也有可能报出大量的异常。如何及时发现系统出现的各种异常,是急需解决的一个技术问题。
[0003] 现有技术中,大多由系统使用人员发现系统出现的各种问题,并反馈给系统的开发人员。系统的开发人员通过查找系统的日志等手工方法进行排查,以寻找系统中出现异常的位置。
[0004] 在实现本发明过程中,发明人发现现有技术中至少存在如下问题:
[0005] 1)后知后觉,无法及时获取系统出现的异常;
[0006] 2)纯人工处理,无法实现自动监控;
[0007] 3)效率低;
[0008] 4)不能实现对海量系统的大规模管理。
具体实施方式
[0055] 以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
[0056] 与现有技术中需要人为查找系统出现的异常情况相比,本发明在待监控系统的源代码中注入异常监控代码,不仅能够在无损待监控系统的源代码的情况下动态获取待监控系统出现的各种异常,还能实现对海量系统的大规模管理。此外,本发明实施例采用平台化管理的方式,便于查找和检索待监控系统出现的各种异常。
[0057] 需要说明的是,在不冲突的情况下,本发明提及的各个实施例以及各个技术特征可以互相组合。
[0058] 图1是根据本发明实施例的异常监控的方法的主要流程的示意图,如图1所示,异常监控的方法,包括:
[0059] 步骤S101、确定待监控系统的源代码中需要被监控的监控对象;所述监控对象包括:类,和/或方法;
[0060] 步骤S102、在所述待监控系统启动时,向所述监控对象中注入异常监控代码;
[0061] 步骤S103、基于所述异常监控代码对所述待监控系统进行异常监控。
[0062] 本发明实施例提及的待监控系统,可以是各种系统,例如运行在JVM(Java Virtual Machine,Java虚拟机)中的系统。在系统启动时向监控对象中注入异常监控代码,通过注入的异常监控代码可以对运行中的系统监控,当系统出现异常时,及时捕获系统出现的异常信息。基于异常监控代码对系统进行异常监控,能够在无损系统的源代码的情况下动态获取系统出现的各种异常,实现对海量系统的大规模管理。
[0063] 确定待监控系统的源代码中需要被监控的监控对象,可以包括:遍历所述源代码中的所有类,将具有预设类名的类作为待监控的类;遍历所述待监控的类对应的所有方法,将具有预设方法名的方法作为待监控的方法;以所述待监控的类和所述待监控的方法作为所述监控对象。本发明实施例中,将具有预设类名的类和具有预设方法名的方法作为监控对象。本领域技术人员可以根据实际应用场景和监控需求对预设类名和预设方法名进行选择设置,从而实现个性化监控,扩展本发明实施例的应用范围。
[0064] 以待监控系统的源文件是Java源文件为例。在被编译之后,Java源文件的每个类(或者接口)都单独占据一个Class文件,Class文件是一种8位字节的二进制流文件,各个数据项和指令行按顺序紧密的从前向后排列。注入异常监控代码的主要任务就是要找到那些包含异常抛出和捕获的指令,然后围绕这些指令在JVM中动态添加异常监控代码。由于二进制流文件对使用人员的专业要求较高,不容易读懂,因此可以借助其它开发库。
[0065] 对于较较简单源文件,可以通过AspectJ来实现注入异常监控代码的步骤。AspectJ是一个面向切面的框架,它扩展了Java语言(Java语言是一种可以撰写跨平台应用软件的面向对象的程序设计语言)。AspectJ定义了AOP(Aspect Oriented Programming,面向切面编程)语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。
[0066] 对于较复杂的源文件,可以通过ASM来实现注入异常监控代码的步骤。ASM是一个Java字节码操控框架。它能被用来动态生成类或者增强既有类的功能。
[0067] 图2是根据本发明实施例的捕获异常记录的方法的主要流程的示意图。如图2所示,注入异常监控代码的方法包括:
[0068] 1)创建入口类,以在JVM运行main函数(主函数)前对系统的源代码进行动态修改;
[0069] 2)实现静态函数premain,即在创建的入口类中创建一个public static的premain函数;
[0070] 3)实现一个ClassFileTransformer的,即创建一个继承于ClassFileTransformer的自定义类,其作用是查找源代码中需要被加入异常监控代码的类和方法(这些类和方法由开发人员预先配置,配置方式可以采用正则表达式,例如com.jd.wms.*;)[0071] 4)实现一个MethodAdapter类的子类;
[0072] 5)在MethodAdapter类的子类里面重载visitTryCatchBlock函数;重载visitTryCatchBlock函数的过程实际上就是将用于捕获异常信息的异常监控代码加入需要进行异常监控的类和方法的过程;
[0073] 6)利用visitTryCatchBlock函数捕获异常信息,并定位异常信息对应的异常位置。实际应用过程中,可以根据捕获的异常信息及其对应的异常位置形成异常记录,将异常记录发送到指定的文件中;
[0074] 7)循环检查,看是有还有异常需要捕获;
[0075] 8)若是没有则,结束;否则,跳转至步骤7)。
[0076] 基于所述监控代码对所述待监控系统进行异常监控,可以包括:利用所述监控代码捕获所述待监控系统的异常信息,确定出现所述异常信息的代码标识;基于所述代码标识,确定所述待监控系统中出现异常的代码位置。与现有技术中需要人工查找系统的异常位置相比,根据出现异常信息的代码标识确定系统中出现异常的代码位置,能够快速定位异常位置,效率高,准确性好。
[0077] 确定所述待监控系统中出现异常的位置之后,还可以包括:周期性地将异常记录发送至预设位置,将预设位置的异常记录写入预设存储位置;所述异常记录包括:所有的异常信息,以及与每个所述异常信息对应的代码位置。此处的预设位置或者预设存储位置可以根据实际情况进行选择设定,只要能够存储异常记录即可。例如,预设位置可以是用于收集异常信息及其异常位置的服务器集群,预设存储位置可以是用于对异常记录进行分析处理的系统的磁盘。
[0078] 在一些实施例中,可以实时监控待监控系统的运行情况,若待监控系统出现异常,及时捕获异常信息,实时将异常记录发送至指定位置,然后每隔一定时间将该指定位置中的异常记录发送至上述预设位置。与实时将异常记录发送至上述预设位置相比,周期性地发送能够大大降低发送频次,减少对系统计算资源的占用。
[0079] 异常记录写入预设存储位置之后,可以从该预设位置获取异常记录,以进行分析处理。通过先将异常记录发送至预设位置,然后将预设位置的异常记录写入预设存储位置,能够实现异常记录上报和异常记录分析的异步处理,提高处理效率。
[0080] 将预设位置的异常记录写入预设存储位置之后,还可以包括:按照预设方式对所述预设存储位置中的异常记录进行分析处理。此处的预设方式可以根据实际情况进行选择设计,本发明实施例对此不做具体限定。例如,对预设位置中的异常记录进行分类处理,以获取各个类别的异常情况;再例如,对预设位置中的异常记录进行判断分析,以确定某一类型的异常记录的数量是否超过预设数量阈值,从而判断是否需要发出告警通知;再例如,根据预设位置中的异常记录生成可视化展示文件,以将各个异常记录可视化地展示给用户。
[0081] 按照预设方式对所述预设存储位置中的异常记录进行分析处理之后,还可以包括:可视化展示分析处理之后的所述异常记录;和/或,依据分析处理之后的所述异常记录发出通知信息。采用平台化管理的方式,依据分析处理之后的异常记录发出通知信息,能够在待监控系统出现异常时及时发出通知信息。发出通知信息的方式可以根据实际情况进行选择设计,只要能够通知到待通知对象即可。例如通过手机短信、邮件、IM(instant message,即时消息)等。可视化展示待监控系统出现的异常信息,便于查找和检索待监控系统出现的各种异常。例如,将分析处理之后的异常记录发送至Web(网页)程序,通过Web程序进行可视化展示。
[0082] 图3是根据本发明可选实施例的异常监控的方法的主要流程的示意图。如图3所示,异常监控的方法包括:
[0083] 在待监控系统启动时注入异常监控代码;
[0084] 捕获到异常信息时,周期性地将异常记录写入预设位置;
[0085] 将预定位置的异常记录存入文件系统;此处的文件系统,可以是用于对异常记录进行分析处理的系统的磁盘;
[0086] 按照预设方式对存入文件系统的异常记录进行分析处理;
[0087] 按照预设周期发送汇总告警,同时将分析处理后的异常记录发送至Solr或ES之类的搜索引擎中。Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过Http(Hyper Text Transfer Protocol,超文本传输协议)请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML(Extensible Markup Language,可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言)格式的返回结果。Es即ElasticSearch,是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful Web接口。ES是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定、可靠、快速,安装使用方便;
[0088] 用户登录搜索引擎后显示分析处理后的异常记录。
[0089] 根据本发明实施例的再一个方面,提供一种异常监控的装置。
[0090] 图4是根据本发明实施例的异常监控的装置的主要模块的示意图。如图4所示,异常监控的装置400包括:注入模块401;所述注入模块401包括:确定单元4011,注入单元4012和监控单元4013;其中,
[0091] 所述确定单元4011确定待监控系统的源代码中需要被监控的监控对象;所述监控对象包括:类,和/或方法;
[0092] 所述注入单元4012在所述待监控系统启动时,向所述监控对象中注入异常监控代码;
[0093] 所述监控单元4013基于所述异常监控代码对所述待监控系统进行异常监控。
[0094] 可选地,所述确定单元4011确定待监控系统的源代码中需要被监控的监控对象,包括:
[0095] 遍历所述源代码中的所有类,将具有预设类名的类作为待监控的类;遍历所述待监控的类对应的所有方法,将具有预设方法名的方法作为待监控的方法;以所述待监控的类和所述待监控的方法作为所述监控对象。
[0096] 可选地,所述监控单元4013基于所述监控代码对所述待监控系统进行异常监控,包括:
[0097] 利用所述监控代码捕获所述待监控系统的异常信息,确定出现所述异常信息的代码标识;基于所述代码标识,确定所述待监控系统中出现异常的代码位置。
[0098] 可选地,本发明实施例的异常监控的装置400还包括:上报模块402和收集模块403;确定所述待监控系统中出现异常的位置之后,所述上报模块周期性地将异常记录发送至预设位置,所述收集模块将预设位置的异常记录写入预设存储位置;所述异常记录包括:
所有的异常信息,以及与每个所述异常信息对应的代码位置。
[0099] 可选地,本发明实施例的异常监控的装置400还包括:分析模块404;将预设位置的异常记录写入预设存储位置之后,所述分析模块按照预设方式对所述预设存储位置中的异常记录进行分析处理。
[0100] 可选地,本发明实施例的异常监控的装置400还包括:展示模块405和/或通知模块406;按照预设方式对所述预设存储位置中的异常记录进行分析处理之后,所述展示模块可视化展示分析处理之后的所述异常记录;和/或,所述通知模块依据分析处理之后的所述异常记录发出通知信息。
[0101] 图5是根据本发明可选实施例的异常监控的装置的架构示意图。如图5所示,每个应用服务器为本发明实施例中的待监控系统。应用服务器1、应用服务器2、……、应用服务器n中分别设置有注入模块和上报模块。图中注入代码包即注入异常监控代码,用于监空应用服务器的运行情况,当应用服务器出现异常时,及时捕获异常信息、定位异常信息对应的异常位置。上报模块中设置有异常信息上报程序,用于周期性地将对应服务器的异常记录发送至与预设位置,即图中的异常信息收集服务器集群。异常信息收集服务器集群将其中的异常记录发送至监控/分析服务器集群中,监控/分析服务器集群对接收的异常记录进行各种分类、加工处理。监控/分析服务器集群将处理后的异常记录发送至Web展示服务器集群,以向用户可视化地展示各个异常问题。同时,监控/分析服务器集群对接收的异常记录进行各种分类、加工处理之后,确定通知方式,例如通过手机短信、邮件、IM(instant message,即时消息)等,然后通过通知系统发送通知信息。
[0102] 根据本发明实施例的另一个方面,提供一种异常监控的电子设备,包括:
[0103] 一个或多个处理器;
[0104] 存储装置,用于存储一个或多个程序,
[0105] 当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明实施例第一方面提供的异常监控的方法。
[0106] 图6示出了可以应用本发明实施例的异常监控的方法或异常监控的装置的示例性系统架构600。
[0107] 如图6所示,系统架构600可以包括终端设备601、602、603,网络604和服务器605。网络604用以在终端设备601、602、603和服务器605之间提供通信链路的介质。网络604可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
[0108] 用户可以使用终端设备601、602、603通过网络604与服务器605交互,以接收或发送消息等。终端设备601、602、603上可以安装有各种通讯客户端应用,例如购物类应用、网页浏览器应用、搜索类应用、即时通信工具、邮箱客户端、社交平台软件等(仅为示例)。
[0109] 终端设备601、602、603可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。
[0110] 服务器605可以是提供各种服务的服务器,例如对用户利用终端设备601、602、603所浏览的购物类网站提供支持的后台管理服务器(仅为示例)。后台管理服务器可以对接收到的产品信息查询请求等数据进行分析等处理,并将处理结果(例如目标推送信息、产品信息--仅为示例)反馈给终端设备。
[0111] 需要说明的是,本发明实施例所提供的异常监控的方法一般由服务器605执行,相应地,异常监控的装置一般设置于服务器605中。
[0112] 应该理解,图6中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
[0113] 下面参考图7,其示出了适于用来实现本发明实施例的终端设备的计算机系统700的结构示意图。图7示出的终端设备仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
[0114] 如图7所示,计算机系统700包括中央处理单元(CPU)701,其可以根据存储在只读存储器(ROM)702中的程序或者从存储部分708加载到随机访问存储器(RAM)703中的程序而执行各种适当的动作和处理。在RAM 703中,还存储有系统700操作所需的各种程序和数据。CPU 701、ROM 702以及RAM 703通过总线704彼此相连。输入/输出(I/O)接口705也连接至总线704。
[0115] 以下部件连接至I/O接口705:包括键盘、鼠标等的输入部分706;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分707;包括硬盘等的存储部分708;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分709。通信部分709经由诸如因特网的网络执行通信处理。驱动器710也根据需要连接至I/O接口705。可拆卸介质711,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器710上,以便于从其上读出的计算机程序根据需要被安装入存储部分708。
[0116] 特别地,根据本发明公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分709从网络上被下载和安装,和/或从可拆卸介质711被安装。在该计算机程序被中央处理单元(CPU)701执行时,执行本发明的系统中限定的上述功能。
[0117] 需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本发明中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
[0118] 附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
[0119] 描述于本发明实施例中所涉及到的单元或模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元或模块也可以设置在处理器中,例如,可以描述为:一种处理器包括:注入模块,注入模块包括确定单元、注入单元和监控单元;确定单元确定待监控系统的源代码中需要被监控的监控对象;注入单元在所述待监控系统启动时,向所述监控对象中注入异常监控代码;监控单元基于所述异常监控代码对所述待监控系统进行异常监控。其中,这些单元或模块的名称在某种情况下并不构成对该单元本身的限定,例如,确定单元还可以被描述为“在所述待监控系统启动时向所述监控对象中注入异常监控代码的单元”。
[0120] 作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备包括:确定待监控系统的源代码中需要被监控的监控对象;所述监控对象包括:类,和/或方法;在所述待监控系统启动时,向所述监控对象中注入异常监控代码;基于所述异常监控代码对所述待监控系统进行异常监控。
[0121] 根据本发明实施例的技术方案,具有如下有益效果:
[0122] (1)向监控对象中注入异常监控代码,基于异常监控代码对待监控系统进行异常监控,能够在无损待监控系统的源代码的情况下动态获取待监控系统出现的各种异常,实现对海量系统的大规模管理;
[0123] (2)将具有预设类名的类和具有预设方法名的方法作为监控对象,预设类名和预设方法名可以根据实际情况进行选择设置,能够实现个性化监控;
[0124] (3)根据出现异常信息的代码标识确定待监控系统中出现异常的代码位置,能够快速定位异常位置;
[0125] (4)周期性地将异常记录发送至预设位置,将预设位置的异常记录写入预设存储位置,能够实现异常记录上报和异常记录分析的异步处理,提高处理效率;
[0126] (5)采用平台化管理的方式,依据分析处理之后的异常记录发出通知信息,能够在待监控系统出现异常时及时发出通知信息;可视化展示待监控系统出现的异常信息,便于查找和检索待监控系统出现的各种异常。
[0127] 上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。