シナプスの技術部システム開発課の小園です。
以前より試してみたい(社内に導入できるか検討してみたい)と思っていた Sentry を触ってみました。
Sentryとは
ホームページのタイトルタグには、「Application Monitoring and Error Tracking Software」と書かれています。
具体的には、アプリケーションで発生したエラーを追跡し、管理してくれるソフトウェアです。
サイト
- Sentryホームページ
- Sentry GitHub
- Sentry On-Premise GitHub
SentryをオンプレミスにDockerセットアップするためのGitHubリポジトリです。
構成
- Sentry 9.1.2
- Dockerで構築。
- 必要環境
- docker 17.05.0 以上
- docker-compose 1.17.0 以上
Sentryのインストール~ログイン
今回はDocker環境で構築します。
Sentryの開発元が提供しているdocker-compose環境を使います。
git clone https://github.com/getsentry/onpremise.git cd onpremise/
stable環境へ切り替えます。
git checkout -b stable origin/stable
インストールスクリプトを起動します。
Dockerイメージのダウンロードから環境ファイルの構築、データベースの初期化、初期管理ユーザの作成などをしてくれます。
このスクリプト一つで済むのでとても楽です。
./install.sh
docker-composeコマンドで起動します。
Sentryのサーバは9000番ポートで起動しようとします。
既に他のプログラムやdockerイメージに利用されている場合にはエラーになります。
docker-compose up -d
リバースプロキシなどの設定をして外部からアクセスできるようにします。
ブラウザでアクセスをするとログイン画面が表示されます。
インストールスクリプトの途中で作成したユーザでログインします。

初回のみ、設定画面が表示されます。

ログイン出来ました。

Sentryの準備
ログイン後の画面右上 [Add new...] ボタンから、Projectを選択します。
今回は、C#を選択してプロジェクトを作成します。

作成すると、簡単な導入方法の説明画面が表示されます。

コード(C#)の準備
今回はチュートリアルの内容に従ってすすめてみます。
検証するのは、基本的な登録方法と、ロガー(log4net)経由での登録をします。
基本的な登録方法
以下の環境、ソースコードを準備して実行します。
ソースコード中のDSNを必要に応じて書き換えます。
- 環境
.Net Freamwork 4.7.2 - 必要パッケージ
Sentry v1.2.0 (www.nuget.org)
using System;
using Sentry;
namespace SentrySample
{
class Program
{
static void Main()
{
using (SentrySdk.Init("http://**************************@sentry.example.co.jp/2"))
{
SentrySdk.CaptureMessage("Something went wrong");
ThrowArgumentException();
}
}
static void ThrowArgumentException()
{
try
{
throw new ArgumentException("argument exception");
}
catch (ArgumentException e)
{
SentrySdk.CaptureException(e);
}
}
}
}
実行すると、以下のようにissueが登録されます。
Sentryのissueには5段階のレベルがあります。(Debug/Info/Warning/Error/Fatal)
今回登録された中で、赤はError、青はInfoです。

Exceptionが発生したissueをクリックすると、詳細情報を知る事が出来ます。

ロガー経由の登録方法
既存環境の場合はロガー経由でのissue登録の方が導入しやすいかもしれません。
今回はlog4net環境ですが、他にMicrosoft.Extensions.Logging、NLog、Serilog向けのパッケージもあります。
- 環境
.Net Freamwork 4.7.2 - 必要パッケージ
Sentry.Log4Net v1.2.0 (www.nuget.org)
using System;
using log4net;
using log4net.Config;
[assembly: XmlConfigurator(Watch = true)]
namespace Log4NetTest
{
class Program
{
private static readonly ILog Log = LogManager.GetLogger(typeof(Program));
static void Main()
{
Log.Debug("Debug message which is not sent.");
try
{
DoWork();
}
catch (Exception e)
{
e.Data.Add("details", "Do work always throws.");
Log.Error("Error: with exception", e);
}
}
private static void DoWork()
{
Log.InfoFormat("InfoFormat: About to throw {0} type of exception.", nameof(NotImplementedException));
throw new NotImplementedException();
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="SentryAppender" type="Sentry.Log4Net.SentryAppender, Sentry.Log4Net">
<Dsn value="http://**************************@sentry.example.co.jp/2" />
<SendIdentity value="true" />
<Environment value="dev" />
<threshold value="INFO" />
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="SentryAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
</configuration>
実行すると、以下のようにissueが登録されます。
SentryAppenderのthresholdはINFOなので、Log.Debugは登録されていません。
Log.InfoFormat、Log.Errorは登録されています。

まとめ
- issueについて
- アプリケーションのエラー発生時にその情報を簡単にissue登録できる事が確認できました。
- 同箇所、同エラーは1個のissueにまとめてくれます。
- issueに担当者を設定して解決をすることも出来ます。
- 導入について
- 現状がエラー発生時にロガーのメール通知の場合には、ソースコードの導入の敷居は低いように感じました。
その他
- 2FAの設定が出来ます。(google authenticatorでの動作を確認しました。)