世界を旅して暮らしたい放浪エンジニアブログ

LaravelアプリにSentryを導入しエラーを検知する

今回はLaravelアプリにSentryを導入しエラーを検知できるようにします。利用者のエラーをより早く検知し、修正・対応することでサービスの質をさらに高めていきたい方にオススメです。

[ 目次 ]

はじめに

こんにちは、香港に住んでいるWEBデベロッパーのなかむ(@nakanakamu0828)です。

今回は、LaravelアプリにSentryを導入し、エラーを検知できるようにします。

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の登録方法

公式サイト からアカウントの新規登録を行っていきます。

Sentryトップページ

新規登録画面から新規登録してください。
"Github" or "Azure DevOps" でOAuthで登録するか、以下の内容から新規登録が可能です。

  • 名前
  • Email : メールアドレス
  • Password : パスワード
  • 組織名
  • Billing Email : 支払い用のメールアドレス
  • その他 同意のチェックボックスなど...

Sentry新規登録

新規登録後はダッシュボードに移ります。また、新規登録時に入力したメールアドレス宛に認証メールが届きます。メール内のURLから認証を行ってください。

Sentryダッシュボード

Laravelのセットアップ

Sentryのダッシュボードからステップを確認

Sentry Laravelプロジェクト作成

Sentry tell us

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 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も試してみたいと思います。

前のページ

次のページ

Profile

なかむ🇭🇰Webデベロッパー

なかむ🇭🇰Webデベロッパー

香港在住4年目になるWEBエンジニアのなかむです。 現在は、LaravelやRailsを利用したWEB開発を中心にエンジニアをしています。 顧客は全て日本の企業になります。リモート開発にて各企業様の支援を行なっております

プロフィール詳細はこちら

Latest Posts