CLOVER🍀

That was when it all began.

オープンソースのエラートラッキングシステム、Sentryをローカルで動かしてみる

これは、なにをしたくて書いたもの?

オープンソースのエラートラッキングシステムとして、Sentryというものがあるということを知り、ちょっと試してみようかなと。

Sentry | Error Tracking Software — JavaScript, Python, PHP, Ruby, more

SentryはSaaSとしても使えるのですが、自分でローカルに構築することもできるようです。

Self-Hosted Sentry - Docs

Dockerイメージでインストールするのが推奨されているようなので、今回はこちらを使ってローカルにSentryを導入してみたいと思います。

Installation with Docker - Docs

Sentryとは?

Sentryは、オープンソースのエラートラッキングシステムです。

Sentry | Error Tracking Software — JavaScript, Python, PHP, Ruby, more

概要は、こちらを見てみるとよいでしょう。

Improve Your Workflow with Sentry | Product Blog • Sentry

商用のサービスですが、類似のものとしてはHoneybadgerがあります。

Exception and Uptime Monitoring for Application Developers - Honeybadger

Sentryはクライアント/サーバーの構成になっていて、クライアントはアプリケーションにSDKを組み込む形態になります。
プログラミング言語ごとにSDKがあり、エラーに関する情報をSentryサーバーに送信します。

Platforms - Docs

例えばJavaであれば、Android、GAE、j.u.Logging、Log4j 1/2、Logback、Spring向けのライブラリが提供されています。

Java - Docs

Integrations - Docs

サーバーに送信されたデータは、ダッシュボードで見たり、アラートで通知できたりするようです。

このあたりは、先ほどリンクを書いたこちらのエントリにキャプチャがあるので、見てみるとイメージがつかめるかもしれません。

Improve Your Workflow with Sentry | Product Blog • Sentry

前置きはこれくらいにして、Sentryをローカルにインストールしていきましょう。

Sentryをローカルにインストールする

Sentryをローカルにインストールする方法は、Dockerを使う方法と、Pythonを使う方法があるようですが、Dockerの方が推奨されて
いるようなので、Dockerを使うことにします。

Installation with Docker - Docs

インストールは、Docker 1.10以上が要件となっているようです。

ここでは、Sentryをローカルで起動させ、クライアントプログラムから簡単なデータ送信を行うところまでを確認してみます。

ドキュメントに従い、オンプレミス向けのGitHubリポジトリをclone。

$ git clone https://github.com/getsentry/onpremise.git
$ cd onpremise

ここから先の手順は、ドキュメントとGitHubのREADME.mdで微妙に違うのですが…。
※「install.sh」というスクリプト1本で起動手前まで構築することはできます

GitHub - getsentry/onpremise: Sentry On-Premise setup

Docker Compose用のファイルがあるので、今回はGitHubのREADME.mdの手順に従うことにします。

Docker Composeの定義は、こちら。
docker-compose.yml

docker-compose.yml 
# NOTE: This docker-compose.yml is meant to be just an example of how
# you could accomplish this on your own. It is not intended to work in
# all use-cases and must be adapted to fit your needs. This is merely
# a guideline.

# See docs.getsentry.com/on-premise/server/ for full
# instructions

version: '3.4'

x-defaults: &defaults
  restart: unless-stopped
  build: .
  depends_on:
    - redis
    - postgres
    - memcached
    - smtp
  env_file: .env
  environment:
    SENTRY_MEMCACHED_HOST: memcached
    SENTRY_REDIS_HOST: redis
    SENTRY_POSTGRES_HOST: postgres
    SENTRY_EMAIL_HOST: smtp
  volumes:
    - sentry-data:/var/lib/sentry/files


services:
  smtp:
    restart: unless-stopped
    image: tianon/exim4

  memcached:
    restart: unless-stopped
    image: memcached:1.5-alpine

  redis:
    restart: unless-stopped
    image: redis:3.2-alpine

  postgres:
    restart: unless-stopped
    image: postgres:9.5
    volumes:
      - sentry-postgres:/var/lib/postgresql/data

  web:
    <<: *defaults
    ports:
      - '9000:9000'

  cron:
    <<: *defaults
    command: run cron

  worker:
    <<: *defaults
    command: run worker


volumes:
    sentry-data:
      external: true
    sentry-postgres:
      external: true

RedisとかPostgreSQLとか、いろいろ使うのですが、いろいろ古い…。

また、Volumeも使います。手順では最初に「docker volume create」することになっているのですが、面倒だったので今回は以下を
コメントアウトして

#volumes:
#    sentry-data:
#      external: true
#    sentry-postgres:
#      external: true

以下のように変更して一気に起動できるようにしました。

  volumes:
    - ./sentry-data:/var/lib/sentry/files


services:
  ...

    image: postgres:9.5
    volumes:
      - ./sentry-postgres:/var/lib/postgresql/data

このあたり、ちゃんとREADME.mdに沿いたい場合は、GitHubリポジトリを確認してください。

GitHub - getsentry/onpremise: Sentry On-Premise setup

「.env」というファイルが必要なので、手順に従い「.env.example」ファイルをコピーします。

$ cp .env.example .env

中身は、Secret Keyらしきものの定義があるのですが、この時点では空です。 .env.example

# Run `docker-compose run web config generate-secret-key`
# to get the SENTRY_SECRET_KEY value.
SENTRY_SECRET_KEY=

で、SentryのDockerイメージをビルドします。

$ docker-compose build

ちなみに、この時に使ったSentryは9.1(後に起動したWebコンソールを見ると、9.1.1でしたが)です。
Dockerfile

FROM sentry:9.1-onbuild

次に、Secret Keyを作成します。

$ docker-compose run --rm web config generate-secret-key
Starting onpremise_smtp_1      ... done
Starting onpremise_postgres_1  ... done
Starting onpremise_redis_1     ... done
Starting onpremise_memcached_1 ... done
590119y3vs@rs0fh07(9=v38nm0*ab&&)3ihpyj3^48bjl)um(

ここで作成したSecret Keyを、「.env」内に書き込みます。

.env
# Run `docker-compose run web config generate-secret-key`
# to get the SENTRY_SECRET_KEY value.
SENTRY_SECRET_KEY=590119y3vs@rs0fh07(9=v38nm0*ab&&)3ihpyj3^48bjl)um(

続いて、データベースをビルドします。

$ docker-compose run --rm web upgrade

この時に、ユーザーを作成するかどうかを聞かれるので、今回は管理ユーザーとして作成しました。メールアドレスは「test@example.com」です。

Would you like to create a user account now? [Y/n]: y
Email: test@example.com
Password: 
Repeat for confirmation: 
Should this user be a superuser? [y/N]: y
User created: test@example.com
Added to organization: sentry

ちなみに、ここまで「install.sh」というスクリプトを実行するだけでもやってくれたりします(docker-compose.ymlのvolumeは変えたらダメですが)。

やや時間がかかりますが、終わったら「docker-compose up」で起動。

$ docker-compose up

起動したら、「http://localhost:9000」にアクセスしてみます。

ログインページが現れるので、先ほど作成したユーザー(メールアドレス、パスワード)でログインします。

f:id:Kazuhira:20190701225512p:plain

ログインすると設定っぽいものを聞かれるのですが、今回はほぼそのまま(ユーザーを登録できる「Allow Registration」のみONにしましたが、
結局使わず…)進めました。

f:id:Kazuhira:20190701225656p:plain

f:id:Kazuhira:20190701225740p:plain

すると、こんな画面に。

f:id:Kazuhira:20190701225810p:plain

右側の「Add new...」→「Project」で、新しいプロジェクトを作成します。

f:id:Kazuhira:20190701230035p:plain

言語(プラットフォーム)の一覧が表示されるので、

f:id:Kazuhira:20190701230057p:plain

好みのものを選択して、プロジェクト名を指定して作成。今回は、Node.jsを選びました。

f:id:Kazuhira:20190701230212p:plain

選んだ言語の簡単な設定方法が表示されます。

f:id:Kazuhira:20190701230335p:plain

次に、クライアント側からSentryに接続するための情報を取得します。

プロジェクトの「Settings」を選び、「Client Keys (DSN)」を選択します。

f:id:Kazuhira:20190701231829p:plain

「Configure」を押して、下の方に表示される「Public Key」と「Project ID」をこの後で使うので覚えておきましょう。

f:id:Kazuhira:20190701232910p:plain

Sentryにエラー情報を送る

それでは、Sentryにエラー情報を送ってみましょう。今回は、先ほど作成したNode.jsのプロジェクトを使用します。

環境。

$ node -v
v10.16.0


$ npm -v
6.9.0

プロジェクトを作成した時の情報に従い、SentryのSDKをインストールします。

$ npm install @sentry/node@5.1.0

こちらも参考に。

Node.js - Docs

sentry-javascript/packages/node at master · getsentry/sentry-javascript · GitHub

簡単なプログラムの作成。 app.js

const Sentry = require('@sentry/node');

Sentry.init({ dsn: 'http://ba205722f6494357a0abadedded495a0@localhost:9000/2' });

Sentry.captureException(new Error('Good bye'));

Sentry#initで、Sentryサーバーを指定します。この時に、先ほど確認したPublic KeyとProject IDが必要になります。

Sentry.init({ dsn: 'http://[Public Key]@[Sentry Host]:[Sentry Port]/[Project ID]' });

Configure the SDK

また、今回はSentry#captureExceptionで情報を送ります。

Sentry.captureException(new Error('Good bye'));

実行。

$ node app.js

すると、Sentry側の先ほど作成したプロジェクトに、情報が届いています。

f:id:Kazuhira:20190702004523p:plain

詳細を見てみると、ソースコードのどこから送られてきたかがわかったり…すごい…。

f:id:Kazuhira:20190702004533p:plain

とりあえず、今回はクライアントからデータが入るまでを目標にしていたので、ここまででOK…。

まとめ

オープンソースのエラートラッキングシステムである、Sentryをローカルで動かしてみました。

今回はとりあえず起動させて、クライアントからデータが入るところまでのGetting Startedな内容でしたが、今後もう少し詳しく
みていきたいなと思います。