本申請(qǐng)涉及數(shù)據(jù)處理技術(shù)領(lǐng)域,具體涉及一種用于程序跟蹤的方法、裝置及電子設(shè)備。本申請(qǐng)同時(shí)涉及一種流量控制方法、裝置及電子設(shè)備。
背景技術(shù):
在計(jì)算機(jī)科學(xué)中,一個(gè)大型程序通常是由多個(gè)子程序組成的。子程序作為一個(gè)大型程序中的某部份代碼,由一個(gè)或多個(gè)語(yǔ)句塊組成。子程序負(fù)責(zé)完成某項(xiàng)特定任務(wù),而且相較于其他代碼,具備相對(duì)的獨(dú)立性。子程序一般會(huì)有輸入?yún)?shù)并有返回值,能被其他程序調(diào)用,也可調(diào)用其他子程序,甚至可自身調(diào)用(如遞歸)。子程序的最后一條指令一定是返回指令,故能保證重新返回到調(diào)用它的程序中去。
在實(shí)際應(yīng)用中,經(jīng)常需要跟蹤大型程序運(yùn)行過(guò)程中各個(gè)子程序的實(shí)際執(zhí)行情況,以便定位某個(gè)子程序是否出了問(wèn)題,或者是基于各個(gè)子程序的實(shí)際執(zhí)行情況對(duì)大型程序進(jìn)行分析和改造等優(yōu)化處理。一個(gè)非常典型的跟蹤程序的應(yīng)用是,當(dāng)Web應(yīng)用的前端用戶投訴搜索排名存在問(wèn)題時(shí),需要在線查詢這個(gè)搜索行為對(duì)應(yīng)的后端業(yè)務(wù)執(zhí)行流程以及流程環(huán)節(jié)中的數(shù)據(jù),以便定位某個(gè)模塊或者某個(gè)業(yè)務(wù)環(huán)節(jié)是否出了問(wèn)題。
目前,跟蹤程序運(yùn)行過(guò)程中各個(gè)子程序執(zhí)行情況的常用方法,其主要過(guò)程如下所述:首先,生成一個(gè)對(duì)應(yīng)本次程序運(yùn)行的跟蹤標(biāo)識(shí)符;然后,在每執(zhí)行完一個(gè)子程序后,根據(jù)該子程序的實(shí)際執(zhí)行情況,生成該子程序的跟蹤數(shù)據(jù),并存儲(chǔ)跟蹤標(biāo)識(shí)符和該單元產(chǎn)生的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。其中,每個(gè)子程序均能夠直接讀取預(yù)先生成的跟蹤標(biāo)識(shí)符。
OSGi(Open Service Gateway initiative)技術(shù)是面向Java的動(dòng)態(tài)模型系統(tǒng)。OSGi服務(wù)平臺(tái)向Java提供服務(wù),這些服務(wù)使Java成為軟件集成和軟件開(kāi)發(fā)的首選。Java提供在多個(gè)平臺(tái)支持產(chǎn)品的可移植性。OSGi技術(shù)提供允許應(yīng)用程序使用精煉、可重用和可協(xié)作的組件構(gòu)建的標(biāo)準(zhǔn)化原語(yǔ),這些組件能夠組裝進(jìn)一個(gè)應(yīng)用和部署中。基于OSGi技術(shù)的上述優(yōu)點(diǎn),OSGi技術(shù)在Java語(yǔ)言編寫(xiě)的應(yīng)用程序中得到了廣泛應(yīng)用。
隨著OSGi技術(shù)在Java應(yīng)用程序中的廣泛應(yīng)用,在Java應(yīng)用程序內(nèi)部執(zhí)行的流程環(huán)節(jié)中,程序的跟蹤數(shù)據(jù)可能會(huì)經(jīng)過(guò)OSGi環(huán)境下的子程序或者非OSGi環(huán)境下的子程序。由于OSGi和非OSGi的環(huán)境是相互隔離的,因此,非OSGi環(huán)境下的程序和OSGi環(huán)境下的程序均無(wú)法讀取在對(duì)方環(huán)境下聲明的變量,例如,OSGi環(huán)境下的程序無(wú)法讀取在非OSGi環(huán)境下聲明的公共變量。
基于上述原因,對(duì)于一個(gè)既包括非OSGi環(huán)境下的子程序又包括OSGi環(huán)境下的子程序的Java應(yīng)用程序而言,上述跟蹤程序運(yùn)行過(guò)程中各個(gè)子程序的實(shí)際執(zhí)行情況的方法,無(wú)法同時(shí)跟蹤非OSGi環(huán)境和OSGi環(huán)境下的子程序分別產(chǎn)生的跟蹤數(shù)據(jù)。
為了能夠同時(shí)跟蹤非OSGi環(huán)境和OSGi環(huán)境下的子程序分別產(chǎn)生的跟蹤數(shù)據(jù),目前常用的方法是在各個(gè)子程序(非OSGi環(huán)境或OSGi環(huán)境)的源代碼中加入實(shí)現(xiàn)程序跟蹤功能的代碼,即對(duì)各個(gè)子程序進(jìn)行源代碼級(jí)的改造(亦可稱(chēng)為對(duì)原分布式系統(tǒng)的侵入)。該方法在業(yè)務(wù)處理邏輯中耦合進(jìn)程序跟蹤的處理邏輯,其一方面增加了源代碼進(jìn)行改造升級(jí)代價(jià)以及后續(xù)的系統(tǒng)維護(hù)代價(jià),另一方面,由于該方法需要侵入原分布式系統(tǒng)中,影響了原分布式系統(tǒng)業(yè)務(wù)處理的健壯性和可靠性。
綜上所述,對(duì)一個(gè)既包括非OSGi環(huán)境下的子程序又包括OSGi環(huán)境下的子程序的Java應(yīng)用程序進(jìn)行程序跟蹤時(shí),現(xiàn)有技術(shù)存在程序跟蹤的處理邏輯與業(yè)務(wù)處理邏輯耦合在一起的問(wèn)題。
技術(shù)實(shí)現(xiàn)要素:
本申請(qǐng)?zhí)嵋环N用于程序跟蹤的方法、裝置及電子設(shè)備,以解決現(xiàn)有技術(shù)對(duì)一個(gè)既包括非OSGi環(huán)境下的子程序又包括OSGi環(huán)境下的子程序的Java應(yīng)用程序進(jìn)行程序跟蹤時(shí),存在程序跟蹤的處理邏輯與業(yè)務(wù)處理邏輯耦合在一起的問(wèn)題。本申請(qǐng)另外提供一種流量控制方法、裝置及電子設(shè)備。
本申請(qǐng)?zhí)峁┮环N用于程序跟蹤的方法,包括:
接收調(diào)用方發(fā)送的對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求;
根據(jù)所述調(diào)用請(qǐng)求,生成跟蹤標(biāo)識(shí)符;所述跟蹤標(biāo)識(shí)符用于標(biāo)識(shí)所述特定程序的本次調(diào)用所產(chǎn)生的跟蹤數(shù)據(jù);
執(zhí)行所述特定程序包括的各級(jí)子程序,針對(duì)至少一個(gè)所述子程序,在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子 程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄;
其中,用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域和用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,是指OSGI和非OSGI的子程序均能夠訪問(wèn)的存儲(chǔ)區(qū)域。
可選的,所述調(diào)用方包括客戶端或第三方應(yīng)用。
可選的,所述跟蹤標(biāo)識(shí)符包括所述調(diào)用方的IP地址、所述跟蹤標(biāo)識(shí)符的生成時(shí)間、所述調(diào)用請(qǐng)求的標(biāo)識(shí)符或發(fā)起所述調(diào)用請(qǐng)求的線程標(biāo)識(shí)符或進(jìn)程標(biāo)識(shí)符,以及調(diào)用方所屬類(lèi)別的至少一者。
可選的,所述根據(jù)所述調(diào)用請(qǐng)求,生成跟蹤標(biāo)識(shí)符,包括:
根據(jù)所述調(diào)用請(qǐng)求,獲取所述調(diào)用方的IP地址、所述調(diào)用請(qǐng)求的標(biāo)識(shí)符或所述發(fā)起所述調(diào)用請(qǐng)求的線程標(biāo)識(shí)符或進(jìn)程標(biāo)識(shí)符,以及所述調(diào)用方所屬類(lèi)別的至少一者;
根據(jù)所述調(diào)用方的IP地址、所述調(diào)用請(qǐng)求的標(biāo)識(shí)符或所述發(fā)起所述調(diào)用請(qǐng)求的線程標(biāo)識(shí)符或進(jìn)程標(biāo)識(shí)符、當(dāng)前系統(tǒng)時(shí)間,以及所述調(diào)用方所屬類(lèi)別的至少一者,生成所述跟蹤標(biāo)識(shí)符。
可選的,所述跟蹤標(biāo)識(shí)符是全局唯一標(biāo)識(shí)符。
可選的,所述根據(jù)所述調(diào)用請(qǐng)求,生成跟蹤標(biāo)識(shí)符,采用如下方式:
生成隨機(jī)數(shù),作為所述跟蹤標(biāo)識(shí)符。
可選的,所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域,采用如下方式創(chuàng)建:
在自定義的類(lèi)加載器中創(chuàng)建所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域。
可選的,所述用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,采用如下方式創(chuàng)建:
在自定義的類(lèi)加載器中創(chuàng)建所述用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域。
可選的,所述特定程序是指Java程序語(yǔ)言編寫(xiě)的Web應(yīng)用程序,所述方法還包括:
配置Web容器采用所述自定義的類(lèi)加載器加載所述特定程序。
可選的,還包括:
在加載所述特定程序的過(guò)程中,設(shè)置所述特定程序的類(lèi)加載器為所述自定義的類(lèi)加載器。
可選的,所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域,采用如下方式創(chuàng)建:
調(diào)用預(yù)定的非Java程序,在所述預(yù)定的非Java程序中創(chuàng)建所述用于存儲(chǔ)所 述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域。
可選的,所述用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,采用如下方式創(chuàng)建:
調(diào)用預(yù)定的非Java程序,在所述預(yù)定的非Java程序中創(chuàng)建所述用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域。
可選的,所述子程序的跟蹤數(shù)據(jù)包括:所述子程序的起始執(zhí)行時(shí)間、所述子程序的實(shí)際調(diào)用參數(shù)、所述子程序的執(zhí)行結(jié)果和所述子程序拋出的異常信息的至少一者。
可選的,所述子程序所屬的類(lèi)包括預(yù)先編寫(xiě)的生成并存儲(chǔ)跟蹤數(shù)據(jù)的方法;所述在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄,包括:
判斷所述子程序所屬的類(lèi)是否包括所述生成并存儲(chǔ)跟蹤數(shù)據(jù)的方法;
若上述判斷結(jié)果為是,則通過(guò)所述生成并存儲(chǔ)跟蹤數(shù)據(jù)的方法,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
可選的,所述子程序包括非OSGI的子程序或OSGI的子程序。
可選的,所述用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域采用全局變量或預(yù)置的上下文數(shù)據(jù)容器;所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域采用全局變量或預(yù)置的上下文數(shù)據(jù)容器。
可選的,在所述存儲(chǔ)跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄之前,還包括:
激活所述預(yù)置的上下文數(shù)據(jù)容器。
可選的,還包括:
回收所述預(yù)置的上下文數(shù)據(jù)容器。
可選的,在執(zhí)行所述特定程序包括的各級(jí)子程序過(guò)程中,如果調(diào)用程序運(yùn)行于第一設(shè)備中,被調(diào)用程序運(yùn)行于第二設(shè)備中,則所述調(diào)用程序?qū)⑺龈櫂?biāo)識(shí)符傳遞給所述被調(diào)用程序;
所述在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄,包括:
在所述被調(diào)用程序執(zhí)行后,生成所述被調(diào)用程序的跟蹤數(shù)據(jù);
根據(jù)接收到的所述跟蹤標(biāo)識(shí)符,所述被調(diào)用程序回調(diào)所述調(diào)用程序,將所述跟蹤數(shù)據(jù)返回給所述調(diào)用程序;
所述調(diào)用程序存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述被調(diào)用程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
可選的,在執(zhí)行所述特定程序包括的各級(jí)子程序過(guò)程中,如果調(diào)用單元運(yùn)行于第一設(shè)備中,被調(diào)用單元運(yùn)行于第二設(shè)備中,則所述調(diào)用單元直接調(diào)用所述被調(diào)用單元;
所述在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄,包括:
在所述被調(diào)用程序執(zhí)行后,生成所述被調(diào)用程序的跟蹤數(shù)據(jù);
所述被調(diào)用程序?qū)⑺龈檾?shù)據(jù)返回給所述調(diào)用程序;
所述調(diào)用程序存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述被調(diào)用程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
相應(yīng)的,本申請(qǐng)還提供一種用于程序跟蹤的裝置,包括:
接收單元,用于接收調(diào)用方發(fā)送的對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求;
生成單元,用于根據(jù)所述調(diào)用請(qǐng)求,生成跟蹤標(biāo)識(shí)符;所述跟蹤標(biāo)識(shí)符用于標(biāo)識(shí)所述特定程序的本次調(diào)用所產(chǎn)生的跟蹤數(shù)據(jù);
跟蹤單元,用于執(zhí)行所述特定程序包括的各級(jí)子程序,針對(duì)至少一個(gè)所述子程序,在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄;
其中,用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域和用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,是指OSGI和非OSGI的子程序均能夠訪問(wèn)的存儲(chǔ)區(qū)域。
可選的,所述生成單元包括:
獲取子單元,用于根據(jù)所述調(diào)用請(qǐng)求,獲取所述調(diào)用方的IP地址、所述調(diào)用請(qǐng)求的標(biāo)識(shí)符或所述發(fā)起所述調(diào)用請(qǐng)求的線程標(biāo)識(shí)符或進(jìn)程標(biāo)識(shí)符,以及所述調(diào)用方所屬類(lèi)別的至少一者;
生成子單元,用于根據(jù)所述調(diào)用方的IP地址、所述調(diào)用請(qǐng)求的標(biāo)識(shí)符或所述發(fā)起所述調(diào)用請(qǐng)求的線程標(biāo)識(shí)符或進(jìn)程標(biāo)識(shí)符、當(dāng)前系統(tǒng)時(shí)間,以及所述調(diào)用方所屬類(lèi)別的至少一者,生成所述跟蹤標(biāo)識(shí)符。
可選的,所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域,采用如下方式創(chuàng)建:
在自定義的類(lèi)加載器中創(chuàng)建所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域。
可選的,所述用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,采用如下方式創(chuàng)建:
在自定義的類(lèi)加載器中創(chuàng)建所述用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域。
可選的,所述特定程序是指Java程序語(yǔ)言編寫(xiě)的Web應(yīng)用程序,所述裝置還包括:
配置單元,用于配置Web容器采用所述自定義的類(lèi)加載器加載所述特定程序。
可選的,還包括:
動(dòng)態(tài)指定單元,用于在加載所述特定程序的過(guò)程中,設(shè)置所述特定程序的類(lèi)加載器為所述自定義的類(lèi)加載器。
可選的,所述子程序所屬的類(lèi)包括預(yù)先編寫(xiě)的生成并存儲(chǔ)跟蹤數(shù)據(jù)的方法;所述跟蹤單元包括:
判斷子單元,用于判斷所述子程序所屬的類(lèi)是否包括所述生成并存儲(chǔ)跟蹤數(shù)據(jù)的方法;
跟蹤子單元,用于若上述判斷結(jié)果為是,則通過(guò)所述生成并存儲(chǔ)跟蹤數(shù)據(jù)的方法,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
可選的,在執(zhí)行所述特定程序包括的各級(jí)子程序過(guò)程中,如果調(diào)用程序運(yùn)行于第一設(shè)備中,被調(diào)用程序運(yùn)行于第二設(shè)備中,則所述調(diào)用程序?qū)⑺龈櫂?biāo)識(shí)符傳遞給所述被調(diào)用程序;
所述跟蹤子單元包括:
生成子單元,用于在所述被調(diào)用程序執(zhí)行后,生成所述被調(diào)用程序的跟蹤數(shù)據(jù);
回調(diào)子單元,用于根據(jù)接收到的所述跟蹤標(biāo)識(shí)符,所述被調(diào)用程序回調(diào)所述調(diào)用程序,將所述跟蹤數(shù)據(jù)返回給所述調(diào)用程序;
存儲(chǔ)子單元,用于所述調(diào)用程序存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述被調(diào)用程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
可選的,在依次執(zhí)行所述特定程序包括的各級(jí)子程序過(guò)程中,如果調(diào)用單 元運(yùn)行于第一設(shè)備中,被調(diào)用單元運(yùn)行于第二設(shè)備中,則所述調(diào)用單元直接調(diào)用所述被調(diào)用單元;
所述跟蹤子單元包括:
生成子單元,用于在所述被調(diào)用程序執(zhí)行后,生成所述被調(diào)用程序的跟蹤數(shù)據(jù);
返回子單元,用于所述被調(diào)用程序?qū)⑺龈檾?shù)據(jù)返回給所述調(diào)用程序;
存儲(chǔ)子單元,用于所述調(diào)用程序存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述被調(diào)用程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
可選的,還包括:
激活單元,用于激活所述預(yù)置的上下文數(shù)據(jù)容器。
可選的,還包括:
回收單元,用于回收所述預(yù)置的上下文數(shù)據(jù)容器。
相應(yīng)的,本申請(qǐng)還提供一種電子設(shè)備,包括:
顯示器;
處理器;以及
存儲(chǔ)器,用于存儲(chǔ)用于程序跟蹤的裝置,所述用于程序跟蹤的裝置被所述處理器執(zhí)行時(shí),包括如下步驟:接收調(diào)用方發(fā)送的對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求;根據(jù)所述調(diào)用請(qǐng)求,生成跟蹤標(biāo)識(shí)符;所述跟蹤標(biāo)識(shí)符用于標(biāo)識(shí)所述特定程序的本次調(diào)用所產(chǎn)生的跟蹤數(shù)據(jù);執(zhí)行所述特定程序包括的各級(jí)子程序,針對(duì)至少一個(gè)所述子程序,在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄;其中,用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域和用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,是指OSGI和非OSGI的子程序均能夠訪問(wèn)的存儲(chǔ)區(qū)域。
此外,本申請(qǐng)還提供一種流量控制方法,包括:
接收調(diào)用方發(fā)送的對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求;
獲取當(dāng)前時(shí)間之前預(yù)設(shè)時(shí)間范圍內(nèi)的預(yù)存的所述特定程序的歷史程序跟蹤記錄;
根據(jù)獲取的所述歷史程序跟蹤記錄,對(duì)所述調(diào)用方進(jìn)行流量控制。
可選的,所述歷史程序跟蹤記錄采用如下步驟生成:
接收調(diào)用方發(fā)送的對(duì)應(yīng)所述特定程序的調(diào)用請(qǐng)求;
根據(jù)所述調(diào)用請(qǐng)求,生成跟蹤標(biāo)識(shí)符;所述跟蹤標(biāo)識(shí)符用于標(biāo)識(shí)所述特定程序的本次調(diào)用所產(chǎn)生的跟蹤數(shù)據(jù);
執(zhí)行所述特定程序包括的各級(jí)子程序,針對(duì)至少一個(gè)所述子程序,在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄;
將所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄存儲(chǔ)到預(yù)置的外部存儲(chǔ)區(qū)域,作為所述歷史程序跟蹤記錄;
其中,用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域和用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,是指OSGI和非OSGI的子程序均能夠訪問(wèn)的存儲(chǔ)區(qū)域。
可選的,所述歷史程序跟蹤記錄存儲(chǔ)在數(shù)據(jù)庫(kù)中或文本文件中。
可選的,所述根據(jù)獲取的所述歷史程序跟蹤記錄,對(duì)所述調(diào)用方進(jìn)行流量控制,包括:
根據(jù)所述歷史程序跟蹤記錄,計(jì)算獲取在所述當(dāng)前時(shí)間之前預(yù)設(shè)時(shí)間范圍內(nèi)的針對(duì)所述特定程序的歷史訪問(wèn)量;
判斷所述歷史訪問(wèn)量是否大于預(yù)設(shè)的訪問(wèn)量閾值;
若上述判斷結(jié)果為是,則按照預(yù)設(shè)的流量控制策略處理所述調(diào)用請(qǐng)求。
相應(yīng)的,本申請(qǐng)還提供一種流量控制裝置,包括:
接收單元,用于接收調(diào)用方發(fā)送的對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求;
獲取單元,用于獲取當(dāng)前時(shí)間之前預(yù)設(shè)時(shí)間范圍內(nèi)的預(yù)存的所述特定程序的歷史程序跟蹤記錄;
控制單元,用于根據(jù)獲取的所述歷史程序跟蹤記錄,對(duì)所述調(diào)用方進(jìn)行流量控制。
可選的,還包括:
生成單元,用于生成所述歷史程序跟蹤記錄;
可選的,所述生成單元包括:
接收子單元,用于接收調(diào)用方發(fā)送的對(duì)應(yīng)所述特定程序的調(diào)用請(qǐng)求;
生成子單元,用于根據(jù)所述調(diào)用請(qǐng)求,生成跟蹤標(biāo)識(shí)符;所述跟蹤標(biāo)識(shí)符用于標(biāo)識(shí)所述特定程序的本次調(diào)用所產(chǎn)生的跟蹤數(shù)據(jù);
跟蹤子單元,用于執(zhí)行所述特定程序包括的各級(jí)子程序,針對(duì)至少一個(gè)所述子程序,在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄;
存儲(chǔ)子單元,用于將所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄存儲(chǔ)到預(yù)置的外部存儲(chǔ)區(qū)域,作為所述歷史程序跟蹤記錄;
其中,用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域和用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,是指OSGI和非OSGI的子程序均能夠訪問(wèn)的存儲(chǔ)區(qū)域。
可選的,所述控制單元包括:
計(jì)算子單元,用于根據(jù)所述歷史程序跟蹤記錄,計(jì)算獲取在所述當(dāng)前時(shí)間之前預(yù)設(shè)時(shí)間范圍內(nèi)的針對(duì)所述特定程序的歷史訪問(wèn)量;
判斷子單元,用于判斷所述歷史訪問(wèn)量是否大于預(yù)設(shè)的訪問(wèn)量閾值;
處理子單元,用于若上述判斷結(jié)果為是,則按照預(yù)設(shè)的流量控制策略處理所述調(diào)用請(qǐng)求。
相應(yīng)的,本申請(qǐng)還提供一種電子設(shè)備,包括:
顯示器;
處理器;以及
存儲(chǔ)器,用于存儲(chǔ)流量控制裝置,所述流量控制裝置被所述處理器執(zhí)行時(shí),包括如下步驟:接收調(diào)用方發(fā)送的對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求;獲取當(dāng)前時(shí)間之前預(yù)設(shè)時(shí)間范圍內(nèi)的預(yù)存的所述特定程序的歷史程序跟蹤記錄;根據(jù)獲取的所述歷史程序跟蹤記錄,對(duì)所述調(diào)用方進(jìn)行流量控制。
與現(xiàn)有技術(shù)相比,本申請(qǐng)具有以下優(yōu)點(diǎn):
本申請(qǐng)?zhí)峁┑挠糜诔绦蚋櫟姆椒ā⒀b置及電子設(shè)備,通過(guò)接收調(diào)用方發(fā)送的對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求,并根據(jù)所述調(diào)用請(qǐng)求,生成跟蹤標(biāo)識(shí)符,所述跟蹤標(biāo)識(shí)符用于標(biāo)識(shí)所述特定程序的本次調(diào)用所產(chǎn)生的跟蹤數(shù)據(jù),然后執(zhí)行所述特定程序包括的各級(jí)子程序,針對(duì)至少一個(gè)所述子程序,在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄,其中,用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,均是指在OSGI和非OSGI的子程序均能夠訪問(wèn)的存儲(chǔ)區(qū)域,使得非OSGi的應(yīng)用程序在跟蹤記錄OSGi的子程序的功能運(yùn)行情況時(shí),能夠分離子程序的跟蹤處理邏輯和業(yè)務(wù)處理邏輯,避免對(duì)各個(gè)子程序進(jìn)行源代碼級(jí)的改造,從而達(dá)到不 影響非OSGi的應(yīng)用程序業(yè)務(wù)處理的健壯性和可靠性的效果。
附圖說(shuō)明
圖1是本申請(qǐng)的用于程序跟蹤的方法實(shí)施例的流程圖;
圖2是本申請(qǐng)的用于程序跟蹤的方法實(shí)施例步驟S103的具體流程圖;
圖3是本申請(qǐng)的用于程序跟蹤的方法實(shí)施例步驟S105的具體流程圖;
圖4是本申請(qǐng)的用于程序跟蹤的方法實(shí)施例調(diào)用子程序的具體流程圖;
圖5是本申請(qǐng)的用于程序跟蹤的方法實(shí)施例調(diào)用子程序的又一具體流程圖;
圖6是本申請(qǐng)的用于程序跟蹤的裝置實(shí)施例的示意圖;
圖7是本申請(qǐng)的用于程序跟蹤的裝置實(shí)施例的具體示意圖;
圖8是本申請(qǐng)的用于程序跟蹤的裝置實(shí)施例跟蹤單元105的示意圖;
圖9是本申請(qǐng)的電子設(shè)備實(shí)施例的示意圖;
圖10是本申請(qǐng)的流量控制方法實(shí)施例的流程圖;
圖11是本申請(qǐng)的流量控制方法實(shí)施例生成歷史程序跟蹤記錄的具體流程圖;
圖12是本申請(qǐng)的流量控制方法實(shí)施例步驟S1005的具體流程圖;
圖13是本申請(qǐng)的流量控制裝置實(shí)施例的示意圖;
圖14是本申請(qǐng)的又一電子設(shè)備實(shí)施例的示意圖。
具體實(shí)施方式
在下面的描述中闡述了很多具體細(xì)節(jié)以便于充分理解本申請(qǐng)。但是本申請(qǐng)能夠以很多不同于在此描述的其它方式來(lái)實(shí)施,本領(lǐng)域技術(shù)人員可以在不違背本申請(qǐng)內(nèi)涵的情況下做類(lèi)似推廣,因此本申請(qǐng)不受下面公開(kāi)的具體實(shí)施的限制。
在本申請(qǐng)中,提供了一種用于程序跟蹤的方法、裝置及電子設(shè)備,以及一種流量控制方法、裝置及電子設(shè)備。在下面的實(shí)施例中逐一進(jìn)行詳細(xì)說(shuō)明。
本申請(qǐng)實(shí)施例提供的用于程序跟蹤的方法,其基本思想是:采用OSGI和非OSGI的子程序均能夠訪問(wèn)的內(nèi)存區(qū)域,存儲(chǔ)跟蹤標(biāo)識(shí)符和跟蹤數(shù)據(jù),使得OSGI和非OSGI的子程序均能夠獲取跟蹤標(biāo)識(shí)符,并通過(guò)為子程序預(yù)先編寫(xiě)的生成并存儲(chǔ)跟蹤數(shù)據(jù)的模塊,使得非OSGi的應(yīng)用程序在跟蹤記錄OSGi的子程序的功能運(yùn)行情況時(shí),能夠分離子程序的跟蹤處理邏輯和業(yè)務(wù)處理邏輯,避免對(duì)各個(gè) 子程序進(jìn)行源代碼級(jí)的改造。
請(qǐng)參考圖1,其為本申請(qǐng)的用于程序跟蹤的方法實(shí)施例的流程圖。所述方法包括如下步驟:
步驟S101:接收調(diào)用方發(fā)送的對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求。
本申請(qǐng)實(shí)施例所述的調(diào)用方包括客戶端或第三方應(yīng)用。其中,客戶端包括但不限于移動(dòng)通訊設(shè)備,即:通常所說(shuō)的手機(jī)或者智能手機(jī),還包括個(gè)人電腦、PAD、iPad等終端設(shè)備。本申請(qǐng)實(shí)施例所述的第三方應(yīng)用,是指將本申請(qǐng)實(shí)施例所述的特定程序作為其部分功能的某種軟件或應(yīng)用,第三方應(yīng)用可以是由非本申請(qǐng)實(shí)施例所述的特定程序編制方的其他組織或個(gè)人開(kāi)發(fā)的相關(guān)軟件。
本申請(qǐng)實(shí)施例所述的特定程序是指采用Java程序語(yǔ)言編寫(xiě)的應(yīng)用程序,包括Java程序語(yǔ)言編寫(xiě)的Web應(yīng)用程序。Java程序內(nèi)部包括的各級(jí)子程序(也稱(chēng)為服務(wù)),既可以是非OSGI的子程序,還可以是OSGI的子程序。所述子程序的業(yè)務(wù)邏輯存儲(chǔ)在類(lèi)文件中。在本實(shí)施例中,所述子程序所屬的類(lèi)包括生成并存儲(chǔ)跟蹤數(shù)據(jù)的方法,所述生成并存儲(chǔ)跟蹤數(shù)據(jù)的方法,用于執(zhí)行所述生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄的操作。
在本實(shí)施例中,特定程序?yàn)镴ava程序語(yǔ)言編寫(xiě)的Web應(yīng)用程序,位于服務(wù)器端。調(diào)用方為客戶端,客戶端用戶通過(guò)瀏覽器向服務(wù)器端發(fā)送對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求,系統(tǒng)為調(diào)用請(qǐng)求自動(dòng)生成調(diào)用請(qǐng)求的標(biāo)識(shí)符,即requestId。當(dāng)服務(wù)器端接收到調(diào)用請(qǐng)求后,就可以進(jìn)入步驟S103,根據(jù)所述調(diào)用請(qǐng)求,生成用于標(biāo)識(shí)特定程序的本次調(diào)用所產(chǎn)生的跟蹤數(shù)據(jù)的跟蹤標(biāo)識(shí)符。
在實(shí)際應(yīng)用中,如果調(diào)用方為第三方應(yīng)用,則第三方應(yīng)用通過(guò)網(wǎng)絡(luò)套接字向特定程序所在的服務(wù)器發(fā)送調(diào)用請(qǐng)求。為了對(duì)第三方應(yīng)用發(fā)起的調(diào)用請(qǐng)求進(jìn)行標(biāo)識(shí),可以將第三方應(yīng)用的調(diào)用請(qǐng)求的標(biāo)識(shí)符設(shè)置為發(fā)起調(diào)用請(qǐng)求的線程標(biāo)識(shí)符或進(jìn)程標(biāo)識(shí)符。
在接收到調(diào)用方發(fā)送的對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求后,通過(guò)步驟S103響應(yīng)該調(diào)用請(qǐng)求,根據(jù)調(diào)用請(qǐng)求,生成所述跟蹤標(biāo)識(shí)符。
步驟S103:根據(jù)所述調(diào)用請(qǐng)求,生成跟蹤標(biāo)識(shí)符。
為了能夠標(biāo)識(shí)特定程序的本次調(diào)用所產(chǎn)生的跟蹤數(shù)據(jù),以便后期對(duì)跟蹤數(shù)據(jù)進(jìn)行分析等處理,首先需要生成跟蹤標(biāo)識(shí)符。在實(shí)際應(yīng)用中,可以采用多種 方式生成跟蹤標(biāo)識(shí)符,例如:生成隨機(jī)數(shù)的方法等。各種不同的方式都只是具體實(shí)施方式的變更,都不偏離本申請(qǐng)的核心,因此都在本申請(qǐng)的保護(hù)范圍之內(nèi)。
下面給出一種生成跟蹤標(biāo)識(shí)符的優(yōu)選方法,采用該方法生成的跟蹤標(biāo)識(shí)符是全局唯一標(biāo)識(shí)符,以避免兩次不同的跟蹤數(shù)據(jù)使用同一跟蹤標(biāo)識(shí)符。具體的,采用該方法生成的跟蹤標(biāo)識(shí)符包括所述調(diào)用方的IP地址、所述跟蹤標(biāo)識(shí)符的生成時(shí)間、所述調(diào)用請(qǐng)求的標(biāo)識(shí)符或發(fā)起所述調(diào)用請(qǐng)求的線程標(biāo)識(shí)符或進(jìn)程標(biāo)識(shí)符,以及調(diào)用方所屬類(lèi)別的至少一者。
請(qǐng)參考圖2,其為本申請(qǐng)的用于程序跟蹤的方法實(shí)施例步驟S103的具體流程圖。在本實(shí)施例中,所述根據(jù)所述調(diào)用請(qǐng)求,生成跟蹤標(biāo)識(shí)符,包括:
步驟S1031:根據(jù)所述調(diào)用請(qǐng)求,獲取所述調(diào)用方的IP地址、所述調(diào)用請(qǐng)求的標(biāo)識(shí)符或所述發(fā)起所述調(diào)用請(qǐng)求的線程標(biāo)識(shí)符或進(jìn)程標(biāo)識(shí)符,以及所述調(diào)用方所屬類(lèi)別的至少一者。
本申請(qǐng)實(shí)施例所述的調(diào)用方的IP地址,包括IPv4或IPv6地址。IPv4通常用點(diǎn)分十進(jìn)制記法書(shū)寫(xiě),例如192.168.0.1,其中的數(shù)字都是十進(jìn)制的數(shù)字,中間用實(shí)心圓點(diǎn)分隔。IPv6是IETF設(shè)計(jì)的用于替代現(xiàn)行版本IP協(xié)議-IPv4-的下一代IP協(xié)議,它由128位二進(jìn)制數(shù)碼表示。
本申請(qǐng)實(shí)施例所述的調(diào)用方所屬類(lèi)別包括客戶端或第三方應(yīng)用。當(dāng)調(diào)用方為客戶端時(shí),則系統(tǒng)自動(dòng)為客戶端發(fā)送的調(diào)用請(qǐng)求生成所述調(diào)用請(qǐng)求的標(biāo)識(shí)符;當(dāng)調(diào)用方為第三方應(yīng)用時(shí),則第三方應(yīng)用發(fā)送的調(diào)用請(qǐng)求的標(biāo)識(shí)符,可以為發(fā)起所述調(diào)用請(qǐng)求的線程標(biāo)識(shí)符或進(jìn)程標(biāo)識(shí)符。
步驟S1033:根據(jù)所述調(diào)用方的IP地址、所述調(diào)用請(qǐng)求的標(biāo)識(shí)符或所述發(fā)起所述調(diào)用請(qǐng)求的線程標(biāo)識(shí)符或進(jìn)程標(biāo)識(shí)符、當(dāng)前系統(tǒng)時(shí)間,以及所述調(diào)用方所屬類(lèi)別的至少一者,生成所述跟蹤標(biāo)識(shí)符。
在本實(shí)施例中,跟蹤標(biāo)識(shí)符用“aaaaaaaatttttttttttttccccccfpppp”字符串表示,以保證跟蹤標(biāo)識(shí)符達(dá)到全局唯一性。字符說(shuō)明如下:
1)a段是8個(gè)字符的IP地址(IPv4的每個(gè)段用兩位16進(jìn)制數(shù)表示)。
2)t段是13個(gè)字符的生成跟蹤標(biāo)識(shí)符的毫秒時(shí)間。
3)c段是6位(0001-999999)的整數(shù)遞增量,這個(gè)字段采用向特定程序發(fā)起調(diào)用請(qǐng)求的線程id或者進(jìn)程id表示。
4)f段是一般用于排查問(wèn)題,表示調(diào)用方所屬類(lèi)別,例如,客戶端或第三 方應(yīng)用。
5)p段是(用四位16進(jìn)制數(shù)表示),保留擴(kuò)展,用于以后業(yè)務(wù)發(fā)展擴(kuò)展。
下面舉例說(shuō)明本實(shí)施例生成跟蹤標(biāo)識(shí)符的流程。例如,調(diào)用方的IP地址為:58.101.24.207,生成跟蹤標(biāo)識(shí)符的流程包括如下步驟:1)根據(jù)“.”分隔提取IP地址中的4個(gè)數(shù)字,58、101、24、207;2)將提取到的58、101、24、207這4個(gè)數(shù)字從10進(jìn)制轉(zhuǎn)為16進(jìn)制數(shù)值得到3A、65、18、CF;3)將這4個(gè)16進(jìn)制數(shù)字組拼接成3A6518CF,即a段內(nèi)容;4)獲取當(dāng)前操作系統(tǒng)毫秒時(shí)間(這個(gè)值操作系統(tǒng)可以提供)作為t段內(nèi)容,如1425439999142;5)c段內(nèi)容為發(fā)起調(diào)用請(qǐng)求時(shí)的線程或者進(jìn)程id,這個(gè)值第三方應(yīng)用系統(tǒng)中可以直接提供,例如,為000001;6)發(fā)起調(diào)用請(qǐng)求的來(lái)源可能是客戶端用戶或者其他第3方調(diào)用來(lái)源,這里把f段設(shè)置為0;7)p段可以根據(jù)未來(lái)發(fā)展往后擴(kuò)展,例如,1A02;8)組合生成3A6518CF142543999914200000101A02,作為跟蹤標(biāo)識(shí)符。
本申請(qǐng)實(shí)施例所述的用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域,是指能夠被OSGI和非OSGI的子程序所訪問(wèn)的存儲(chǔ)區(qū)域。為了使得OSGI和非OSGI的子程序均能夠訪問(wèn)所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域,至少可以采用如下方式之一創(chuàng)建所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域:1)在自定義的類(lèi)加載器中創(chuàng)建所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域;2)調(diào)用預(yù)定的非Java程序,在所述預(yù)定的非Java程序中創(chuàng)建所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域。
1)在自定義的類(lèi)加載器中創(chuàng)建所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域。
類(lèi)加載器(class loader)用來(lái)加載Java類(lèi)到Java虛擬機(jī)中。一般來(lái)說(shuō),Java虛擬機(jī)使用Java類(lèi)的方式如下:Java源程序(.java文件)在經(jīng)過(guò)Java編譯器編譯之后就被轉(zhuǎn)換成Java字節(jié)代碼(.class文件)。類(lèi)加載器負(fù)責(zé)讀取Java字節(jié)代碼,并轉(zhuǎn)換成java.lang.Class類(lèi)的一個(gè)實(shí)例。每個(gè)這樣的實(shí)例用來(lái)表示一個(gè)Java類(lèi)。通過(guò)此實(shí)例的newInstance()方法就可以創(chuàng)建出該類(lèi)的一個(gè)對(duì)象?;旧纤械念?lèi)加載器都是java.lang.ClassLoader類(lèi)的一個(gè)實(shí)例。類(lèi)加載器在Web容器和OSGi中得到了廣泛的使用。
Java中的類(lèi)加載器大致可以分成兩類(lèi),一類(lèi)是系統(tǒng)提供的,另外一類(lèi)則是由Java應(yīng)用開(kāi)發(fā)人員編寫(xiě)的,即自定義的類(lèi)加載器。例如,下面的代碼public class PrcTraceClassLoader extends ClassLoader{public String traceId;},該段代碼定義了一個(gè)自定義的類(lèi)加載器PrcTraceClassLoader,通過(guò)該類(lèi)加載器加載的所有 類(lèi)均能夠訪問(wèn)在該類(lèi)加載器中創(chuàng)建的內(nèi)存區(qū)域。Java程序的開(kāi)發(fā)人員可以直接同類(lèi)加載器進(jìn)行交互。
在本實(shí)施例中,特定程序?yàn)镴ava程序語(yǔ)言編寫(xiě)的Web應(yīng)用程序。為了能夠采用所述自定義的類(lèi)加載器加載本實(shí)施例的Web應(yīng)用程序,本申請(qǐng)實(shí)施例提供的用于程序跟蹤的方法,還包括:配置Web容器采用所述自定義的類(lèi)加載器加載所述特定程序。
在實(shí)際應(yīng)用中,由于一個(gè)Web容器中能夠運(yùn)行多個(gè)Web應(yīng)用程序,因此,上述配置Web容器采用自定義的類(lèi)加載器加載特定程序的方法存在如下缺點(diǎn):自定義的類(lèi)加載器將影響其他Web應(yīng)用程序的類(lèi)加載方式。為了解決該問(wèn)題,可以在加載特定程序的過(guò)程中,設(shè)置特定程序的類(lèi)加載器為所述自定義的類(lèi)加載器。采用該方式,實(shí)質(zhì)上是動(dòng)態(tài)地改變了特定程序的類(lèi)加載器,從而避免自定義的類(lèi)加載器影響其他Web應(yīng)用程序的類(lèi)加載方式。
2)調(diào)用預(yù)定的非Java程序,在所述預(yù)定的非Java程序中創(chuàng)建所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域。
采用該方式,可以在特定程序的起始執(zhí)行處,調(diào)用預(yù)定的非Java程序,例如,C++程序等,在所述預(yù)定的非Java程序中創(chuàng)建所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域。
在實(shí)際應(yīng)用中,可以根據(jù)具體情況,選擇上述兩種方式之一創(chuàng)建用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域,以使得OSGI和非OSGI的子程序均能夠訪問(wèn)存儲(chǔ)跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域。具體的,所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域采用全局變量或預(yù)置的上下文數(shù)據(jù)容器。
通過(guò)步驟S103生成跟蹤標(biāo)識(shí)符后,就能夠進(jìn)入到步驟S105,執(zhí)行所述特定程序包括的各級(jí)子程序,并在程序執(zhí)行過(guò)程中對(duì)程序的功能執(zhí)行情況進(jìn)行跟蹤記錄。
步驟S105:執(zhí)行所述特定程序包括的各級(jí)子程序,針對(duì)至少一個(gè)所述子程序,在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
本申請(qǐng)實(shí)施例所述的子程序的跟蹤數(shù)據(jù)包括:所述子程序的起始執(zhí)行時(shí)間、所述子程序的實(shí)際調(diào)用參數(shù)、所述子程序的執(zhí)行結(jié)果和所述子程序拋出的異常信息的至少一者。
本申請(qǐng)實(shí)施例提供的用于程序跟蹤的方法,是通過(guò)為子程序預(yù)先編寫(xiě)的生成并存儲(chǔ)跟蹤數(shù)據(jù)模塊,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄的。在實(shí)際應(yīng)用中,根據(jù)具體需求,選擇為需要跟蹤的子程序預(yù)先編寫(xiě)所述生成并存儲(chǔ)跟蹤數(shù)據(jù)模塊。
請(qǐng)參考圖3,其為本申請(qǐng)的用于程序跟蹤的方法實(shí)施例步驟S105的具體流程圖。從特定程序的入口開(kāi)始,執(zhí)行特定程序包括的各級(jí)子程序。所述在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄,包括:
步驟S301:判斷所述子程序所屬的類(lèi)是否包括所述生成并存儲(chǔ)跟蹤數(shù)據(jù)的方法。
下面給出一段示例代碼,以說(shuō)明子程序及其所屬類(lèi)中包括的生成并存儲(chǔ)跟蹤數(shù)據(jù)模塊。示例代碼如下所示:
上述代碼中pay方法是Java應(yīng)用程序所調(diào)用的一個(gè)子程序,當(dāng)執(zhí)行完該子程序的業(yè)務(wù)邏輯后,通過(guò)步驟S301判斷該子程序所屬的類(lèi)是否包括生成并存儲(chǔ)跟蹤數(shù)據(jù)的方法(即:trace方法)。
步驟S303:若上述判斷結(jié)果為是,則通過(guò)所述生成并存儲(chǔ)跟蹤數(shù)據(jù)的方法, 生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
如果當(dāng)前執(zhí)行的子程序所屬的類(lèi)包括生成并存儲(chǔ)跟蹤數(shù)據(jù)的方法,則通過(guò)該方法生成該子程序的跟蹤數(shù)據(jù),并存儲(chǔ)跟蹤標(biāo)識(shí)符和該子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
本申請(qǐng)實(shí)施例的用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,是指能夠被OSGI和非OSGI的子程序所訪問(wèn)的存儲(chǔ)區(qū)域。為了使得OSGI和非OSGI的子程序均能夠訪問(wèn)所述用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,至少可以采用如下方式之一創(chuàng)建所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域:1)在自定義的類(lèi)加載器中創(chuàng)建所述用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域;2)調(diào)用預(yù)定的非Java程序,在所述預(yù)定的非Java程序中創(chuàng)建所述用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域。
具體的,所述用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,即可以采用全局變量,還可以采用預(yù)置的上下文數(shù)據(jù)容器。在本實(shí)施例中,用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域采用預(yù)置的上下文數(shù)據(jù)容器。在實(shí)際應(yīng)用中,通常為一組相關(guān)的操作創(chuàng)建一個(gè)執(zhí)行上下文并提供一個(gè)共享的數(shù)據(jù)容器,而不是簡(jiǎn)單地定義一個(gè)全局變量,或者將數(shù)據(jù)通過(guò)參數(shù)傳來(lái)傳去。這樣的上下文一般具有其生命周期,它們?cè)谀繕?biāo)操作開(kāi)始執(zhí)行的時(shí)候被激活,在執(zhí)行完成之后被回收。該上下文一般不能跨越多個(gè)線程,以避免多個(gè)線程操作相同的數(shù)據(jù)容器造成數(shù)據(jù)的不一致。
由于本申請(qǐng)實(shí)施例采用預(yù)置的上下文數(shù)據(jù)容器存儲(chǔ)程序的跟蹤數(shù)據(jù),因此,在所述存儲(chǔ)跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄之前,還包括:激活所述預(yù)置的上下文數(shù)據(jù)容器。
相應(yīng)的,在程序運(yùn)行之后,還包括:回收所述預(yù)置的上下文數(shù)據(jù)容器,以及時(shí)回收內(nèi)存資源,避免資源浪費(fèi)。
步驟S301給出的示例程序中的trace方法,用于生成Pay業(yè)務(wù)相關(guān)的跟蹤數(shù)據(jù),并將跟蹤標(biāo)識(shí)符和跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄存儲(chǔ)到上下文數(shù)據(jù)容器TraceContext中。在所有子程序執(zhí)行后,最終在特定程序的TraceContext生成如下的跟蹤記錄:
TraceId:3A6518CF142543999914200000101A02,time=1425439999142,reqid=1;
TraceId:3A6518CF142543999914200000101A02,time=1425439999143,Pay子程序的跟蹤數(shù)據(jù);
TraceId:3A6518CF142543999914200000101A02,time=1425439999143,Query子程序的跟蹤數(shù)據(jù)。
此外,為了后期能夠?qū)Τ绦蚋檾?shù)據(jù)進(jìn)行分析,在實(shí)際應(yīng)用中,本申請(qǐng)實(shí)施例提供的用于程序跟蹤的方法,還包括:將所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄存儲(chǔ)到預(yù)置的外部存儲(chǔ)區(qū)域,例如,將所述對(duì)應(yīng)記錄存儲(chǔ)到文本文件中,以作為日志文件使用。
需要說(shuō)明的是,在執(zhí)行特定程序包括的各級(jí)子程序過(guò)程中,如果調(diào)用程序運(yùn)行于第一設(shè)備中,被調(diào)用程序運(yùn)行于第二設(shè)備中,假設(shè)用于存儲(chǔ)跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域和用于存儲(chǔ)對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域均是在第一設(shè)備中創(chuàng)建的,則調(diào)用程序可以采用兩種方式調(diào)用被調(diào)用程序,分別為:1)所述調(diào)用程序?qū)⑺龈櫂?biāo)識(shí)符傳遞給所述被調(diào)用程序;2)所述調(diào)用程序直接調(diào)用所述被調(diào)用程序。
1)所述調(diào)用程序?qū)⑺龈櫂?biāo)識(shí)符傳遞給所述被調(diào)用程序。
請(qǐng)參考圖4,其為本申請(qǐng)的用于程序跟蹤的方法實(shí)施例調(diào)用子程序的具體流程圖。采用本方式,所述調(diào)用程序?qū)⑺龈櫂?biāo)識(shí)符傳遞給所述被調(diào)用程序。所述在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄,包括如下步驟:
步驟S401:在所述被調(diào)用程序執(zhí)行后,生成所述被調(diào)用程序的跟蹤數(shù)據(jù)。
步驟S403:根據(jù)接收到的所述跟蹤標(biāo)識(shí)符,所述被調(diào)用程序回調(diào)所述調(diào)用程序,將所述跟蹤數(shù)據(jù)返回給所述調(diào)用程序。
由于第二設(shè)備無(wú)法訪問(wèn)在第一設(shè)備中創(chuàng)建的存儲(chǔ)區(qū)域,因此第二設(shè)備中的被調(diào)用程序自身無(wú)法進(jìn)行有關(guān)存取在第一設(shè)備中創(chuàng)建的存儲(chǔ)區(qū)域的操作,例如:獲取第一設(shè)備中的跟蹤標(biāo)識(shí)符的操作,以及存儲(chǔ)跟蹤數(shù)據(jù)等操作。采用該方式,調(diào)用程序?qū)⒌谝辉O(shè)備中生成的跟蹤標(biāo)識(shí)符傳遞給被調(diào)用程序后,調(diào)用程序可繼續(xù)向下執(zhí)行其它操作(例如,調(diào)用其它子程序),而無(wú)需等待被調(diào)用程序的完成,可見(jiàn)采用該方式,調(diào)用程序和被調(diào)用程序之間采用異步處理的模式,因此能夠提高特定程序的執(zhí)行效率。當(dāng)被調(diào)用程序生成其跟蹤數(shù)據(jù)后,主動(dòng)回調(diào)所述調(diào)用程序,將其跟蹤數(shù)據(jù)返回給所述調(diào)用程序。
步驟S405:所述調(diào)用程序存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述被調(diào)用程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
最終,調(diào)用程序根據(jù)獲取的被調(diào)用程序的跟蹤數(shù)據(jù),存儲(chǔ)所述跟蹤標(biāo)識(shí)符 和所述被調(diào)用程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
2)所述調(diào)用程序直接調(diào)用所述被調(diào)用程序。
請(qǐng)參考圖5,其為本申請(qǐng)的用于程序跟蹤的方法實(shí)施例調(diào)用子程序的又一具體流程圖。采用本方式,所述調(diào)用程序直接調(diào)用所述被調(diào)用程序;所述在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄,包括如下步驟:
步驟S501:在所述被調(diào)用程序執(zhí)行后,生成所述被調(diào)用程序的跟蹤數(shù)據(jù)。
步驟S503:所述被調(diào)用程序?qū)⑺龈檾?shù)據(jù)返回給所述調(diào)用程序。
采用該方式,調(diào)用程序僅直接調(diào)用所述被調(diào)用程序,而不傳遞跟蹤標(biāo)識(shí)符,此時(shí),調(diào)用程序需要等待被調(diào)用程序的完成,方可繼續(xù)向下執(zhí)行其它操作(例如,調(diào)用其它子程序)??梢?jiàn),采用該方式,調(diào)用程序和被調(diào)用程序之間為同步處理的模式,因此該方式較上述傳遞跟蹤標(biāo)識(shí)符的方式而言,程序的執(zhí)行效率較低。當(dāng)被調(diào)用程序生成其跟蹤數(shù)據(jù)后,直接將跟蹤數(shù)據(jù)作為程序的執(zhí)行結(jié)果返回給所述調(diào)用程序,調(diào)用程序此時(shí)才能夠繼續(xù)向下執(zhí)行其它操作。
步驟S505:所述調(diào)用程序存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述被調(diào)用程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
最終,調(diào)用程序根據(jù)獲取的被調(diào)用程序的跟蹤數(shù)據(jù),存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述被調(diào)用程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
在本實(shí)施例中,采用上述第一種方式,即:調(diào)用程序?qū)⒏櫂?biāo)識(shí)符傳遞給被調(diào)用程序,解決調(diào)用程序和被調(diào)用程序不在同一臺(tái)機(jī)器時(shí)的調(diào)用實(shí)現(xiàn)問(wèn)題,以使得調(diào)用程序和被調(diào)用程序可以進(jìn)行異步的操作處理,從而達(dá)到提高程序執(zhí)行效率的效果。
在上述的實(shí)施例中,提供了一種用于程序跟蹤的方法,與之相對(duì)應(yīng)的,本申請(qǐng)還提供一種用于程序跟蹤的裝置。該裝置是與上述方法的實(shí)施例相對(duì)應(yīng)。
請(qǐng)參看圖6,其為本申請(qǐng)的用于程序跟蹤的裝置實(shí)施例的示意圖。由于裝置實(shí)施例基本相似于方法實(shí)施例,所以描述得比較簡(jiǎn)單,相關(guān)之處參見(jiàn)方法實(shí)施例的部分說(shuō)明即可。下述描述的裝置實(shí)施例僅僅是示意性的。
本實(shí)施例的一種用于程序跟蹤的裝置,其特征在于,包括:
接收單元101,用于接收調(diào)用方發(fā)送的對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求;
生成單元103,用于根據(jù)所述調(diào)用請(qǐng)求,生成跟蹤標(biāo)識(shí)符;所述跟蹤標(biāo)識(shí)符用于標(biāo)識(shí)所述特定程序的本次調(diào)用所產(chǎn)生的跟蹤數(shù)據(jù);
跟蹤單元105,用于執(zhí)行所述特定程序包括的各級(jí)子程序,針對(duì)至少一個(gè)所述子程序,在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄;
其中,用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域和用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,是指OSGI和非OSGI的子程序均能夠訪問(wèn)的存儲(chǔ)區(qū)域。
可選的,所述生成單元103包括:
獲取子單元,用于根據(jù)所述調(diào)用請(qǐng)求,獲取所述調(diào)用方的IP地址、所述調(diào)用請(qǐng)求的標(biāo)識(shí)符或所述發(fā)起所述調(diào)用請(qǐng)求的線程標(biāo)識(shí)符或進(jìn)程標(biāo)識(shí)符,以及所述調(diào)用方所屬類(lèi)別的至少一者;
生成子單元,用于根據(jù)所述調(diào)用方的IP地址、所述調(diào)用請(qǐng)求的標(biāo)識(shí)符或所述發(fā)起所述調(diào)用請(qǐng)求的線程標(biāo)識(shí)符或進(jìn)程標(biāo)識(shí)符、當(dāng)前系統(tǒng)時(shí)間,以及所述調(diào)用方所屬類(lèi)別的至少一者,生成所述跟蹤標(biāo)識(shí)符。
可選的,所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域,采用如下方式創(chuàng)建:
在自定義的類(lèi)加載器中創(chuàng)建所述用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域。
可選的,所述用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,采用如下方式創(chuàng)建:
在自定義的類(lèi)加載器中創(chuàng)建所述用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域。
請(qǐng)參看圖7,其為本申請(qǐng)的用于程序跟蹤的裝置實(shí)施例的具體示意圖??蛇x的,所述特定程序是指Java程序語(yǔ)言編寫(xiě)的Web應(yīng)用程序,所述裝置還包括:
配置單元200,用于配置Web容器采用所述自定義的類(lèi)加載器加載所述特定程序。
可選的,還包括:
動(dòng)態(tài)指定單元,用于在加載所述特定程序的過(guò)程中,設(shè)置所述特定程序的類(lèi)加載器為所述自定義的類(lèi)加載器。
請(qǐng)參看圖8,其為本申請(qǐng)的用于程序跟蹤的裝置實(shí)施例跟蹤單元105的具體示意圖。可選的,所述子程序所屬的類(lèi)包括預(yù)先編寫(xiě)的生成并存儲(chǔ)跟蹤數(shù)據(jù)的方法;所述跟蹤單元105包括:
判斷子單元1051,用于判斷所述子程序所屬的類(lèi)是否包括所述生成并存儲(chǔ) 跟蹤數(shù)據(jù)的方法;
跟蹤子單元1053,用于若上述判斷結(jié)果為是,則通過(guò)所述生成并存儲(chǔ)跟蹤數(shù)據(jù)的方法,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
可選的,還包括:
激活單元201,用于激活所述預(yù)置的上下文數(shù)據(jù)容器。
可選的,還包括:
回收單元209,用于回收所述預(yù)置的上下文數(shù)據(jù)容器。
可選的,在執(zhí)行所述特定程序包括的各級(jí)子程序過(guò)程中,如果調(diào)用程序運(yùn)行于第一設(shè)備中,被調(diào)用程序運(yùn)行于第二設(shè)備中,則所述調(diào)用程序?qū)⑺龈櫂?biāo)識(shí)符傳遞給所述被調(diào)用程序;
所述跟蹤子單元1053包括:
生成子單元,用于在所述被調(diào)用程序執(zhí)行后,生成所述被調(diào)用程序的跟蹤數(shù)據(jù);
回調(diào)子單元,用于根據(jù)接收到的所述跟蹤標(biāo)識(shí)符,所述被調(diào)用程序回調(diào)所述調(diào)用程序,將所述跟蹤數(shù)據(jù)返回給所述調(diào)用程序;
存儲(chǔ)子單元,用于所述調(diào)用程序存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述被調(diào)用程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
可選的,在依次執(zhí)行所述特定程序包括的各級(jí)子程序過(guò)程中,如果調(diào)用單元運(yùn)行于第一設(shè)備中,被調(diào)用單元運(yùn)行于第二設(shè)備中,則所述調(diào)用單元直接調(diào)用所述被調(diào)用單元;
所述跟蹤子單元1053包括:
生成子單元,用于在所述被調(diào)用程序執(zhí)行后,生成所述被調(diào)用程序的跟蹤數(shù)據(jù);
返回子單元,用于所述被調(diào)用程序?qū)⑺龈檾?shù)據(jù)返回給所述調(diào)用程序;
存儲(chǔ)子單元,用于所述調(diào)用程序存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述被調(diào)用程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
請(qǐng)參考圖9,其為本申請(qǐng)的電子設(shè)備實(shí)施例的示意圖。由于設(shè)備實(shí)施例基本相似于方法實(shí)施例,所以描述得比較簡(jiǎn)單,相關(guān)之處參見(jiàn)方法實(shí)施例的部分說(shuō) 明即可。下述描述的設(shè)備實(shí)施例僅僅是示意性的。
本實(shí)施例的一種電子設(shè)備,該電子設(shè)備包括:顯示器901;處理器902;以及存儲(chǔ)器9003,用于存儲(chǔ)用于程序跟蹤的裝置,所述用于程序跟蹤的裝置被所述處理器902執(zhí)行時(shí),包括如下步驟:接收調(diào)用方發(fā)送的對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求;根據(jù)所述調(diào)用請(qǐng)求,生成跟蹤標(biāo)識(shí)符;所述跟蹤標(biāo)識(shí)符用于標(biāo)識(shí)所述特定程序的本次調(diào)用所產(chǎn)生的跟蹤數(shù)據(jù);執(zhí)行所述特定程序包括的各級(jí)子程序,針對(duì)至少一個(gè)所述子程序,在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄;其中,用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域和用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,是指OSGI和非OSGI的子程序均能夠訪問(wèn)的存儲(chǔ)區(qū)域。
本申請(qǐng)?zhí)峁┑挠糜诔绦蚋櫟姆椒?、裝置及電子設(shè)備,通過(guò)接收調(diào)用方發(fā)送的對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求,并根據(jù)所述調(diào)用請(qǐng)求,生成跟蹤標(biāo)識(shí)符,所述跟蹤標(biāo)識(shí)符用于標(biāo)識(shí)所述特定程序的本次調(diào)用所產(chǎn)生的跟蹤數(shù)據(jù),然后執(zhí)行所述特定程序包括的各級(jí)子程序,針對(duì)至少一個(gè)所述子程序,在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄,其中,用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,均是指在OSGI和非OSGI的子程序均能夠訪問(wèn)的存儲(chǔ)區(qū)域,使得非OSGi的應(yīng)用程序在跟蹤記錄OSGi的子程序的功能運(yùn)行情況時(shí),能夠分離子程序的跟蹤處理邏輯和業(yè)務(wù)處理邏輯,避免對(duì)各個(gè)子程序進(jìn)行源代碼級(jí)的改造,從而達(dá)到不影響非OSGi的應(yīng)用程序業(yè)務(wù)處理的健壯性和可靠性的效果。
與上述的用于程序跟蹤的方法相對(duì)應(yīng),本申請(qǐng)還提供一種流量控制方法。請(qǐng)參考圖10,其為本申請(qǐng)的流量控制方法實(shí)施例的流程圖,本實(shí)施例與第一實(shí)施例內(nèi)容相同的部分不再贅述,請(qǐng)參見(jiàn)實(shí)施例一中的相應(yīng)部分。本申請(qǐng)?zhí)峁┑囊环N流量控制方法,所述方法包括如下步驟:
步驟S1001:接收調(diào)用方發(fā)送的對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求。
本申請(qǐng)實(shí)施例所述的調(diào)用方、特定程序,與上述用于程序跟蹤的方法的實(shí)施例一中的對(duì)應(yīng)概念是一致的,此處不再贅述,相關(guān)說(shuō)明詳見(jiàn)上述實(shí)施例一的部分說(shuō)明。
步驟S1003:獲取當(dāng)前時(shí)間之前預(yù)設(shè)時(shí)間范圍內(nèi)的預(yù)存的所述特定程序的歷史程序跟蹤記錄。
本申請(qǐng)實(shí)施例所述的特定程序的歷史程序跟蹤記錄,是指特定程序運(yùn)行過(guò)程中產(chǎn)生的程序跟蹤數(shù)據(jù)。具體的,程序跟蹤數(shù)據(jù)包括:特定程序包括的各級(jí)子程序的起始執(zhí)行時(shí)間、所述子程序的實(shí)際調(diào)用參數(shù)、所述子程序的執(zhí)行結(jié)果和所述子程序拋出的異常信息的至少一者。
針對(duì)調(diào)用方發(fā)出的每一次調(diào)用請(qǐng)求,均對(duì)應(yīng)一個(gè)調(diào)用請(qǐng)求標(biāo)識(shí)符。在本實(shí)施例中,當(dāng)調(diào)用方為客戶端時(shí),調(diào)用請(qǐng)求的標(biāo)識(shí)符為系統(tǒng)自動(dòng)為調(diào)用請(qǐng)求生成的調(diào)用請(qǐng)求的標(biāo)識(shí)符;當(dāng)調(diào)用方為第三方應(yīng)用時(shí),則調(diào)用請(qǐng)求的標(biāo)識(shí)符為第三方應(yīng)用發(fā)起調(diào)用請(qǐng)求的線程標(biāo)識(shí)符或進(jìn)程標(biāo)識(shí)符。在實(shí)際應(yīng)用中,還可以采用其他方式生成調(diào)用請(qǐng)求的標(biāo)識(shí)符,例如:生成隨機(jī)數(shù)的方法等。各種不同的方式都只是具體實(shí)施方式的變更,都不偏離本申請(qǐng)的核心,因此都在本申請(qǐng)的保護(hù)范圍之內(nèi)。
例如,當(dāng)3個(gè)客戶端用戶在同一時(shí)間訪問(wèn)同一特定程序時(shí),產(chǎn)生的歷史程序跟蹤數(shù)據(jù)如下所示:
每次訪問(wèn)特定程序所產(chǎn)生的程序跟蹤數(shù)據(jù)均被記錄保存,作為該特定程序的歷史程序跟蹤記錄。在實(shí)際應(yīng)用中,可以將這些程序跟蹤記錄保存到數(shù)據(jù)庫(kù)或者硬盤(pán)等存儲(chǔ)設(shè)備。
請(qǐng)參考圖11,其為本申請(qǐng)的流量控制方法實(shí)施例生成歷史程序跟蹤記錄的具體流程圖,本申請(qǐng)實(shí)施例所述的歷史程序跟蹤記錄采用如下步驟生成:
步驟S1101:接收調(diào)用方發(fā)送的對(duì)應(yīng)所述特定程序的調(diào)用請(qǐng)求。
步驟S1103:根據(jù)所述調(diào)用請(qǐng)求,生成跟蹤標(biāo)識(shí)符;所述跟蹤標(biāo)識(shí)符用于標(biāo)識(shí)所述特定程序的本次調(diào)用所產(chǎn)生的跟蹤數(shù)據(jù)。
步驟S1105:執(zhí)行所述特定程序包括的各級(jí)子程序,針對(duì)至少一個(gè)所述子程序,在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄。
本申請(qǐng)實(shí)施例所述的用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域和用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,是指OSGI和非OSGI的子程序均能夠訪問(wèn)的存儲(chǔ)區(qū)域。
步驟S1101、步驟S1103和步驟S1105分別與上述實(shí)施例一中的步驟S101、步驟S103和步驟S105相對(duì)應(yīng),相同之處此處不再贅述,詳見(jiàn)實(shí)施例一中的相關(guān)說(shuō)明。
步驟S1107:將所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄存儲(chǔ)到預(yù)置的外部存儲(chǔ)區(qū)域,作為所述歷史程序跟蹤記錄。
當(dāng)通過(guò)步驟S1105,執(zhí)行完將所述特定程序包括的各級(jí)子程序后,還需要將所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄存儲(chǔ)到預(yù)置的外部存儲(chǔ)區(qū)域,例如,將所述對(duì)應(yīng)記錄存儲(chǔ)到文本文件或數(shù)據(jù)庫(kù)中,以作為歷史程序跟蹤記錄,供離線分析處理用。
通過(guò)步驟S1003,獲取當(dāng)前時(shí)間之前預(yù)設(shè)時(shí)間范圍內(nèi)的預(yù)存的所述特定程序的歷史程序跟蹤記錄。假設(shè)當(dāng)前時(shí)間為1425439999145,根據(jù)當(dāng)前系統(tǒng)時(shí)間,將在1425439999145時(shí)間點(diǎn)之前預(yù)設(shè)時(shí)間范圍(例如:10ms)內(nèi)的數(shù)據(jù)取出。需要說(shuō)明的是,對(duì)于每次歷史調(diào)用請(qǐng)求只取一條程序跟蹤數(shù)據(jù)即可,原因在于:一條程序跟蹤數(shù)據(jù)即可表明一次歷史調(diào)用請(qǐng)求。
步驟S1005:根據(jù)獲取的所述歷史程序跟蹤記錄,對(duì)所述調(diào)用方進(jìn)行流量控制。
請(qǐng)參考圖12,其為本申請(qǐng)的流量控制方法實(shí)施例步驟S1005的具體流程圖。在本實(shí)施例中,所述根據(jù)獲取的所述歷史程序跟蹤記錄,對(duì)所述調(diào)用方進(jìn)行流量控制,包括:
步驟S10051:根據(jù)所述歷史程序跟蹤記錄,計(jì)算獲取在所述當(dāng)前時(shí)間之前預(yù)設(shè)時(shí)間范圍內(nèi)的針對(duì)所述特定程序的歷史訪問(wèn)量。
將步驟S1003提取到的歷史程序跟蹤記錄記為數(shù)據(jù)集A,從數(shù)據(jù)集A可以計(jì)算獲得預(yù)設(shè)時(shí)間范圍內(nèi)對(duì)于特定程序的用戶訪問(wèn)量。然后,根據(jù)用戶訪問(wèn)量, 就可以進(jìn)行用戶訪問(wèn)流量控制。
在實(shí)際應(yīng)用中,當(dāng)需要對(duì)特定程序的某個(gè)子程序(也稱(chēng)為“服務(wù)”)的流量進(jìn)行控制時(shí),例如,希望控制serviceA的服務(wù)訪問(wèn)量,那么取出預(yù)設(shè)時(shí)間范圍內(nèi)內(nèi)帶serviceA標(biāo)記的程序跟蹤記錄,記為數(shù)據(jù)集B,則這個(gè)數(shù)據(jù)集B為serviceA在預(yù)設(shè)時(shí)間范圍內(nèi)內(nèi)的訪問(wèn)情況,根據(jù)數(shù)據(jù)集B可以對(duì)serviceA進(jìn)行流量控制。
步驟S10053:判斷所述歷史訪問(wèn)量是否大于預(yù)設(shè)的訪問(wèn)量閾值。
當(dāng)需要對(duì)特定程序進(jìn)行流量控制處理時(shí),需要為所述特定程序預(yù)設(shè)訪問(wèn)量閾值。在獲取到當(dāng)前時(shí)間之前預(yù)設(shè)時(shí)間范圍內(nèi)的歷史訪問(wèn)量后,將歷史訪問(wèn)量與預(yù)設(shè)的訪問(wèn)量閾值相比較,判斷歷史訪問(wèn)量是否大于預(yù)設(shè)的訪問(wèn)量閾值。
步驟S10055:若上述判斷結(jié)果為是,則按照預(yù)設(shè)的流量控制策略處理所述調(diào)用請(qǐng)求。
如果歷史訪問(wèn)量是否大于預(yù)設(shè)的訪問(wèn)量閾值,則表明特定程序需要進(jìn)行流量控制處理。在實(shí)際應(yīng)用中,按照為特定程序預(yù)設(shè)的流量控制策略處理調(diào)用方方發(fā)送的調(diào)用請(qǐng)求。
在上述的實(shí)施例中,提供了一種流量控制方法,與之相對(duì)應(yīng)的,本申請(qǐng)還提供一種流量控制裝置。該裝置是與上述方法的實(shí)施例相對(duì)應(yīng)。
請(qǐng)參看圖13,其為本申請(qǐng)的流量控制裝置實(shí)施例的示意圖。由于裝置實(shí)施例基本相似于方法實(shí)施例,所以描述得比較簡(jiǎn)單,相關(guān)之處參見(jiàn)方法實(shí)施例的部分說(shuō)明即可。下述描述的裝置實(shí)施例僅僅是示意性的。
本實(shí)施例的一種流量控制裝置,其特征在于,包括:
接收單元1301,用于接收調(diào)用方發(fā)送的對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求;
獲取單元1303,用于獲取當(dāng)前時(shí)間之前預(yù)設(shè)時(shí)間范圍內(nèi)的預(yù)存的所述特定程序的歷史程序跟蹤記錄;
控制單元1305,用于根據(jù)獲取的所述歷史程序跟蹤記錄,對(duì)所述調(diào)用方進(jìn)行流量控制。
可選的,還包括:
生成單元,用于生成所述歷史程序跟蹤記錄;
可選的,所述生成單元包括:
接收子單元,用于接收調(diào)用方發(fā)送的對(duì)應(yīng)所述特定程序的調(diào)用請(qǐng)求;
生成子單元,用于根據(jù)所述調(diào)用請(qǐng)求,生成跟蹤標(biāo)識(shí)符;所述跟蹤標(biāo)識(shí)符用于標(biāo)識(shí)所述特定程序的本次調(diào)用所產(chǎn)生的跟蹤數(shù)據(jù);
跟蹤子單元,用于執(zhí)行所述特定程序包括的各級(jí)子程序,針對(duì)至少一個(gè)所述子程序,在所述子程序執(zhí)行后,生成所述子程序的跟蹤數(shù)據(jù),并存儲(chǔ)所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄;
存儲(chǔ)子單元,用于將所述跟蹤標(biāo)識(shí)符和所述子程序的跟蹤數(shù)據(jù)的對(duì)應(yīng)記錄存儲(chǔ)到預(yù)置的外部存儲(chǔ)區(qū)域,作為所述歷史程序跟蹤記錄;
其中,用于存儲(chǔ)所述跟蹤標(biāo)識(shí)符的存儲(chǔ)區(qū)域和用于存儲(chǔ)所述對(duì)應(yīng)記錄的存儲(chǔ)區(qū)域,是指OSGI和非OSGI的子程序均能夠訪問(wèn)的存儲(chǔ)區(qū)域。
可選的,所述控制單元1305包括:
計(jì)算子單元,用于根據(jù)所述歷史程序跟蹤記錄,計(jì)算獲取在所述當(dāng)前時(shí)間之前預(yù)設(shè)時(shí)間范圍內(nèi)的針對(duì)所述特定程序的歷史訪問(wèn)量;
判斷子單元,用于判斷所述歷史訪問(wèn)量是否大于預(yù)設(shè)的訪問(wèn)量閾值;
處理子單元,用于若上述判斷結(jié)果為是,則按照預(yù)設(shè)的流量控制策略處理所述調(diào)用請(qǐng)求。
請(qǐng)參考圖14,其為本申請(qǐng)的又一電子設(shè)備實(shí)施例的示意圖。由于設(shè)備實(shí)施例基本相似于方法實(shí)施例,所以描述得比較簡(jiǎn)單,相關(guān)之處參見(jiàn)方法實(shí)施例的部分說(shuō)明即可。下述描述的設(shè)備實(shí)施例僅僅是示意性的。
本實(shí)施例的又一種電子設(shè)備,該電子設(shè)備包括:顯示器1401;處理器1402;以及存儲(chǔ)器1403,用于存儲(chǔ)流量控制裝置,所述流量控制裝置被所述處理器1402執(zhí)行時(shí),包括如下步驟:接收調(diào)用方發(fā)送的對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求;獲取當(dāng)前時(shí)間之前預(yù)設(shè)時(shí)間范圍內(nèi)的預(yù)存的所述特定程序的歷史程序跟蹤記錄;根據(jù)獲取的所述歷史程序跟蹤記錄,對(duì)所述調(diào)用方進(jìn)行流量控制。
本申請(qǐng)?zhí)峁┑牧髁靠刂品椒?、裝置及電子設(shè)備,通過(guò)接收調(diào)用方發(fā)送的對(duì)應(yīng)特定程序的調(diào)用請(qǐng)求,獲取當(dāng)前時(shí)間之前預(yù)設(shè)時(shí)間范圍內(nèi)的預(yù)存的所述特定程序的歷史程序跟蹤記錄,并根據(jù)獲取的所述歷史程序跟蹤記錄,對(duì)所述調(diào)用方進(jìn)行流量控制,能夠?qū)崿F(xiàn)根據(jù)特定程序的歷史程序跟蹤記錄,對(duì)特定程序進(jìn)行流量控制。
本申請(qǐng)雖然以較佳實(shí)施例公開(kāi)如上,但其并不是用來(lái)限定本申請(qǐng),任何本領(lǐng)域技術(shù)人員在不脫離本申請(qǐng)的精神和范圍內(nèi),都可以做出可能的變動(dòng)和修改, 因此本申請(qǐng)的保護(hù)范圍應(yīng)當(dāng)以本申請(qǐng)權(quán)利要求所界定的范圍為準(zhǔn)。
在一個(gè)典型的配置中,計(jì)算設(shè)備包括一個(gè)或多個(gè)處理器(CPU)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。
內(nèi)存可能包括計(jì)算機(jī)可讀介質(zhì)中的非永久性存儲(chǔ)器,隨機(jī)存取存儲(chǔ)器(RAM)和/或非易失性內(nèi)存等形式,如只讀存儲(chǔ)器(ROM)或閃存(flash RAM)。內(nèi)存是計(jì)算機(jī)可讀介質(zhì)的示例。
1、計(jì)算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動(dòng)和非可移動(dòng)媒體可以由任何方法或技術(shù)來(lái)實(shí)現(xiàn)信息存儲(chǔ)。信息可以是計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計(jì)算機(jī)的存儲(chǔ)介質(zhì)的例子包括,但不限于相變內(nèi)存(PRAM)、靜態(tài)隨機(jī)存取存儲(chǔ)器(SRAM)、動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(DRAM)、其他類(lèi)型的隨機(jī)存取存儲(chǔ)器(RAM)、只讀存儲(chǔ)器(ROM)、電可擦除可編程只讀存儲(chǔ)器(EEPROM)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤(pán)只讀存儲(chǔ)器(CD-ROM)、數(shù)字多功能光盤(pán)(DVD)或其他光學(xué)存儲(chǔ)、磁盒式磁帶,磁帶磁磁盤(pán)存儲(chǔ)或其他磁性存儲(chǔ)設(shè)備或任何其他非傳輸介質(zhì),可用于存儲(chǔ)可以被計(jì)算設(shè)備訪問(wèn)的信息。按照本文中的界定,計(jì)算機(jī)可讀介質(zhì)不包括非暫存電腦可讀媒體(transitory media),如調(diào)制的數(shù)據(jù)信號(hào)和載波。
2、本領(lǐng)域技術(shù)人員應(yīng)明白,本申請(qǐng)的實(shí)施例可提供為方法、系統(tǒng)或計(jì)算機(jī)程序產(chǎn)品。因此,本申請(qǐng)可采用完全硬件實(shí)施例、完全軟件實(shí)施例或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本申請(qǐng)可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤(pán)存儲(chǔ)器、CD-ROM、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。