LaravelアプリにSentryを導入しエラーを検知する
今回はLaravelアプリにSentryを導入しエラーを検知できるようにします。利用者のエラーをより早く検知し、修正・対応することでサービスの質をさらに高めていきたい方にオススメです。
[ 目次 ]
はじめに
こんにちは、香港に住んでいるWEBデベロッパーのなかむ(@nakanakamu0828)です。
今回は、LaravelアプリにSentryを導入し、エラーを検知できるようにします。
英語ですが、ドキュメントも揃っていて導入しやすかったです。
以下のドキュメントも参考にしていきましょう。
Laravel error tracking with Sentry
Laravel error tracking with Sentry
■ 検証環境
PHP | Laravel |
---|---|
^7.2.4 | 5.7.* |
Sentryとは
公式サイトから
Open-source error tracking that helps developers monitor and fix crashes in real time. Iterate continuously. Boost efficiency. Improve user experience.
開発者がリアルタイムでクラッシュを監視することが可能なエラーをトラッキング(追跡)するオープンソースです。
Sentryの登録方法
公式サイト からアカウントの新規登録を行っていきます。
新規登録画面から新規登録してください。
"Github" or "Azure DevOps" でOAuthで登録するか、以下の内容から新規登録が可能です。
- 名前
- Email : メールアドレス
- Password : パスワード
- 組織名
- Billing Email : 支払い用のメールアドレス
- その他 同意のチェックボックスなど...
新規登録後はダッシュボードに移ります。また、新規登録時に入力したメールアドレス宛に認証メールが届きます。メール内のURLから認証を行ってください。
Laravelのセットアップ
Sentryのダッシュボードからステップを確認
Laravelプロジェクトの設定
LaravelのプロジェクトにSentryのライブラリをインストールします。
インストールにはcomposer
を利用します。
$ composer require sentry/sentry-laravel:1.0.0
config/app.php
に設定を追加します。
'providers' => [
// ...
Sentry\Laravel\ServiceProvider::class,
],
'aliases' => [
// ...
'Sentry' => Sentry\Laravel\Facade::class,
]
例外が発生した時にSentryへ通知する為、App/Exceptions/Handler.php
に以下の実装を追加します。
public function report(Exception $exception)
{
if (app()->bound('sentry') && $this->shouldReport($exception)){
app('sentry')->captureException($exception);
}
parent::report($exception);
}
続いて、Sentryの設定ファイルを以下のコマンドから生成します。
config/sentry.php
が生成されるのを確認しましょう。
$ php artisan vendor:publish --provider="Sentry\Laravel\ServiceProvider"
config/sentry.php
の中身は以下のようになります。
<?php
return array(
'dsn' => env('SENTRY_LARAVEL_DSN'),
// capture release as git sha
// 'release' => trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD')),
// Capture bindings on SQL queries
'breadcrumbs.sql_bindings' => true,
);
SentryのDSN設定をenv
に追加します。設定内容はダッシュボードから確認しましょう。
SENTRY_LARAVEL_DSN=https://7ddba52ead6542459cc69a1b5xxxx@sentry.io/140xxxx
Sentryダッシュボードでエラーを確認する
LaravelプロジェクトのIssuesからエラーが確認できます。
Sentryに通知する例外情報に認証情報を追加する
ログイン中にエラーが発生した場合に、どのユーザーでエラーが発生したのかをログと一緒に Sentry に通知したいと思います。Middlewareを利用しSentryのコンテキストに認証情報を追加したいと思います。
まずは以下のコマンドからMiddlewareを作成します。
$ php artisan make:middleware SentryContext
SentryContext
は以下のようにします。
<?php
namespace App\Http\Middleware;
use Closure;
use Sentry\State\Scope;
class SentryContext
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (auth()->check() && app()->bound('sentry')) {
\Sentry\configureScope(function (Scope $scope): void {
$scope->setUser([
'id' => auth()->user()->id,
'email' => auth()->user()->email,
]);
});
}
return $next($request);
}
}
以下を参考にしています。
Laravel Sentry
続いて、middleware : SentryContextクラスが呼び出されるようにapp/Http/Kernel.php
に設定を追加します。
middlewareGroupsのweb
にSentryContextクラスを追加します。
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\SentryContext::class,
],
]
最後に
今回はLaravelのエラーを検知する方法を試しましたが、各ユーザーのブラウザで発生するJavascriptのエラーの検知ができると開発者としては嬉しいですよね。
今後Javascriptも試してみたいと思います。