1. 程式人生 > >(原創)如何在效能測試中自動生成並獲取Oracle AWR報告

(原創)如何在效能測試中自動生成並獲取Oracle AWR報告

由於日常使用最多的資料庫為Oracle,因此,最近又打起了Oracle的AWR報告的主意。

過去我們執行測試,都是執行開始和結束分別手動建立一個快照,然後需要這部分資料的時候再去獲取AWR報告檢視。

但是有的時候忙亂起來或者一個任務項交給別人來做就經常會有忘記建立快照的情況,這時候就只能通過Oracle自己預設建立的快照來獲取了。但是我們知道 Oracle預設是一個小時才建立一個快照,且建立快照的時間點很難跟我們的測試過程能匹配到一起,這樣我們獲取的測試報告就有了很多的干擾項。

而且,有很多新來的小朋友做效能測試的時候也並不知道該怎麼取報告。每次都要去教的話,不是我的風格,懶癌晚期當然是能偷懶就偷懶了。於是開始動起了歪腦經:能不能使用

軟體測試工具同步把AWR報告也收集過來呢,如果可以整合到指令碼中,那麼獲取AWR報告的時候使用的始末快照就能跟我們的測試過程完全匹配了,也防止了因為疏忽忘記建立快照的情況。

可以選擇的測試工具有很多,比如LoadrunnerJmeterHyperPacer等,仔細研究了HyperPacer提供的JDBC取樣器,發現作為測試工具中的大佬——HyperPacer完全可以勝任這個需求。

對如何在效能測試中手工生成AWR報告完成資料庫效能分析還不瞭解的同學猛戳這裡瞭解!

於是大概梳理了一下思路:

首先:

在初始化場景內:新增JDBC取樣器,分別進行兩個操作:一個是通過dbms_workload_repository這個包提供的create_snapshot()建立快照,然後查詢當前最大的快照號,也就是我們剛剛建立的快照,作為測試的起始快照號;

在收尾場景內:新增JDBC取樣器,同樣建立快照,並查詢當前最大快照號,作為測試的終止快照號;再多新增一個JDBC取樣器,通過包dbms_workload_repository提供的方法AWR_report_html獲取兩個快照間的AWR報告。

理想很美好,但是實際實現起來卻發現沒有那麼簡單。原來想當然的是在初始化場景裡先獲取測試開始的快照號,然後作為變數傳給收尾場景的JDBC取樣器。但是執行的時候一直報變數無效。

想了好久不知道是什麼原因,最後忽然想明白原因了,沒想到學習使用了這麼長時間的HyperPacer,最後在小–(陰)–(溝)—(裡)翻了船。

獲取初始快照號的取樣器建在初始化場景下,這也就決定了這個取樣器的作用域只能在初始化場景下,我把它輸出的變數傳給收尾場景的取樣器,超出了作用域自然就無法識別了。

汗~~~~~~~~~~

於是只好調整思路,既然無法完美實現,那麼只好退而求其次,初始化場景只建立快照,獲取這個快照號的取樣器移到收尾場景內。於是最終實現後就是如圖下面的樣子:

可以看到在快照瀏覽器裡已經取到對應本次執行過程的AWR報告。
下面給童鞋們說一下具體的實現步驟:

依賴於HyperPacer強大的功能,要實現這個自動獲取AWR報告的需求,腳本里面其實只用到了兩個元件來實現,配置元件裡的JDBC連線配置和取樣器裡的JDBC請求取樣器。

第一步:我們需要在工程Demo下面增加一個配置元件,JDBC連線配置,配置介面如下:

配置介面很簡單,首先需要自定義一個數據源名稱,因為在後面我們的JDBC取樣器都會用到這個變數裡定義的名稱,所以儘量用識別度高且有實際含義的名稱。

然後下面是選擇資料庫型別和填寫資料來源的連線資訊,截圖已經給出了各個圖形介面輸入框的含義。小夥伴們還可以選擇勾上URL的複選框,然後自己把TNS檔案裡配置的連線資訊直接簡單粗暴的Copy進來。

第二步:在初始化場景裡新增JDBC取樣器,如下圖配置:

第三步:在收尾場景裡新增5個JDBC取樣器,分別如下:

建立結束快照號

獲取DBID

獲取例項NUMBER

獲取開始和結束快照號

獲取AWR報告正文

齊活,以除錯模式執行,然後就可以在快照瀏覽器裡,選中我們定義的獲取AWR報告正文的取樣器“獲取AWR報告資料”,在右側的渲染裡就可以看到AWR報告了。

好了,相信大家按照這個步驟做下來應該已經學會如何使用HyperPacer自動獲取AWR報告了。然—並—卵,因為我要告訴大家的是:一個好訊息一個壞訊息。

壞訊息是:即便你取到了AWR報告,你可能根本不知道該看哪裡而且也看不懂;好訊息是:HyperPacer運營組後續可能會因為小夥伴們要求傳授此類知識的呼聲太高而不得不組織此類培訓哦。

最後,作為一個有情懷的人,我必須直面HyperPacer的不完美,所以我必須要告訴大家,這個實現方案並不完美。這樣的實現為什麼我說不完美呢?因為,就如我們前面所說,Oracle預設情況下自己也會隔一個小時做一個快照,假設我們的測試過程耗時較長,超過了一個小時,那麼,我們再去取最大的兩個快照號時,實際上取到的是下圖所示的紅框內的統計資料。

如果我們能預先知道測試執行多長時間,我們還可以手動修改一下提取快照號的SQL(如何修改,來HyperPacer的交流群來問我啊),但是如果沒辦法預知測試耗時,那就沒辦法支援了。

還有一個不完美的地方,那就是隻能在除錯模式下才能看到取到的AWR報告,雖然說,我們需要AWR報告的時候大多都是在排查問題的時候,使用除錯模式也無可厚非,但是,有著強迫症的我,總覺得指令碼除錯模式的效能損耗會把本來可以漂亮的結果拖累成一個Ugly things。以前的快照瀏覽器明明是一個配置元件,為什麼它長大了就變成了一個功能頁籤。

於是,懷著無比鬱悶的心情,我給HyperPacer技術組的小夥伴們又提了兩個需求:

1、真心希望HyperPacer能夠再增加一個全域性變數配置的地方,通過對該變數讀寫進行跨域的引數傳遞。

2、執行模式也能支援特定的取樣器結果輸出。

提完需求,技術組的小夥伴哭著去加班去解決了,而我,美美的坐上了班車回家了。