軟體異常追蹤利器Bugsnag使用詳解

2016-03-16    分類:其他、程式設計開發、首頁精華3人評論發表於2016-03-16

本文由碼農網 – 付輝原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

我們每個人都在追求建立一個無bug的應用程式,但這卻是不可能的。所以我們需要隨時監控程式中出現的問題,並且立即採取相應措施。一些公司已經試著在解決這個問題:如何能夠快速方便的監控錯誤、解決錯誤。Bugsnag 可以說是他們中比較優秀的了。Bugsnag的官網地址:https://bugsnag.com

他們所關注的重點:如何提供一個bug監控和通知系統,讓你及時感知到錯誤的發生以及與錯誤相關的具體內容,幫助你通過多種途徑來解決問題。接下來我們將去探索Bugsnag ,我們已經將其整合到一個Laravel框架的應用程式中,你可以從GitHub上下載示例Demo,跟著文章一起來探索。GitHub上下載的地址:https://github.com/Whyounes/bugsnag_demo

安裝示例專案

按照下面步驟去建立這個demo程式(前提是你本地已經有PHP的執行環境。這裡提供一個參考: )

// clone the repo
git clone git@github.com:Whyounes/bugsnag_demo.git

cd bugsnag_demo

// update dependencies
composer update

// migrate and seed the database
php artisan migrate && php artisan db:seed

在BugSnag上建立賬戶

在使用BugSnag之前,我們首先需要建立一個賬戶,同時建立我們的新專案。你能夠免費使用30天(現在已經修改為15天),對於是否要切換到付費,則依賴你的專案了。註冊成功之後,你就不得不建立新的專案,同時需要指定專案的型別。在我們的例子中,專案型別就是PHP。

新增BugSnag到我們的專案

Bugsnag針對不同的專案型別提供了一個通知列表。我們需要安裝配置PHP的通知包。另外, 因為提供的Demo是使用Laravel 4版本開發,但你可能使用了這個Laravel版本的安裝包,輕輕鬆鬆通過這個整合指導建立了你自己的專案。因為你安裝的版本是5.0+,所以在這種的情況下,我們儘量   使用跟框架無關的方法。

安裝Bugsnag包

$ composer require bugsnag/bugsnag:2.*

在bugsnag的控制皮膚裡選擇Settings > Project Settings,獲取專案的API key。可以將key儲存為一個環境變數,或者存放在程式的配置檔案中。專案中我們將它新增到app/config/app.php檔案中。

// app/config/app.php

return array(
    // ...
    'bugsnag_api_key'   => 'YOUR KEY'
    // ...
);

在app/start/global.php檔案中,我們將專案和bugsnag客戶端進行繫結並配置bugsnag。

// app/start/global.php

App::singleton('bugsnag', function() {
    $bugsnag = new Bugsnag_Client( Config::get('app.bugsnag_api_key') );

    return $bugsnag;
});

// ...

Bugsnag依賴注入的設定會發生變化,這取決於的你的應用程式配置。上面的程式碼案例對於Laravel 框架的專案非常普遍。此外,你也可以設定一個監控的發版階段,比如開發階段或者生產階段。

$bugsnag->setReleaseStage(App::environment());

使用上述程式碼,bugsnag就只會記錄應用程式在指定發版階段的問題。

建立了Bugsnag客戶端之後,需要將其和程式中的錯誤處理相關聯,這也取決於程式中處理異常和錯誤的機制。Laravel提供了fatal和error方來來接受回撥的處理函式(即當錯誤發生是呼叫的處理函式),同時你也可以使用PHP的set_exeception_handle和set_error_handle方法。

// app/start/global.php

App::error(function($exception) {
    App::make('bugsnag')->notifyException($exception, null, "error");
});

App::fatal(function($exception) {
    App::make('bugsnag')->notifyException($exception, null, "error");
});

上述notifyException方法可以接收附加的後設資料作為第二個引數。第三個引數是錯誤的等級,預設為warning。如果你想將其直接關聯到PHP的錯誤和異常處理的話,也可以執行如下操作:

$bugsnag = App::make('bugsnag');

set_error_handler(array($bugsnag, 'errorHandler'));
set_exception_handler(array($bugsnag, 'exceptionHandler'));

配置Bugsnag

將使用者的詳細資訊新增到error記錄中。

預設情況下,Bugsnag的記錄中會有登入使用者的唯一標識,但是你可以通過修改Bugsnag客戶端例項來改變。

// app/start/global.php

App::make('bugsnag')->setUser([
    'email' => Auth::check() ? Auth::user()->email : 'Guest user'
]);

選擇user標籤,在錯誤的詳細資訊裡,可以看到使用者的標識了。(下面記錄的資訊是使用者的郵箱)

User details

在向伺服器傳送ERROR物件之前,通過呼叫setBeforeNotifyFunction函式可以對其進行修改,該方法接受一個回撥函式作為引數。

// app/start/global.php

App::make('bugsnag')->setBeforeNotifyFunction(function($error) {
    $error->setMetaData([
        "user" => [
            "username" => Auth::check() ? Auth::user()->username : 'Guest user'
        ],
        "metrics" => [
            "Metric 1" => "Some data here"
        ]
    ]);
});

看下面的截圖就會發現,我們使用標籤列表對錯誤的詳細資訊進行了分組。你可以更新這些標籤,或者新增一個新標籤。

Before notif

為避免洩露使用者或應用程式的敏感資料,可以在Bugsnag例項中新增你要過濾的屬性列表。這些屬性的值在控制皮膚上就會替代為FILTERRD。(下面是過濾了password的程式碼)

// app/start/global.php

App::singleton('bugsnag', function() {
    $bugsnag = new Bugsnag_Client( Config::get('app.bugsnag_api_key') );
    $bugsnag->setFilters([
        'password'
    ]);

    return $bugsnag;
});

// ...

Bugsnag的控制皮膚

在我們建立了Bugsnag賬戶並將它關聯到我們的程式之後,我們需要去訪問控制皮膚來探索Bugsnag所提供的不同元件功能。我們選擇Inbox檢視的話,會顯示一個錯誤列表,並可以對其進行篩選。我們還可以切換到timeline 圖表頁,可以通過檢視文件來獲取更多的詳細資訊。

Timeline Graph

生成一些錯誤

在問題檢視模板內部,顯示了發生問題的使用者名稱。該使用者被刪除將會引起一個問題,丟擲一個錯誤(試圖去獲取非物件的屬性)。如果大量的使用者訪問了這個問題頁(可以通過多次訪問同一個頁面來模擬這種情況),太多相同的錯誤會將控制皮膚弄得凌亂不堪。如果你使用artisan db:seed 命令來填充資料庫,你將一個問題分配給一個使用者通過資料庫中不存在的id。

Grouping errors

Error details

其實我們並不用擔心:控制皮膚上會顯示那麼多重複的錯誤,需要我們專門給錯誤進行分組。Bugsnag在解析完錯誤之後,將會自動判斷他所處理的錯誤是重複的錯誤還是新錯誤。

我們可以在訪問物件的使用者名稱屬性時,通過增加一個簡單的判斷,來修復這個錯誤。

// app/views/user/questions.blade.php

// ...
{{ isset($question->user) ? $question->user->username : 'User deleted' }}
//...

過濾

為了能夠調查發生的問題,Bugsnag提供給了我們一組過濾器來向下鑽取資料並收集有關該問題根源的具體細節資訊

通過頂部過濾條中的日期範圍選擇器,你能夠按照時間對錯誤進行過濾。或者選擇all來檢視所有的錯誤。

通過資料來過濾錯誤是一個比較好的途徑,像使用者,錯誤狀態,嚴重程度,指派給誰等。你可以檢查Bugsnag文件檢視支援的過濾器列表。Bugsnag會解析你傳送的錯誤資訊,這也有助於自動完成要搜尋的條目,比如主機名,發版階段等。

Filters

新增合作開發者

這將是一個好的機會,對於你的專案或者你管理的專案,你都不是一個人在工作。通過點選頁面右上角的collaborators 連結,你就可以新增專案的合作開發者了。

Collaborators

Bugsnag會解析錯誤,並對錯誤進行分組來避免出現重複的錯誤列表。選擇一個錯誤後,你可以將它指派給一個已經存在的合作開發者,或者邀請一個新的合作開發者。

Assign to collaborator

錯誤狀態

在控制面的左側邊欄顯示了通過狀態進行分組的錯誤列表(開啟,處理中,已修復,延後處理,忽略)。選中其中一個錯誤,你就可以對它的狀態進行修改了。

Error status

預設情況下,Bugsnag將僅僅顯示處於開啟狀態的錯誤,來幫助我們確定目前活躍的錯誤。通過使用前面提到的過濾器,你也可以改變這一點。

延期和忽略錯誤

如果你有一個錯誤頻繁發生,你的團隊正在對它做修復。你能夠修改觸發該錯誤的頻率或者指定一個條件來觸發該錯誤。

Snoozing errors

如果你想去忽略這個錯誤,你可以使用操作選單上snooze選項旁邊的ignore按鈕來實現。但是並不推薦你這麼做。

第三方通知

專案團隊在開發過程中經常會使用多個應用程式和服務。Bugsnag提供了一個通知外掛列表,我們能夠配置其為不同型別的錯誤傳送通知。你能夠在Slack上通知你的團隊,在Github建立問題,提交到你服務的webhook上等。

Slack通知

導航到專案的Settings ,點選 Team Notifications連結,會顯示一個已經整合的列表,然後選擇Slack。

我們需要指定什麼時候應該通知我們和錯誤發生的頻率。然後我們需要通過點選輸入框上邊的link,來獲取我們的Slack webhook URL,複製URL連結到文字框,點選測試。

Slack notification

在Github上建立問題

另一種作用於錯誤通知的方式就是建立一個新的Github問題。導航到Settings,點選Issue Tracker 連結,顯示已經整合的列表,選擇其中的Github issues

Github Issue

Github Issue Test

總結

Bugsnag提供了一個很好的平臺,實現了錯誤的自動跟蹤,節省了我們花費在處理日誌和建立監控的指令碼上的時間等。你可以在專注於構建應用程式的同時,密切關注你釋出版本的情況。

Bugsnag已經吸引了一些大公司,比如Github, Cisco, Linkedln等。你可以通過15天的免費使用來探索其可用的功能。如果你真的喜歡它,可以考慮付費服務。如果你正在使用別的錯誤監控平臺,或者你已經嘗試過了Bugsnag,也請你知道我們你的看法。

譯文連結:http://www.codeceo.com/article/bugsnag-usage.html
英文原文:Introducing Bugsnag – the Last Error Monitor You’ll Need
翻譯作者:碼農網 – 付輝
轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]

相關文章