具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
图1示出了根据本发明一个实施例的性能监控系统100的示意图。如图1所示,根据本发明的性能监控系统100包括应用服务器200、客户端300以及性能监控服务器400。通常企业级的web应用会采用分布式的架构,在应用服务器200中包含实现企业各种业务逻辑的应用.应用服务器200可以直接与访问该应用服务器200的客户端300通信,或者会通过web服务器与客户端300进行通信。这样应用服务器200可以专注于业务逻辑的实现,并且应用服务器还与数据库进行耦接。这里,应用服务器200包括但不限于jboss、bea Weblogic及ibm webspere。web服务器为Apache、IIS和Iplanet的Enerprise等。
客户端300是指与应用服务器200进行通信的应用,可以驻留在计算设备或移动终端等智能终端中。例如,客户端300可以是浏览器或专用于访问该应用服务器200的客户端应用。性能监控服务器400可以收集应用服务器200以及客户端300的监控数据,以进行性能分析和对资源瓶颈进行判断。
图2示出了根据本发明一个实施例的应用服务器的示意图。如图2所示,根据本发明的应用服务器200包括配置存储器210、请求处理器230和处理引擎220。配置存储器210用于存储配置信息,该配置信息为处理引擎220处理数据和执行应用之前,对数据或应用进行预处理时使用的配置文件。例如,配置信息包括编译数据或应用时使用的编译配置选项和链接路径信息。进一步,配置信息中还可以包括监控指示信息,即指示要在其中插入监控信息的第一对象。这里的第一对象为处理引擎220处理或执行的对象。例如,第一对象可以是以各种解析语言编写的脚本,例如可执行的xml、jsp脚本等。当然,处理引擎220处理或执行的对象也可以包括不在其中插入监控信息的对象。
请求处理器230适于接收来自客户端300的访问请求,例如对xml或jsp的访问请求,然后请求处理器230会根据访问请求找到访问请求对应的对象(可由处理引擎220执行或处理),进而会根据配置信息确定该对象是否要插入监控信息的第一对象。相应地,当该对象为要插入监控信息的第一对象时,请求处理器230会通知处理引擎220进行与监控信息相关的操作。
处理引擎220根据配置信息对请求处理器230确定的第一对象进行处理或执行。具体地,处理引擎220加载和执行第一对象,并且会在进行加载和执行的过程中加入监控信息,然后生成具有监控信息的处理结果,即第二对象。请求处理器230会将该第二对象作为响应消息向客户端300发送。需要说明的是,这里加入监控信息的目的是为了监控客户端300的性能参数。因此,当客户端300执行该第二对象时,会根据监控信息执行对客户端300的监控操作,以便获取性能参数。例如,客户端300为浏览器,第二对象为浏览器加载的网页信息,这样在执行监控操作时,会获取诸如网页加载时间、脚本执行时间、代码执行错误、客户端版本信息、吞吐量、客户端资源消耗以及访问应用服务器200的响应时间等性能参数。客户端300还会在执行监控操作时,周期性向性能监控服务器400发送实时采集的性能参数,以便性能监控服务器400能够根据客户端300执行代码时获取的性能参数,进行客户端性能分析,以及对客户端300与应用服务器200的通信过程进行分析,从而能够快速定位资源瓶颈,提出解决方案。
此外,处理引擎220还包括性能监控器221,该监控器221可以在不更改应用服务器200原有代码基础上嵌入到应用服务器200中。该监控器221作为驻留在应用服务器中的监控组件,可以对应用服务器200处理客户端300访问请求等执行代码的过程进行监控,并且还会向性能监控服务器400发送服务器性能参数,以便性能监控服务器400根据客户端性能参数与服务器性能参数进行协同分析。
图3示出了根据本发明又一个实施例的应用服务器200的示意图。在根据本发明的应用服务器200中,配置信息存储器210、请求处理器230和处理引擎220可以运行在软件虚拟机240上,例如Java虚拟机(JVM)。
如图3所示,根据本发明的应用服务器上运行有JVM,在JVM上运行着配置信息存储器、请求处理器230以及处理引擎220。其中处理引擎还包括性能监控器221(Agent,探针)和类加载器(未示出)。性能监控器221为嵌入到应用服务器200中的监控组件。具体地,通过使用中间语言(例如Java)动态插装技术,允许在不改动应用服务器200原有的业务逻辑代码的基础上,以及在不安装任何SDK(软件集成开发工具)的情况下快速集成监控应用。这样在应用服务器200进行业务处理时,性能监控器221可以对应用服务器200针对客户端300访问请求的处理等执行代码的过程进行监控。同时,性能监控器221还可以对配置信息存储器210中的配置信息进行操作,以确定与监控信息与第一对象的关联关系。当客户端300访问应用服务器200时,请求处理器230会根据该访问请求,查找所请求的对象。当该对象为第一对象时,处理引擎220会执行插入监控信息的操作。
具体地,根据本发明的第一对象可以是利用各种解析语言编写的脚本语言,例如JSP脚本,而与第一对象关联的监控信息可以是JS脚本或者该JS脚本的链接信息。这里处理引擎220插入监控信息的方式可以有多种。在根据本发明的一个实施例中,处理引擎220包括了在第一对象加载之前,对JSP代码进行编译的JSP编译器。相应地,配置存储器210中的配置信息可以是yml配置文件。其中yml配置文件的示例如下:
该yml配置文件由Agent 221进行设置。在处理引擎220加载和执行第一对象之前,JSP编译器(未示出)会根据该配置文件对第一对象进行编译,并在编译过程中插入了监控信息(JS代码),以及在编译完成后生成class类文件。然后,类加载会将该第一对象对应的class类文件加载到执行该第一对象的运行时数据区(runtime data)。处理引擎220对运行时数据区中的class类文件进行执行,进而生成第二对象(例如,xml或html数据)。
在根据本发明的又一个实施例中,在类加载器加载class类时,通过类加载器将监控信息插入到class类中,进而处理引擎220执行已插入监控信息的class类,生成html网页,即第二对象。此外,处理引擎220还可以采用根据本发明的其他方式使第二对象具有监控信息,都应属于本发明的保护范围。
在上述各实施例中,请求处理器230可以将具有监控信息的第二对象作为响应消息向客户端发送。这样,客户端300在加载该响应消息时,可以根据监控信息进行监控操作。通常为了减少响应消息的网页的加载时间,监控信息包括监控脚本的链接地址,客户端300在加载第二对象时,会根据该连接地址获取监控脚本(例如js脚本)。此外,监控信息或所获取的监控脚本中具有标识信息(例如transactionName),该标识信息与应用服务器200的性能监控器221向性能监控服务器400发送的服务器端与处理第一对象相关的性能参数相对应,这样便于性能监控服务器400根据该标识信息将客户端300性能参数与其相对应在应用服务器200端获取的性能参数进行关联分析,以获取完整的性能分析和资源瓶颈定位。其中监控信息示例如下:
进一步,客户端的监控操作可以获取多种性能参数。
例如,性能参数包括客户端(例如浏览器)加载时间参数。其中用于获取网页加载时间的脚本代码示例如下:
在根据本发明一个实施例中,客户端300监控操作还包括获取浏览器的版本信息。
客户端300执行监控操作过程中,会周期性向性能监控服务器400发送所获取的客户端性能参数,并且如果网络异常,会进行后续的异步发送。其中向性能监控服务器发送客户端性能参数的代码示例如下:
进一步,根据本发明的性能监控服务器400会接收客户端300(例如浏览器或访问应用服务器的专用APP)和应用服务器200在进行通信和完成业务逻辑处理的过程中的相关性能参数。在实现业务逻辑处理的这个网络拓扑中,性能监控服务器400分别从客户端300和应用服务器400端获取了应用逻辑处理每个一个环节(例如用户的每一步操作)的处理性能参数,并可以通过所获取的性能参数识别出低效或者错误的代码并调优。此外,性能监控服务器400可以根据性能参数的将性能参数绘制成拓扑图进行可视化呈现。例如,图4为客户端300性能参数的显示示例,图5为企业的应用服务器200的性能参数的显示示例。
图6示出了根据本发明一个实施例的性能监控方法600的流程图。该方法600适于在应用服务器中执行。
如图6所示,该方法600始于步骤S610。在步骤S610中,存储配置信息,该配置信息指示要在其中插入监控信息的第一对象。根据本发明的一个实施例,这里所指的监控信息包括由应用服务器发送到客户端后,在客户端进行执行的监控脚本或该监控脚本的链接地址。而第一对象是应用服务器响应于客户端请求而执行或处理的数据(例如以各种解析语言编写的脚本,如JSP脚本等)数据对象。这些数据对象中适于加入监控信息(例如JS脚本或该脚本的链接)。
在步骤S620中,接收来自客户端的访问请求,并确定对应于该访问请求的第一对象。在该步骤中,当确定客户端的访问请求对应于多个对象中任一个时,会在后续步骤中执行监控信息的插入操作。否则,若客户端所请求的数据对象不属于第一对象,则在后续步骤中不会进行插入监控信息的操作。
在步骤S630中,加载并执行所确定的第一对象,并在对该第一对象进行所述加载和执行期间插入监控信息,以生成具有监控信息的第二对象。具体地,可以采用多种可选择的方式使得应用服务器根据第一对象生成的第二对象中具有监控信息。在根据本发明一个实施例中,在确定了第一对象(例如JSP脚本)后,首先将监控信息(例如JS脚本或脚本的链接地址)插入到第一对象内(例如插入到HTML数据的head部),然后加载并执行已插入监控信息的第一对象,进而生成第二对象。在又一个实施例中,首先对第一对象进行编译,然后在加载经过编译的第一对象时将监控信息插入到加载的数据中。例如,JVM中类加载器加载第一对象对应的class类,并会在加载过程中插入监控信息。这样,JVM所执行具有监控信息的class类,使得生成的第二对象中具有该监控信息。随后,在步骤S640中,将所生成的第二对象作为响应发送到所述客户端,以便在所述客户端执行所述第二对象时,会根据其中的监控信息来执行监控操作。这里,第二对象包括但不限于HTML、XML、JSON等格式的数据信息。客户端会在接收到这些数据信息时进行网页加载以及进一步的异步访问和异步执行,进而根据监控脚本对客户端与第一对象相关的整个业务处理和网络通信息过程中相关的性能参数进行监控。
例如,在浏览器中执行监控操作的一般过程为:浏览器在加载第二对象时,根据监控信息中的链接地址,请求和等待加载监控脚本(例如JS脚本),然后执行该监控脚本,对浏览器的版本信息、网页加载时间、业务处理时长等性能进行监控,获取客户端性能参数。
此外,性能监控方法600还包括对应用服务器的监控。
在步骤S650中,监控应用服务器对第一对象的处理性能,并获取相应的服务器性能参数。对第一对象的处理性能包括从应用服务器接收到客户端对第一对象的访问请求开始到生成第二对象为止的过程中、应用服务器的性能参数以及应用服务器对客户端加载第二对象期间发出的异步请求进行处理的过程中的性能参数。在步骤S660中,将该服务器性能参数发送给性能服务器,以便性能服务器统计并分析该服务器性能参数。
进一步,性能监控服务器接收应用服务器的性能参数和客户端的性能参数,进而根据性能参数进行多种统计分析。在根据本发明一个实施例中,性能监控服务器接收的性能参数包括服务器端处的第一对象的加载和执行时间以及该第一对象对应的第二对象在客户端的加载执行时间,这样性能监控服务器就能对在业务请求的完整处理过程中、客户端和应用服务器的整体性能进行准确分析,并且能够快速定位资源瓶颈和明确提高系统性能的改进方向。此外,性能监控服务器还可以接收由客户端和应用服务器发送的性能参数(例如,客户端的脚本执行时间、代码执行错误、客户端版本信息、吞吐量、客户端资源消耗以及访问应用服务器的响应时间。应用服务器端的服务器资源消耗以及应用服务器版本信息),这里不再一一赘述。
A1:根据本发明的性能监控方法,其中所述监控信息包括监控脚本的链接地址;以及所述执行监控操作的步骤包括:根据该链接地址加载该监控脚本;执行监控脚本以获取客户端性能参数,并将该客户端性能参数向性能服务器发送以便该性能服务器统计分析该客户端性能参数。A2:根据本发明的性能监控方法,还包括:监控应用服务器对所述第一对象的处理性能,并获取相应的服务器性能参数;以及将该服务器性能参数向所述性能服务器发送,以便性能服务器统计分析该服务器性能参数。A3:如A2所述的性能监控方法,其中所述客户端性能参数包括:所述第二对象的加载时间、脚本执行时间、代码执行错误、客户端版本信息、吞吐量、客户端资源消耗以及访问应用服务器的响应时间;以及所述服务器性能参数包括:所述第一对象的加载和执行时间、服务器资源消耗以及应用服务器版本信息。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下被实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员应当理解在本文所公开的示例中的设备的模块或单元或组件可以布置在如该实施例中所描述的设备中,或者可替换地可以定位在与该示例中的设备不同的一个或多个设备中。前述示例中的模块可以组合为一个模块或者此外可以分成多个子模块。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
此外,所述实施例中的一些在此被描述成可以由计算机系统的处理器或者由执行所述功能的其它装置实施的方法或方法元素的组合。因此,具有用于实施所述方法或方法元素的必要指令的处理器形成用于实施该方法或方法元素的装置。此外,装置实施例的在此所述的元素是如下装置的例子:该装置用于实施由为了实施该发明的目的的元素所执行的功能。
如在此所使用的那样,除非另行规定,使用序数词“第一”、“第二”、“第三”等等来描述普通对象仅仅表示涉及类似对象的不同实例,并且并不意图暗示这样被描述的对象必须具有时间上、空间上、排序方面或者以任意其它方式的给定顺序。
尽管根据有限数量的实施例描述了本发明,但是受益于上面的描述,本技术领域内的技术人员明白,在由此描述的本发明的范围内,可以设想其它实施例。此外,应当注意,本说明书中使用的语言主要是为了可读性和教导的目的而选择的,而不是为了解释或者限定本发明的主题而选择的。因此,在不偏离所附权利要求书的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。对于本发明的范围,对本发明所做的公开是说明性的,而非限制性的,本发明的范围由所附权利要求书限定。