もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

Sentry触ってみた(PHP)

参考サイト

はじめに

こんばんは。

今日はSentryっていうツールを触ってみたので、ちょっと書いておこうと思います。

現在お仕事手伝わせていただいているプロジェクトは結構年代物のプロジェクトで、比較的レガシーな環境で動いています。

testコードもほぼほぼないので、E2E的なテストツールや、バグレポート(検知)を取れるようなツールがないかなーといろいろ探して見つけたのがSentryでした。

フロントエンドのエラーの検知含め、PHPのエラーの検知も可能ということで、これはいいと思い触ってみました。

f:id:kojirooooocks:20180406035118p:plain

やってみた

アカウント作成

コチラからアカウント作成します。

確認メールも飛んできますので、Confirmを押してください。

f:id:kojirooooocks:20180406035102p:plain

言語選択

アカウント作成が終わると、以下のページに遷移します。

f:id:kojirooooocks:20180406035142p:plain

ここで、バグ検知を行う言語を選択できます。

言語以外にも、特有のFWもサポートしているようです。

今回はLaravelでいきたいと思います。

Laravelを選択して、Create Projectを押します。

f:id:kojirooooocks:20180406035156p:plain

そうすると、Laravelでの導入方法が記載されたドキュメントページへ移動します。

Sentry-laravelセットアップ

laraveのプロジェクト作成については、割愛します。

自分が上げた昔の記事にlaradockでの開発環境構築を乗せています。

laradockで簡単Laravel開発環境構築

インストールとセットアップはドキュメントにあるとおりにやっていきます。

1. install

$ composer require sentry/sentry-laravel
Using version ^0.8.0 for sentry/sentry-laravel
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 2 installs, 0 updates, 0 removals
  - Installing sentry/sentry (1.8.4): Downloading (100%)         
  - Installing sentry/sentry-laravel (0.8.0): Downloading (100%)         
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nunomaduro/collision
Discovered Package: sentry/sentry-laravel
Package manifest generated successfully.

2. setup

config/app.php
$ vi config/app.php

// providersに追加 
Sentry\SentryLaravel\SentryLaravelServiceProvider::class

// aliasに追加
'Sentry' => Sentry\SentryLaravel\SentryFacade::class
app/Exceptions/Handler.php
$ vi app/Exceptions/Handler.php

// report()を以下のように修正
public function report(Exception $exception)
{
    if (app()->bound('sentry') && $this->shouldReport($exception)) {
        app('sentry')->captureException($exception);
    }

    parent::report($exception);
}
config/sentry.php作成
$ php artisan vendor:publish --provider="Sentry\SentryLaravel\SentryLaravelServiceProvider"
.env修正
$ vi .env

// 以下を追加
SENTRY_DSN=My Sentry DSN URL

エラーが出るように修正してみる

セットアップが終わったら、ダッシュボードに移動します。

f:id:kojirooooocks:20180406035255p:plain

今はまだ何もレポートが上がってない状態です。

では、実際にエラーレポートが検知されるようなコードを挟んでみましょう。

routes/web.phpを以下のように修正します。

Route::get('/', function () {
    return view('aaaa');
//    return view('welcome');
}); 

存在しないテンプレートを表示しようとしているので、laravel側では InvalidArgumentExceptionが出ます。

f:id:kojirooooocks:20180406035310p:plain

現状はテストモードなので、laravelがエラーページを表示してくれますが、本番環境の場合は、システムエラーが発生しました的なエラーページが表示されて、ユーザーサポートかなにかをフックにエンジニアがバグに気づく感じかと思います。

Sentryダッシュボードで確認

では、Sentryダッシュボードを再度見てみます。

f:id:kojirooooocks:20180406035321p:plain

一件来てます!!

f:id:kojirooooocks:20180406035331p:plain

エラーが発生しているコードの場所までキチンと見えます!

Sentryがエラーを検知したらSlackに通知してみる

エラー出るかどうかSentryのダッシュボードを見張っとくわけにもいかないので、新たなissueが上がったらslackに通知するようにしたいです。

連携は簡単にできるみたいなんで、やってみます。

例としてslackでcentry-notificationという名前のチャンネルを作成しました。

そのチャンネルにSentrySentry Notificationsというアプリをセットします。

f:id:kojirooooocks:20180406035430p:plain

f:id:kojirooooocks:20180406035444p:plain

次ページにSentry上での設定項目が書かれているので、そのとおりに設定します。

以下の画像遷移通りに行けば完了です。

f:id:kojirooooocks:20180406035457p:plain

f:id:kojirooooocks:20180406035514p:plain

f:id:kojirooooocks:20180406040003p:plain

f:id:kojirooooocks:20180406040013p:plain

チャンネルにSentryが追加されました。

では早速、エラー出してみましょう。

ではまた同じようにエラー出してみます。

f:id:kojirooooocks:20180406035608p:plain

出ました!!

終わりに

これすごくいいですね。

ただ、なんかハマったのが、同じPHPエラーの場合は、毎回Slackへ通知されないような感じがしました。

これはもしかしたらFreeプランだからなのかな?

いや、俺の設定の可能性もある・・・

なんにせよかなり使えます。

まぁ、最近のPHPのプロジェクトだとログ監視とかは普通に行われているとは思うのですが、そうではない現場では結構使えるような気がします。

次はJSのバグ検知もやってみたいと思います。

では。