Sentry 是一個錯誤記錄和聚合的平臺。Sentry除了提供了PaaS平臺供直接使用,更開放了私有部署方式,關於如何使用Docker快速搭建私有Sentry,可以閱讀我上篇文章[譯] 使用Docker安裝Sentry(一個錯誤記錄和聚合平臺)。
在PHP中使用Sentry非常簡單。在安裝庫之後,您可以直接與客戶端進行互動並開始提交資料。
安裝庫
Sentry的PHP SDK支援PHP 5.3及更高版本。 它可作為BSD許可的開放原始碼庫提供。
有多種方法可以為Sentry安裝PHP整合。 推薦的方法是使用Composer:
composer require "sentry/sentry"
複製程式碼
或者,您可以手動安裝它:
- 下載並提取最新的sentry-php檔案到您的PHP專案。
- 在您的應用程式中需要自動載入器:
require_once '/path/to/Raven/library/Raven/Autoloader.php';
Raven_Autoloader::register();
複製程式碼
基礎
最重要的部分是建立Sentry客戶端。建立一次,並從您希望與Sentry互動的任何位置引用它:
$sentryClient = new Raven_Client('https://<key>:<secret>@sentry.io/<project>');
複製程式碼
捕獲錯誤
Sentry包含用於報告任何未捕獲的異常或PHP錯誤的基本功能。這是通過錯誤處理程式完成的,併為每個PHP的內建報告提供適當的鉤子:
$error_handler = new Raven_ErrorHandler($sentryClient);
$error_handler->registerExceptionHandler();
$error_handler->registerErrorHandler();
$error_handler->registerShutdownFunction();
複製程式碼
在Raven_Client例項上呼叫install()將自動註冊這些處理程式。
報告Exceptions
如果您想手動報告異常,可以使用captureException函式。
// 基本報告
$sentryClient->captureException($ex);
// 利用Exception提供一些額外的資料
$sentryClient->captureException($ex, array(
'extra' => array(
'php_version' => phpversion()
),
));
複製程式碼
報告其他錯誤
有時候你沒有一個實際的異常物件,但是發生了一些不好的事情,你想報告它。這是CaptureMessage的用處。它會接收一條訊息並將其報告給sentry。
// 捕獲訊息
$sentryClient->captureMessage('my log message');
複製程式碼
請注意,captureMessage具有與captureException稍有不同的API,以支援引數化格式:
$sentryClient->captureMessage('my %s message', array('log'), array(
'extra' => array(
'foo' => 'bar',
),
));
複製程式碼
可選屬性
通過呼叫captureException或captureMessage可以提供額外的資料:
$sentryClient->captureException($ex, array(
'attr' => 'value',
));
複製程式碼
額外
此事件的其他上下文。必須是一個對映。孩子可以是任何原生的JSON型別。
指紋
用於分組此事件的指紋。
array(
'fingerprint' => ['{{ default }}', 'other value']
)
複製程式碼
等級
事件的級別。預設為錯誤。 array( 'level' => 'warning' ) sentry支援一下級別:
- debug (the least serious)
- info
- warning
- error
- fatal (the most serious)
日誌
事件的記錄器名稱。 array( 'logger' => 'default' )
標籤
與此事件相關的標籤。必須是字串的對映
array(
'tags' => array('key' => 'value')
)
複製程式碼
使用者
array(
'user' => array(
'id' => 42,
'email' => 'clever-girl'
)
)
複製程式碼
取回事件ID
事件ID是剛剛傳送的事件的全域性唯一ID。此事件ID可用於從Sentry中查詢確切的事件。
這通常用於向使用者顯示並向客戶服務報告錯誤。
$sentryClient->getLastEventID();
使用者反饋
要啟用使用者對崩潰報告的反饋,您需要建立一個能夠識別上次事件ID的錯誤處理程式。
<?php
$sentry = new \Raven_Client(https://<key>:<secret>@sentry.io/<project>);
public class App {
function error500($exc) {
$event_id = $sentry->captureException($exc);
return $this->render('500.html', array(
'sentry_event_id' => $event_id,
), 500);
}
}
複製程式碼
然後在您的模板中,您可以載入反饋小部件:
<!-- Sentry JS SDK 2.1.+ required -->
<script src="https://cdn.ravenjs.com/2.3.0/raven.min.js"></script>
{% if sentry_event_id %}
<script>
Raven.showReportDialog({
eventId: '{{ sentry_event_id }}',
// use the public DSN (dont include your secret!)
dsn: 'https://<key>@sentry.io/<project>'
});
</script>
{% endif %}
複製程式碼
有關此功能的更多詳細資訊,請參閱使用者反饋指南。
處理故障
SDK會盡量減少故障發生,當它們發生時總會盡量避免將它們冒泡給您的應用程式。如果您確實想知道事件何時無法記錄,可以使用getLastError幫助器:
if ($sentryClient->getLastError() !== null) {
echo "Something went very, very wrong";
// $sentryClient->getLastError() contains the error that occurred
} else {
// Give the user feedback
echo "Sorry, there was an error!";
echo "Your reference ID is " . $event_id;
}
複製程式碼
麵包屑
Sentry支援捕獲麵包屑 - 事件發生前發生的事件。
$sentryClient->breadcrumbs->record(array(
'message' => 'Authenticating user as ' . $username,
'category' => 'auth',
'level' => 'info',
));
複製程式碼
過濾錯誤
常見的是,您可能想要阻止某些區域的自動捕獲。 理想情況下,您只需避免在這種情況下向Sentry發出呼叫,但這往往說起來容易做起來難。 相反,您可以提供SDK在傳送任何資料之前呼叫的函式,從而允許您對資料進行變異,並防止將其傳送到伺服器。
$sentryClient->setSendCallback(function($data) {
$ignore_types = array('Symfony\Component\HttpKernel\Exception\NotFoundHttpException');
if (isset($data['exception']) && in_array($data['exception']['values'][0]['type'], $ignore_types))
{
return false;
}
});
複製程式碼
錯誤控制操作符
在PHP中,使用抑制運算子來避免冒泡處理錯誤非常常見:
$my_file = @file('non_existent_file');
在這些情況下,Sentry將永遠不會捕獲錯誤。如果您希望在該階段捕獲它,則需要手動呼叫到PHP客戶端:
$my_file = @file('non_existent_file');
if (!$my_file) {
// ...
$sentryClient->captureLastError();
}
複製程式碼
測試你的連線
PHP客戶端包含一個簡單的幫助程式指令碼,用於測試您與Sentry主伺服器的連線和憑據:
$ bin/sentry test https://<key>:<secret>@sentry.io/<project>
Client configuration:
-> server: [https://sentry.io]
-> project: ___PROJECT_ID___
-> public_key: <key>
-> secret_key: <secret>
Sending a test event:
-> event ID: f1765c9aed4f4ceebe5a93df9eb2d34f
Done!複製程式碼