亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

一種數(shù)據(jù)獲取方法、分析方法及系統(tǒng)與流程

文檔序號(hào):11154868閱讀:350來(lái)源:國(guó)知局
一種數(shù)據(jù)獲取方法、分析方法及系統(tǒng)與制造工藝

本發(fā)明涉及數(shù)據(jù)處理技術(shù),具體的講是一種數(shù)據(jù)獲取方法、分析方法及系統(tǒng)。



背景技術(shù):

現(xiàn)有技術(shù)中,對(duì)業(yè)務(wù)進(jìn)行統(tǒng)計(jì)分析的實(shí)現(xiàn)方式中,對(duì)被測(cè)程序的源代碼具有侵入性,要么引入了第三方的工具包,并按工具包的要求編寫(xiě)代碼記錄業(yè)務(wù)信息,要么不引入第三方包,自己實(shí)現(xiàn)記錄log,或者數(shù)據(jù)庫(kù)。而這樣的實(shí)現(xiàn)方式帶來(lái)的問(wèn)題是,業(yè)務(wù)統(tǒng)計(jì)分析的代碼帶來(lái)了維護(hù)成本,不容易靈活地去做變更,更關(guān)鍵地是,這樣的實(shí)現(xiàn)方式依賴(lài)于源代碼,對(duì)沒(méi)有源代碼的部分,無(wú)法追蹤。

即,現(xiàn)有技術(shù)對(duì)運(yùn)行程序數(shù)據(jù)的獲取,存在依賴(lài)源碼,或?qū)Ρ粶y(cè)系統(tǒng)源碼有侵入性等問(wèn)題,即增加了系統(tǒng)的耦合性,導(dǎo)致維護(hù)成本大大提高。



技術(shù)實(shí)現(xiàn)要素:

為提供一種程序運(yùn)行時(shí)的數(shù)據(jù)獲取方法并利用獲取的數(shù)據(jù)對(duì)程序性能參數(shù)進(jìn)行分析,本發(fā)明實(shí)施例提供了一種數(shù)據(jù)獲取方法,包括:

根據(jù)目標(biāo)代碼預(yù)先對(duì)應(yīng)用服務(wù)器進(jìn)行參數(shù)化配置;

應(yīng)用服務(wù)器根據(jù)參數(shù)化配置對(duì)被測(cè)程序進(jìn)行埋點(diǎn);

被測(cè)程序運(yùn)行時(shí)觸發(fā)埋點(diǎn)獲取程序運(yùn)行時(shí)的數(shù)據(jù)。

本發(fā)明實(shí)施例中,所述的應(yīng)用服務(wù)器根據(jù)參數(shù)化配置對(duì)被測(cè)程序進(jìn)行埋點(diǎn)包括:

應(yīng)用服務(wù)器根據(jù)參數(shù)化配置在函數(shù)的入口處和出口處對(duì)被測(cè)程序進(jìn)行埋點(diǎn)。

本發(fā)明實(shí)施例中,所述的程序運(yùn)行時(shí)的數(shù)據(jù)包括:被測(cè)程序代碼執(zhí)行過(guò)程中的函數(shù)調(diào)用數(shù)據(jù),所述的函數(shù)調(diào)用數(shù)據(jù)包括:調(diào)用函數(shù)的程序執(zhí)行時(shí)間、調(diào)用函數(shù)的參數(shù)及訪問(wèn)數(shù)據(jù)。

本發(fā)明實(shí)施例中,所述的被測(cè)程序?yàn)镴ava程序。

同時(shí),本發(fā)明還提供一種數(shù)據(jù)分析方法,法包括:

根據(jù)目標(biāo)代碼預(yù)先對(duì)應(yīng)用服務(wù)器進(jìn)行參數(shù)化配置;

應(yīng)用服務(wù)器根據(jù)參數(shù)化配置對(duì)被測(cè)程序進(jìn)行埋點(diǎn);

被測(cè)程序運(yùn)行時(shí)觸發(fā)埋點(diǎn)獲取程序運(yùn)行時(shí)的數(shù)據(jù);

根據(jù)獲取的程序運(yùn)行時(shí)的數(shù)據(jù)生成數(shù)據(jù)分析結(jié)果。

本發(fā)明實(shí)施例中,所述的應(yīng)用服務(wù)器根據(jù)參數(shù)化配置對(duì)被測(cè)程序進(jìn)行埋點(diǎn)包括:

應(yīng)用服務(wù)器根據(jù)參數(shù)化配置在函數(shù)的入口處和出口處對(duì)被測(cè)程序進(jìn)行埋點(diǎn)。

本發(fā)明實(shí)施例中,所述的程序運(yùn)行時(shí)的數(shù)據(jù)包括:被測(cè)程序代碼執(zhí)行過(guò)程中的函數(shù)調(diào)用數(shù)據(jù),所述的函數(shù)調(diào)用數(shù)據(jù)包括:調(diào)用函數(shù)的程序執(zhí)行時(shí)間、調(diào)用函數(shù)的參數(shù)及訪問(wèn)數(shù)據(jù)。

本發(fā)明實(shí)施例中,所述的根據(jù)獲取的程序運(yùn)行時(shí)的數(shù)據(jù)生成數(shù)據(jù)分析結(jié)果包括:

根據(jù)被測(cè)程序代碼執(zhí)行過(guò)程中的調(diào)用函數(shù)的程序執(zhí)行時(shí)間生成性能分析結(jié)果;

根據(jù)被測(cè)程序代碼執(zhí)行過(guò)程中的調(diào)用函數(shù)的參數(shù)生成安全分析結(jié)果;

根據(jù)被測(cè)程序代碼執(zhí)行過(guò)程中的調(diào)用函數(shù)的訪問(wèn)數(shù)據(jù)生成訪問(wèn)行為分析結(jié)果。

本發(fā)明實(shí)施例中,所述的被測(cè)程序?yàn)镴ava程序。

進(jìn)一步,本發(fā)明還提供一種數(shù)據(jù)分析系統(tǒng),系統(tǒng)包括應(yīng)用服務(wù)器和數(shù)據(jù)處理器;

所述的應(yīng)用服務(wù)器包括:

配置模塊,用于根據(jù)目標(biāo)代碼預(yù)先對(duì)應(yīng)用服務(wù)器進(jìn)行參數(shù)化配置;

埋點(diǎn)模塊,用于根據(jù)參數(shù)化配置對(duì)被測(cè)程序進(jìn)行埋點(diǎn);

數(shù)據(jù)獲取模塊,用于被測(cè)程序運(yùn)行時(shí)觸發(fā)埋點(diǎn)獲取程序運(yùn)行時(shí)的數(shù)據(jù);

所述的數(shù)據(jù)處理器,用于根據(jù)獲取的程序運(yùn)行時(shí)的數(shù)據(jù)生成數(shù)據(jù)分析結(jié)果。

本發(fā)明提供的數(shù)據(jù)獲取方法、分析方法及系統(tǒng),對(duì)被測(cè)系統(tǒng)無(wú)需額外改造,以應(yīng)用服務(wù)器埋點(diǎn)方式記錄了方法的調(diào)用參數(shù),耗時(shí)等信息。遵循標(biāo)準(zhǔn)接口去埋點(diǎn),具有良好的適配性,且可以按需要進(jìn)行定制,具有良好的擴(kuò)展性。服務(wù)端的分析組件能從各個(gè)維度分析數(shù)據(jù),可按需要擴(kuò)展,提升了數(shù)據(jù)利用的價(jià)值。能進(jìn)行靈活的配置,能和服務(wù)端靈活通信和控制,系統(tǒng)整體設(shè)計(jì)的耦合度較低,靈活性較高。

為讓本發(fā)明的上述和其他目的、特征和優(yōu)點(diǎn)能更明顯易懂,下文特舉較佳實(shí)施例,并配合所附圖式,作詳細(xì)說(shuō)明如下。

附圖說(shuō)明

為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。

圖1為本發(fā)明公開(kāi)的數(shù)據(jù)獲取方法的流程圖;

圖2為本發(fā)明實(shí)施方式的系統(tǒng)架構(gòu)圖;

圖3為本發(fā)明實(shí)施例中的代碼截圖;

圖4為本發(fā)明實(shí)施例中的代碼截圖;

圖5為本發(fā)明實(shí)施例中的代碼截圖;

圖6為本發(fā)明實(shí)施例中的代碼截圖;

圖7為本發(fā)明實(shí)施例中的代碼截圖;

圖8為本發(fā)明實(shí)施例中的代碼截圖;

圖9為本發(fā)明實(shí)施例中的一個(gè)樹(shù)形調(diào)用結(jié)構(gòu)框圖;

圖10為本發(fā)明實(shí)施例中服務(wù)器端組件框圖。

具體實(shí)施方式

下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。

如圖1所示,為本發(fā)明提供一種數(shù)據(jù)獲取方法,其包括:

步驟S101,根據(jù)目標(biāo)代碼預(yù)先對(duì)應(yīng)用服務(wù)器進(jìn)行參數(shù)化配置;

步驟S102,應(yīng)用服務(wù)器根據(jù)參數(shù)化配置對(duì)被測(cè)程序進(jìn)行埋點(diǎn);

步驟S103,被測(cè)程序運(yùn)行時(shí)觸發(fā)埋點(diǎn)獲取程序運(yùn)行時(shí)的數(shù)據(jù)。

本發(fā)明實(shí)施例中,所述的程序運(yùn)行時(shí)的數(shù)據(jù)包括:被測(cè)程序代碼執(zhí)行過(guò)程中的函數(shù)調(diào)用數(shù)據(jù),所述的函數(shù)調(diào)用數(shù)據(jù)包括:調(diào)用函數(shù)的程序執(zhí)行時(shí)間、調(diào)用函數(shù)的參數(shù)及訪問(wèn)數(shù)據(jù)。

本發(fā)明的技術(shù)方案其特點(diǎn)是能對(duì)程序運(yùn)行的函數(shù)代碼做采樣和分析,具體來(lái)說(shuō)是在函數(shù)的入口和出口進(jìn)行埋點(diǎn)采樣,并可以按需要對(duì)函數(shù)輸入?yún)?shù)做記錄,本發(fā)明的實(shí)施例中,一份完整的采樣記錄是一個(gè)樹(shù)形結(jié)構(gòu),其有且僅有一個(gè)根節(jié)點(diǎn),樹(shù)的節(jié)點(diǎn)表示一次函數(shù)調(diào)用,當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)表示當(dāng)前節(jié)點(diǎn)的函數(shù)調(diào)用了子節(jié)點(diǎn)函數(shù)。對(duì)業(yè)務(wù)相關(guān)的處理函數(shù)來(lái)說(shuō),其輸入?yún)?shù)通常都有很強(qiáng)的業(yè)務(wù)相關(guān)性,只要獲取了這些輸入?yún)?shù),就可以對(duì)業(yè)務(wù)統(tǒng)計(jì)分析。

現(xiàn)有的對(duì)業(yè)務(wù)進(jìn)行統(tǒng)計(jì)分析的實(shí)現(xiàn)方式中,對(duì)被測(cè)程序的源代碼具有侵入性,要么引入了第三方的工具包,并按工具包的要求編寫(xiě)代碼記錄業(yè)務(wù)信息,要么不引入第三方包,自己實(shí)現(xiàn)記錄log,或者數(shù)據(jù)庫(kù)。而這樣的實(shí)現(xiàn)方式帶來(lái)的問(wèn)題是,業(yè)務(wù)統(tǒng)計(jì)分析的代碼帶來(lái)了維護(hù)成本,不容易靈活地去做變更,更關(guān)鍵地是,這樣的實(shí)現(xiàn)方式依賴(lài)于源代碼,對(duì)沒(méi)有源代碼的部分,無(wú)法追蹤。而本案解決了這樣的痛點(diǎn):不需要被測(cè)程序的源代碼,對(duì)被測(cè)程序沒(méi)有侵入性,可隨時(shí)打開(kāi)或關(guān)閉追蹤功能,將數(shù)據(jù)的獲取與分析分離,并提供了豐富的分析功能。

如圖2所示,為本發(fā)明實(shí)施方式的系統(tǒng)架構(gòu)圖,Java的應(yīng)用程序一般是部署在應(yīng)用服務(wù)器202(本發(fā)明實(shí)施例中應(yīng)用服務(wù)器包括:weblogic,jboss,tomcat等)上的,當(dāng)然也可能是獨(dú)立的程序不需要應(yīng)用服務(wù)器。但是不論應(yīng)用部署方式如何,都需要在程序啟動(dòng)時(shí)加載agent,而agent會(huì)對(duì)應(yīng)用程序代碼進(jìn)行埋點(diǎn),并將埋點(diǎn)獲得的數(shù)據(jù)傳回?cái)?shù)據(jù)處理服務(wù)器server202,由數(shù)據(jù)處理服務(wù)器202對(duì)數(shù)據(jù)進(jìn)行進(jìn)一步分析。

應(yīng)用服務(wù)器Agent節(jié)點(diǎn)。Agent的任務(wù)包括:完成代碼埋點(diǎn);將收集到的數(shù)據(jù)傳到服務(wù)端;接收服務(wù)端的控制指令。代碼埋點(diǎn)只在函數(shù)的入口和出口處,此外,并不是每處函數(shù)入口參數(shù)都做記錄,而只在必要的地方(如url訪問(wèn)入口)記錄,這樣設(shè)計(jì)的原因在于,一方面在于用戶(hù)基本只關(guān)心部分組件的訪問(wèn)參數(shù)記錄,另一方面在于由于程序自身的內(nèi)在邏輯關(guān)聯(lián),可以大致推導(dǎo)前續(xù)的訪問(wèn)參數(shù)序列或后續(xù)的訪問(wèn)參數(shù)序列,甚至于可以根據(jù)關(guān)鍵參數(shù)在測(cè)試環(huán)境中還原整個(gè)運(yùn)行過(guò)程,所以,記錄關(guān)鍵的入口參數(shù)基本就滿(mǎn)足了分析需要。同理,函數(shù)返回參數(shù)基本是不記錄的,因?yàn)榭梢酝ㄟ^(guò)輸入?yún)?shù)計(jì)算出返回參數(shù),如確有需要(如統(tǒng)計(jì)返回的應(yīng)答碼),本案支持以配置或擴(kuò)展的方式記錄返回參數(shù)。

本發(fā)明實(shí)施例中,Agent埋點(diǎn)是標(biāo)準(zhǔn)的方式,簡(jiǎn)要說(shuō)明如下:

Java程序啟動(dòng)方式是找到main函數(shù)入口并執(zhí)行,舉例寫(xiě)了一個(gè)Helloword的程序,里面包含一個(gè)main函數(shù),則運(yùn)行這個(gè)Helloword程序的方式是:java Helloword。要加載agent,就要將啟動(dòng)方式改為java-javaagent:agent.jar Helloword。-javaagent參數(shù)是java原生支持的接口,本案agent端的實(shí)現(xiàn)就是利用這一接口。所以,應(yīng)用如果部署在weblogic上,我們需要將agent的jar包放到weblogic的bin目錄下,并修改bin目錄下weblogic的啟動(dòng)腳本,讓其帶上-javaagent的參數(shù)即可。其它應(yīng)用服務(wù)器的如jboss,tomcat,過(guò)程與weblogic類(lèi)似,只是目錄結(jié)構(gòu),腳本不一樣而已。Agent和server之間的通信通過(guò)參數(shù)進(jìn)行配置。Agent的配置參數(shù)主要包括:include,exclude表示哪些代碼需要埋點(diǎn)或不埋點(diǎn);ip,port表示數(shù)據(jù)處理server端的通信地址;localport表示agent監(jiān)聽(tīng)端口,用來(lái)接收服務(wù)端的啟停等命令;localfile表示agent將數(shù)據(jù)寫(xiě)入本地文件的路徑。

數(shù)據(jù)處理服務(wù)器Server節(jié)點(diǎn)。Server節(jié)點(diǎn)的任務(wù)包括:接收agent的數(shù)據(jù);完成多樣的數(shù)據(jù)分析;對(duì)agent進(jìn)行啟停等控制。Server端通過(guò)socket接收agent的數(shù)據(jù),并記庫(kù),供后續(xù)分析。數(shù)據(jù)的分析包括,訪問(wèn)入口分析,安全分析,性能分析等。Agent提供啟停接口是為了靈活控制,譬如只收集某段時(shí)間的數(shù)據(jù)。

本發(fā)明實(shí)施例系統(tǒng)的可擴(kuò)展性:

當(dāng)被測(cè)系統(tǒng)越來(lái)越多時(shí),我們需要在每個(gè)被測(cè)系統(tǒng)上部署Agent,這是個(gè)一次性的操作。所以有多少被測(cè)系統(tǒng)就有多少agent節(jié)點(diǎn)存在。但server節(jié)點(diǎn)則可以按需分配,如果某server節(jié)點(diǎn)處理能力較強(qiáng),則可以考慮接收多個(gè)agent的數(shù)據(jù),如果server節(jié)點(diǎn)不夠用了,則可以考慮擴(kuò)充server節(jié)點(diǎn)。出于高可用考慮,如果agent發(fā)現(xiàn)某server不可用,可以將數(shù)據(jù)寫(xiě)入本地文件中,后續(xù)將文件導(dǎo)入server端即可。

對(duì)本發(fā)明實(shí)施例的Agent端埋點(diǎn)說(shuō)明:

Agent埋點(diǎn)范圍可以通過(guò)include,exclude進(jìn)行參數(shù)化配置。埋點(diǎn)的技術(shù)原理在于java是基于字節(jié)碼解釋執(zhí)行的,只需要對(duì)目標(biāo)程序的字節(jié)碼進(jìn)行修改得到一份新的字節(jié)碼,java虛擬機(jī)執(zhí)行新的字節(jié)碼,觸發(fā)埋點(diǎn)代碼就可以進(jìn)行數(shù)據(jù)收集。本案對(duì)目標(biāo)程序字節(jié)碼的修改并不修改原程序的執(zhí)行邏輯,只是在方法的入口處加入一段字節(jié)碼表示方法調(diào)用開(kāi)始,并在方法的出口處(如返回指令return)之前加入一段字節(jié)碼表示方法調(diào)用結(jié)束,追蹤記錄一系列的調(diào)用開(kāi)始和結(jié)束事件,就形成了方法在運(yùn)行時(shí)的樹(shù)形調(diào)用結(jié)構(gòu)數(shù)據(jù)。

為完成字節(jié)碼埋點(diǎn)任務(wù),本發(fā)明實(shí)施例可采用java字節(jié)碼操作工具asm,但并不以此為限。本發(fā)明實(shí)施例中agent埋點(diǎn)的一個(gè)特別考慮的地方是基于技術(shù)規(guī)范、標(biāo)準(zhǔn)接口去埋點(diǎn),使agent能適應(yīng)程序代碼的不同實(shí)現(xiàn)。舉例而言,java定義了數(shù)據(jù)操作的接口類(lèi)如Connection,PreparedStatment等,并定義了接口類(lèi)的相關(guān)函數(shù),而DB2,mysql的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序基于接口定義給出了不同的實(shí)現(xiàn),本案基于接口函數(shù)定義去進(jìn)行埋點(diǎn),就能適應(yīng)不同的實(shí)現(xiàn)。同時(shí),如果確有需要,如針對(duì)DB2做埋點(diǎn)優(yōu)化,也可以定制agent進(jìn)行特殊處理。

以一個(gè)簡(jiǎn)單的例子,說(shuō)明如何埋點(diǎn)。參考如圖3所示的代碼片段,Calc類(lèi)有一個(gè)做整數(shù)加法的函數(shù)add,該函數(shù)編譯后的字節(jié)碼截圖如圖4所示,其只列出了核心的字節(jié)碼指令,略去了一些不影響函數(shù)執(zhí)行補(bǔ)充信息指令,如表示行信息的LINENUMBER指令。JAVA字節(jié)碼指令中,I表示int,ILOAD表示從某位置加載int,ISTORE表示將int存入某位置,IRETURN表示返回int值。

在add函數(shù)入口埋點(diǎn),埋點(diǎn)邏輯要放在任何add函數(shù)的指令執(zhí)行之前,即L0之前。在add函數(shù)出口埋點(diǎn),埋點(diǎn)邏輯要放在返回指令之前,即IRETURN指令之前。如果是對(duì)源碼做改動(dòng)達(dá)成埋點(diǎn)的目的,則源碼可能是如圖5所示的形式,其中的StartEnd類(lèi)的start方法和end方法,對(duì)add方法的入口和出口信息進(jìn)行了捕捉。本例StartEnd只是做了簡(jiǎn)單的輸出,代碼截圖如圖6所示。

本申請(qǐng)的技術(shù)方案不依賴(lài)源代碼,直接修改字節(jié)碼完成了埋點(diǎn),原理是使用字節(jié)碼修改工具,在方法入口出口處插入函數(shù)調(diào)用INVOKE指令。埋點(diǎn)后的add函數(shù)字節(jié)碼的截圖如圖7所示。

本發(fā)明實(shí)施例中的埋點(diǎn),具體是利用了INVOKESTATIC函數(shù)調(diào)用指令,INVOKESTATIC指令之前的LDC,ILOAD指令是為函數(shù)調(diào)用傳入?yún)?shù),如此,就達(dá)到了和修改源代碼一樣的埋點(diǎn)效果。將埋點(diǎn)完后的add方法交由JAVA虛擬機(jī)執(zhí)行,就會(huì)觸發(fā)埋點(diǎn),收集到add方法執(zhí)行的信息??偨Y(jié)分析字節(jié)碼時(shí),入口和出口識(shí)別規(guī)律:在訪問(wèn)了方法的名稱(chēng)參數(shù)等信息后,接下來(lái)就是函數(shù)的入口,此時(shí)進(jìn)行入口埋點(diǎn),使函數(shù)的所有指令在入口埋點(diǎn)之后。在訪問(wèn)到返回指令時(shí),如IRETURN,FRETURN等,先進(jìn)行出口埋點(diǎn),再訪問(wèn)返回指令,使出口埋點(diǎn)在返回指令之前。特別注意的是,函數(shù)的入口有且僅有一個(gè),但出口可以有多個(gè),所以,一個(gè)函數(shù)可能進(jìn)行多次出口埋點(diǎn)。

本實(shí)施例中如何確認(rèn)方法的開(kāi)始和結(jié)束:

在前面的例子中,分別調(diào)用start和end方法,來(lái)進(jìn)行入口和出口埋點(diǎn),示例代碼只是進(jìn)行了輸出,而要準(zhǔn)確匹配方法的開(kāi)始和結(jié)束,需要處理好父子函數(shù)調(diào)用關(guān)系。為此,本案設(shè)計(jì)了MethodFrame的數(shù)據(jù)結(jié)構(gòu),其包含一個(gè)指向父調(diào)用的引用,還包含當(dāng)前方法的名稱(chēng)、參數(shù)等信息。處理流程如下:

1、發(fā)生start調(diào)用,表示方法執(zhí)行開(kāi)始,為該start調(diào)用創(chuàng)建MethodFrame數(shù)據(jù)結(jié)構(gòu),記為c。如果當(dāng)前線(xiàn)程調(diào)用的MethodFrame信息為空,則此start調(diào)用是調(diào)用的根,且c.parent=null。如果當(dāng)前線(xiàn)程調(diào)用的MethodFrame信息不為空,記為p,更新c.parent=p,且更新當(dāng)前線(xiàn)程調(diào)用的MethodFrame信息為c,即由p變更為c。

2、發(fā)生end調(diào)用,表示方法執(zhí)行完畢,取得當(dāng)前線(xiàn)程調(diào)用的MethodFrame信息,記為c,并取得c的parent信息,記為p,即p=c.parent。將當(dāng)前線(xiàn)程調(diào)用的MethodFrame信息更新為p,即由c變更為p。如果p==null,表示根調(diào)用結(jié)束,此時(shí),我們已經(jīng)拿到了完整的父子調(diào)用關(guān)系,保存該調(diào)用關(guān)系供后續(xù)分析。如果p不為null,表明還要處理更多的start-end調(diào)用事件。

舉例:假設(shè)有如下start-end序列:start(a)start(b)end(b)start(c)start(d)end(d)end(c)end(a)。則由上面兩步處理可得:a是根調(diào)用,b的parent是a,c的parent也是a,即a分別調(diào)用了b和c。d的parent是c,即c調(diào)用了d。

埋點(diǎn)數(shù)據(jù)的時(shí)序說(shuō)明:

以一個(gè)簡(jiǎn)化的查看訂單的網(wǎng)頁(yè)訪問(wèn)為例,假定應(yīng)用程序部署在jboss應(yīng)用服務(wù)器上,可能的過(guò)程如下:

(1)用戶(hù)在瀏覽器上,訪問(wèn)http://www.buy.com/order/listall.action?userid=1001;

(2)Jboss服務(wù)器收到請(qǐng)求,并將請(qǐng)求分配到能處理/order/listall.action這個(gè)url的http處理類(lèi)中。如果沒(méi)有對(duì)應(yīng)的處理類(lèi),則返回HTTP 404應(yīng)答。此處我們假定有相應(yīng)的http處理類(lèi)存在;

(3)為了返回訂單信息在網(wǎng)頁(yè)上展示,http處理類(lèi)訪問(wèn)了數(shù)據(jù)庫(kù)。即http處理類(lèi)又調(diào)用了數(shù)據(jù)庫(kù)的連接獲取函數(shù),并執(zhí)行了sql語(yǔ)句(可能是select*from orders where userid=1001)進(jìn)行數(shù)據(jù)庫(kù)查詢(xún);

(4)用戶(hù)在網(wǎng)頁(yè)上產(chǎn)看到了訂單信息。

本例中,應(yīng)用的訪問(wèn)入口是http協(xié)議暴露的url(/order/listall.action),并帶上了訪問(wèn)參數(shù)(userid=1001),在實(shí)際應(yīng)用中,一般會(huì)暴露多個(gè)url訪問(wèn)入口,并配合使用各自的訪問(wèn)參數(shù)。Jboss是基于J2EE規(guī)范標(biāo)準(zhǔn)的應(yīng)用服務(wù)器,而J2EE規(guī)范中,重要的一部分就是servlet規(guī)范?,F(xiàn)階段servlet的實(shí)現(xiàn),主要還是對(duì)http協(xié)議做面向?qū)ο蟮姆庋b,如將請(qǐng)求封裝成HttpServletRequest對(duì)象,響應(yīng)封裝成HttpServletResponse對(duì)象。Servlet的接口規(guī)范中定義了2個(gè)函數(shù),service(HttpServletRequest request,HttpServletResponse response)和doFilter(ServletRequest request,ServletResponse response,FilterChain chain),本案的實(shí)現(xiàn)就是對(duì)service和doFilter這樣的標(biāo)準(zhǔn)函數(shù)做埋點(diǎn),并對(duì)函數(shù)的輸入?yún)?shù)做了處理,獲取了http訪問(wèn)的url和參數(shù)。而weblogic和tomcat都是基于J2EE規(guī)范的服務(wù)器,所以,本案的實(shí)現(xiàn)方式具有通用性。此外,如果應(yīng)用不是J2EE的程序,即采用了新的標(biāo)準(zhǔn)或新的實(shí)現(xiàn)方式,本案也還是可以做支持,引入的額外工作是要類(lèi)似分析J2EE規(guī)范一樣去分析新的標(biāo)準(zhǔn)和實(shí)現(xiàn)方式。

以service(HttpServletRequest request,HttpServletResponse response)為例,可以從第一個(gè)參數(shù)request對(duì)象中獲取請(qǐng)求的url,因?yàn)閞equest對(duì)象暴露了標(biāo)準(zhǔn)的getRequestURI()函數(shù)來(lái)分別獲取請(qǐng)求url。本案的處理方式是在入口埋點(diǎn)時(shí),先調(diào)用request對(duì)象的getRequestURI()函數(shù)拿到url值,并將url值傳給埋點(diǎn)的start函數(shù),這樣start調(diào)用發(fā)生時(shí),創(chuàng)建的MethodFrame信息就記錄到了該url值。此番操作插入的字節(jié)碼如圖8的代碼截圖所示。

本發(fā)明實(shí)施例中訪問(wèn)參數(shù)的獲取也是類(lèi)似,調(diào)用request對(duì)象的getParameterMap()函數(shù)拿到結(jié)果值,并將該結(jié)果值傳給start函數(shù)即可,將url和參數(shù)獲取一并處理,稍稍復(fù)雜一點(diǎn),即要插入更多的字節(jié)碼來(lái)完成工作,但原理都是一致的。

假定本例第(2)步,是由一個(gè)processHttp的函數(shù)作為入口處理http的請(qǐng)求,并調(diào)用了函數(shù)isEmpty對(duì)參數(shù)userid進(jìn)行是否為空的判斷,接著調(diào)用了queryDB的函數(shù)進(jìn)行數(shù)據(jù)庫(kù)查詢(xún)。本例第3步,進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn),假定由queryDB函數(shù)完成。數(shù)據(jù)庫(kù)訪問(wèn)也有相應(yīng)的標(biāo)準(zhǔn)接口函數(shù)定義,如prepareStatement(String sql)函數(shù),在此不一一枚舉,本案也對(duì)這種標(biāo)準(zhǔn)接口函數(shù)做了埋點(diǎn),獲取訪問(wèn)數(shù)據(jù)庫(kù)的sql語(yǔ)句。具體到本例,假定queryDB函數(shù)調(diào)用了prepareStatement函數(shù)進(jìn)行數(shù)據(jù)庫(kù)查詢(xún),則其執(zhí)行的sql語(yǔ)句(select*from orders where userid=1001)將會(huì)被記錄下來(lái)。生成一樹(shù)形調(diào)用結(jié)構(gòu),如圖9所示,為本實(shí)施例生成的一樹(shù)形調(diào)用結(jié)構(gòu)圖,用戶(hù)的每一次訪問(wèn)都會(huì)得到一份調(diào)用結(jié)構(gòu)數(shù)據(jù),agent負(fù)責(zé)將這些數(shù)據(jù)傳給server端。

Server端主要組件說(shuō)明,如圖10所示,下面對(duì)server端主要組件做說(shuō)明。

通訊組件:負(fù)責(zé)網(wǎng)絡(luò)通訊,主要任務(wù)包括接收來(lái)自agent的數(shù)據(jù)以及對(duì)agent的收集做開(kāi)始、停止這樣的控制操作。

性能分析組件:對(duì)抓取的數(shù)據(jù)做性能統(tǒng)計(jì)分析。Agent在對(duì)方法埋點(diǎn)的時(shí)候,記錄了方法開(kāi)始和結(jié)束的時(shí)間,以此為依據(jù)對(duì)方法耗時(shí)進(jìn)行統(tǒng)計(jì)分析。方法的總執(zhí)行時(shí)間是方法自身邏輯執(zhí)行時(shí)間和該方法調(diào)用的其他方法耗時(shí)的和值,方法的凈執(zhí)行時(shí)間是方法的總執(zhí)行時(shí)間減去該方法調(diào)用其他方法耗時(shí)的差值。用圖2的樹(shù)形調(diào)用結(jié)構(gòu)來(lái)說(shuō),某節(jié)點(diǎn)的總耗時(shí)包含了該節(jié)點(diǎn)的所有直接子節(jié)點(diǎn)耗時(shí)以及自身耗時(shí),某節(jié)點(diǎn)的凈耗時(shí)是總耗時(shí)減去所有直接子節(jié)點(diǎn)耗時(shí)。性能分析組件主要是按特征進(jìn)行分類(lèi)統(tǒng)計(jì)。如以系統(tǒng)的url為特征進(jìn)行分類(lèi),統(tǒng)計(jì)每個(gè)url訪問(wèn)的最短處理時(shí)間,最長(zhǎng)處理時(shí)間,平均處理時(shí)間等。此外,通常應(yīng)用的數(shù)據(jù)庫(kù)訪問(wèn)是比較耗時(shí)的,性能分析組件會(huì)特別地對(duì)sql語(yǔ)句進(jìn)行分析,指出哪些sql執(zhí)行耗時(shí)較多,需要優(yōu)化性能。如果需要以自定義的維度進(jìn)行分析,可以對(duì)組件進(jìn)行擴(kuò)展。

安全分析組件:程序的訪問(wèn)入口可能接收到惡意的訪問(wèn)參數(shù),引發(fā)數(shù)據(jù)泄露、程序異常等安全問(wèn)題。Agent埋點(diǎn)時(shí),在方法入口處會(huì)記錄方法的參數(shù),安全分析組件以此為基礎(chǔ)進(jìn)行安全分析。安全分析組件提供兩方面的功能:一是識(shí)別惡意訪問(wèn)參數(shù)和程序異常,給出安全優(yōu)化建議;二是以正常參數(shù)為基礎(chǔ),變異構(gòu)造出異常參數(shù),并以該異常參數(shù)訪問(wèn)程序,對(duì)程序做安全評(píng)估。就前文查看訂單的例子來(lái)說(shuō),用戶(hù)訪問(wèn)/order/listall.action這個(gè)url時(shí),提供了參數(shù)userid=1001,其中key是userid,value是1001,而1001這個(gè)值,會(huì)作為參數(shù)傳遞到后續(xù)的數(shù)據(jù)庫(kù)訪問(wèn)操作中,如果應(yīng)用程序沒(méi)有做防御機(jī)制,則就可能引起sql注入這一安全問(wèn)題。安全分析組件會(huì)分析訪問(wèn)參數(shù)的<key,value>對(duì)的分布情況,包括是否出現(xiàn)了新的訪問(wèn)key值,是否key對(duì)應(yīng)的value出現(xiàn)新的類(lèi)型。具體到上例就是,是否出現(xiàn)了userid之外的key作為輸入,如開(kāi)源框架struts就曾發(fā)生過(guò)對(duì)http參數(shù)解析導(dǎo)致的任意代碼執(zhí)行漏洞,而這個(gè)漏洞是在訪問(wèn)時(shí)帶上額外參數(shù)觸發(fā);是否userid的值出現(xiàn)了新的類(lèi)型,如‘or 1=1是一種已知常見(jiàn)的sql攻擊向量,則如果參數(shù)值出現(xiàn)了‘or 1=1就很可能是惡意的訪問(wèn)行為,同理,安全組件通過(guò)修改正常訪問(wèn)參數(shù)為攻擊向量進(jìn)行訪問(wèn),就可以對(duì)應(yīng)用做安全評(píng)估。對(duì)常見(jiàn)的風(fēng)險(xiǎn)如sql注入攻擊,安全分析組件會(huì)對(duì)執(zhí)行的sql進(jìn)行分析,判斷是否使用了安全的api函數(shù),以及有沒(méi)有sql注入發(fā)生。

訪問(wèn)行為分析組件:主要通過(guò)對(duì)訪問(wèn)數(shù)據(jù)進(jìn)行在線(xiàn)或離線(xiàn)的挖掘分析,識(shí)別用戶(hù)的行為特征,用戶(hù)來(lái)源,偏好,留存率,活躍程度等。行為分析同時(shí)有助于測(cè)試人員對(duì)測(cè)試場(chǎng)景,案例進(jìn)行查漏補(bǔ)缺。對(duì)不同的應(yīng)用來(lái)說(shuō),需要識(shí)別的用戶(hù)特征一般會(huì)有所不同。對(duì)搜索類(lèi)應(yīng)用來(lái)說(shuō),可能需要識(shí)別頻度最高的關(guān)鍵詞;對(duì)資訊類(lèi)應(yīng)用來(lái)說(shuō),可能需要識(shí)別訪問(wèn)的熱點(diǎn),如哪些url近期經(jīng)常被訪問(wèn);對(duì)購(gòu)物應(yīng)用來(lái)說(shuō),可能關(guān)注用戶(hù)從下訂單到支付的整體流程是否順暢,是否重復(fù)購(gòu)買(mǎi)等等。以上種種,本案可通過(guò)訪問(wèn)參數(shù)統(tǒng)計(jì)分析,url統(tǒng)計(jì)分析,訪問(wèn)序列分析實(shí)現(xiàn)。

本發(fā)明的技術(shù)方案對(duì)被測(cè)系統(tǒng)無(wú)需額外改造,以agent埋點(diǎn)方式記錄了方法的調(diào)用參數(shù),耗時(shí)等信息。agent遵循標(biāo)準(zhǔn)接口去埋點(diǎn),具有良好的適配性,且可以按需要進(jìn)行定制,具有良好的擴(kuò)展性。服務(wù)端的分析組件能從各個(gè)維度分析數(shù)據(jù),可按需要擴(kuò)展,提升了數(shù)據(jù)利用的價(jià)值。agent能進(jìn)行靈活的配置,能和服務(wù)端靈活通信和控制,系統(tǒng)整體設(shè)計(jì)的耦合度較低,靈活性較高。

本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明的實(shí)施例可提供為方法、系統(tǒng)、或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本發(fā)明可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤(pán)存儲(chǔ)器、CD-ROM、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。

本發(fā)明是參照根據(jù)本發(fā)明實(shí)施例的方法、設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來(lái)描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專(zhuān)用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過(guò)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。

這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。

這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。

本發(fā)明中應(yīng)用了具體實(shí)施例對(duì)本發(fā)明的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說(shuō)明只是用于幫助理解本發(fā)明的方法及其核心思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說(shuō)明書(shū)內(nèi)容不應(yīng)理解為對(duì)本發(fā)明的限制。

當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1