Sentryを手元で動かす

May 21, 2017
Sentry Docker

イベントログを収集するアラートツールといえば、これまでAirbrakeErrbit)を使うことが多かったが、Sentryが良いという話を聞いて、既に導入はしていたが、細かく動作チェックしたくなった。

Sentryは、SaaSで提供されているが、GitHubでコードも公開されている(Python製)。それと同時にDockerコンテナで動作させる方法も手厚く書かれているので、それに則って、セットアップしていく。なお、本記事の環境は、Docker for Macを利用している。

Sentry環境の構築

Redisコンテナを起動する。

$ docker run -d --name sentry-redis redis

Postgresコンテナを起動する。

$ docker run -d --name sentry-postgres -e POSTGRES_PASSWORD=secret -e POSTGRES_USER=sentry postgres

すべてのSentryコンテナで共有する秘密鍵を生成する(秘密鍵は以降のステップで利用するのでメモしておく)

$ docker run --rm sentry config generate-secret-key

もしも新規のDBならば、アップグレードする。途中で、新規アカウントを作るか聞かれるので、Emailとパスワードを入力し、SuperUserとして作成しておくとよい。

$ docker run -it --rm -e SENTRY_SECRET_KEY='<秘密鍵>' --link sentry-postgres:postgres --link sentry-redis:redis sentry upgrade

Sentryサーバーコンテナを起動する。

$ docker run -d --name my-sentry -e SENTRY_SECRET_KEY='<秘密鍵>' --link sentry-redis:redis --link sentry-postgres:postgres sentry

CronとWorkerのコンテナを起動する。

$ docker run -d --name sentry-cron -e SENTRY_SECRET_KEY='<秘密鍵>' --link sentry-postgres:postgres --link sentry-redis:redis sentry run cron

$ docker run -d --name sentry-worker-1 -e SENTRY_SECRET_KEY='<秘密鍵>' --link sentry-postgres:postgres --link sentry-redis:redis sentry run worker

Dockerコンテナ内部では9000番ポートで動作しているので、Macの任意のポート(今回は8080番)にマッピングする。こちらは、Kitematicを使うとGUIで簡単に変更できる。my-sentry コンテナを選択し、SettingsのPortsを表示。DOCKER PORTが9000と表示されているので、その隣のPUBLISHED IP:PORTを、localhost:8080 と変更して、保存する。

http://localhost:8080 にアクセスすると、ログイン画面が表示される。

イベントログを送る

せっかく起動させたので、Railsアプリケーションからイベントログを送ってみる。

New Project からプロジェクトを作成し、Railsを選択すると必要なステップが表示される。

まずは gem "sentry-raven" を追加してbundle。その後、config/initializers/sentry.rb を追加。

Raven.configure do |config|
  config.dsn = 'http://xxxxx:xxxxx@0.0.0.0:8080/2'
  config.sanitize_fields = Rails.application.config.filter_parameters.map(&:to_s)
end

app/controllers/application_controller.rb を修正する。今回は認証を提供していないアプリケーションのため、ユーザーコンテキストは送っていない。

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  before_action :set_raven_context

  private

  def set_raven_context
    # Raven.user_context(id: session[:current_user_id]) # or anything else in session
    Raven.extra_context(params: params.to_unsafe_h, url: request.url)
  end
end

今回は、development環境からイベントログを送るので、 config.consider_all_requests_local = false にした後、適当な箇所で例外を発生させる。Sentry側を見ると、通知が送られてきているのが確認できる。

エラーが発生した部分も非常に分かりやすい。

JavaScriptのエラーログを収集する

http://0.0.0.0:8080/sentry/<project>/settings/install/javascript/ にアクセスすると、インストール方法が記載されている。

まずはapplication.jsの前に以下スクリプトをインクルードして、

<script src="https://cdn.ravenjs.com/3.14.2/raven.min.js" crossorigin="anonymous"></script>

下記を設定する。

Raven.config('http://xxxxx@0.0.0.0:8080/2').install()

適当なエラーを発生させると、JSのエラーが送られていることが確認できる。

なお、CDNを使わずにnpmパッケージからインストール場合もドキュメントに記載があるので、そちらを参考にするとよい。