これは、なにをしたくて書いたもの?
オープンソースのエラートラッキングシステムとして、Sentryというものがあるということを知り、ちょっと試してみようかなと。
Sentry | Error Tracking Software — JavaScript, Python, PHP, Ruby, more
SentryはSaaSとしても使えるのですが、自分でローカルに構築することもできるようです。
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サーバーに送信します。
例えばJavaであれば、Android、GAE、j.u.Logging、Log4j 1/2、Logback、Spring向けのライブラリが提供されています。
サーバーに送信されたデータは、ダッシュボードで見たり、アラートで通知できたりするようです。
このあたりは、先ほどリンクを書いたこちらのエントリにキャプチャがあるので、見てみるとイメージがつかめるかもしれません。
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」にアクセスしてみます。
ログインページが現れるので、先ほど作成したユーザー(メールアドレス、パスワード)でログインします。
ログインすると設定っぽいものを聞かれるのですが、今回はほぼそのまま(ユーザーを登録できる「Allow Registration」のみONにしましたが、
結局使わず…)進めました。
すると、こんな画面に。
右側の「Add new...」→「Project」で、新しいプロジェクトを作成します。
言語(プラットフォーム)の一覧が表示されるので、
好みのものを選択して、プロジェクト名を指定して作成。今回は、Node.jsを選びました。
選んだ言語の簡単な設定方法が表示されます。
次に、クライアント側からSentryに接続するための情報を取得します。
プロジェクトの「Settings」を選び、「Client Keys (DSN)」を選択します。
「Configure」を押して、下の方に表示される「Public Key」と「Project ID」をこの後で使うので覚えておきましょう。
Sentryにエラー情報を送る
それでは、Sentryにエラー情報を送ってみましょう。今回は、先ほど作成したNode.jsのプロジェクトを使用します。
環境。
$ node -v v10.16.0 $ npm -v 6.9.0
プロジェクトを作成した時の情報に従い、SentryのSDKをインストールします。
$ npm install @sentry/node@5.1.0
こちらも参考に。
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]' });
また、今回はSentry#captureExceptionで情報を送ります。
Sentry.captureException(new Error('Good bye'));
実行。
$ node app.js
すると、Sentry側の先ほど作成したプロジェクトに、情報が届いています。
詳細を見てみると、ソースコードのどこから送られてきたかがわかったり…すごい…。
とりあえず、今回はクライアントからデータが入るまでを目標にしていたので、ここまででOK…。
まとめ
オープンソースのエラートラッキングシステムである、Sentryをローカルで動かしてみました。
今回はとりあえず起動させて、クライアントからデータが入るところまでのGetting Startedな内容でしたが、今後もう少し詳しく
みていきたいなと思います。