目次
検証環境
- Unity 6000.0.34f1
- Sentry Unity 3.0.2
導入
公式ドキュメント。
SentryのWebページから、Settings > Projects から特定のProjectを選択 > Client Keys(DSN) のページを開いて、DSNをコピー
パッケージマネージャーからGit URLでパッケージを追加する
https://github.com/getsentry/unity.git#3.0.2メニュー > Tools > Sentry で構成画面を開く
DSNを設定する
後はエラーなどを発生させるとレポートが送信される。 Webページに反映されるには、数秒程度のラグがある。
基本
Unity SDKは .NET SDK をベースに構築されている。
.NET SDK では、SentrySdk.Init を使ってコードベースで初期化している。
Unityでは、構成画面を開くと Resources/Sentry/SentryOptions.asset (ScriptableObject)が生成され、それを元に自動で初期化される。
構成画面
スクロールバーとか表示されないので、見切れてる項目には注意が必要。
Core

- 基本的には、DSNさえ設定すれば動く
Enrichment

- Stacktrace For Logs にチェックを入れると、スタックトレースを送信してくれる
- スタックトレースが長すぎると、too longという例外を吐くので注意
- Attach Screenshot にチェックを入れると、送信する際にスクショを添付してくれる
- 契約プラン毎に月の容量があるので注意
Transport

Advanced

Options Config

- Option Config Script を設定すると送信前にタグを追加するなどの処理を仕込める
public class SentryOptionConfiguration : SentryOptionsConfiguration { public override void Configure(SentryUnityOptions options) { // Here you can programmatically modify the Sentry option properties used for the SDK's initialization options.SetBeforeSend(@event => { @event.SetTag("lib", "SentryTest"); return @event; }); } }
Debug Symbols

プログラム
初期化
.NET には初期化のために SentrySdk.Init が用意されている。
Unityは基本構成画面から生成されるScriptableObjectを使うことになるが、SentryUnity.Initメソッドも一応用意されている。
SentryUnity.Init(options => { options.Dsn = HoloearthUnityDsn; });
ただし、ドキュメントには明記されておらず、サンプルコードの一部にSentrySdkとSentryUnityが混在しているので混乱する。(改善要望提案中)
動きも若干怪しい所があるため、使う際は注意が必要である。
// こちらは機能する options.AttachStacktrace = true; // こちらは機能しない options.AttachScreenshot = true;
Screenshotに関しては、自分でEventProcessorを追加することでスクショが送信されるようになることは確認できた。
options.AttachScreenshot = true; options.ScreenshotQuality = ScreenshotQuality.Low; options.AddEventProcessor(new ScreenshotEventProcessor(options));
スコープ
Scopeと呼ばれる設定の箱が用意されており、定義したり破棄したりできるみたい。
スコープには、イベントとともに送信される有用な情報が保持されます。たとえば、コンテキストやパンくずリストはスコープに保存されます。スコープがプッシュされると、親スコープからすべてのデータが継承され、ポップされるとすべての変更が元に戻されます。
SentrySdk.ConfigureScope(scope => { scope.User.Id = "12345"; scope.User.Username = "yotiky"; scope.User.Email = "example@example.com"; scope.Environment = "dev"; scope.SetTag("GroupId", "67890"); scope.SetTag("GroupName", "hoge"); });
ドキュメントには、ログアウト時にユーザーの設定を解除するときのサンプルとして以下が掲載されているが、個別にすべてを初期化しないとダメなのか、読み取れず。しなきゃいけない気もする。
SentrySdk.ConfigureScope(scope => { scope.User = new SentryUser(); });
その他、色々カスタマイズするできるっぽいので以下参照。とても読みやすいとは言えないけれど。。
パッケージの分離
コアライブラリにSentryを設定して、アプリケーション側からはUPM参照して使う場合、以下のことに注意しておく必要がある。
- PackageにScriptableObjectがあったとしても、アプリケーション側で画面を開くと新たに設定ファイルが生成される
SentryUnity.Initの動きが怪しい
Web画面
Issues
同様の特性を持つイベントごとにグループ化されて表示される。
「Custom Search」はSaveすることができる。一番良く使うものをデフォルトに設定しておくと良い。

リアルタイムに更新したい場合、右上にボタンがあるので押しておく。

Discover
Discoverにエラーのレポートが表示される。

Consoleに出力されたErrorがすべて送信されているわけではなさそう。
UnityEngine.Debug:LogErrorの出力を転送しているっぽい。UnityEngine自体が自身で出力しているエラーは送信されていなかった。
エラーの詳細画面を開くと、スタックトレースやパンくず、タグやコンテキスト情報などが参照できる。 パンくずについては、以下引用から。
Sentry は、パンくずリストを使用して、問題が発生する前に発生したイベントの軌跡を作成します。
Tag

Attach Screenshot を有効にするとタグの右側にスクショが表示される。
独自のタグを設定するには、SentryEvent.SetTagやScope.SetTagなどで設定する。
また、Scope.Environmentに設定したenvironmentは、Tagsの中に表示される。

Environmentは、デフォルトでも設定される。その場合、Unity Editorで実行している場合はeditor、それ以外の場合はproductionが設定される。
User
Contextsには様々な情報が表示される。次の画像はUserのブロック。 IP AddressやGeographyが出力されることがあるが、出力条件がはっきりしない。

Scope.UserからUserの情報を設定できる。new SentryUser()するとすべて上書きされるため、Userのプロパティを直接編集するとIP Addressとかは残りそう。
と思ったが、出たり出なかったりしたのでよく分からなくなった。

scope.User = new SentryUser() { Id = "12345", Username = "yotiky", Email = "example@example.com", IpAddress = "127.0.0.1", Other = new Dictionary<string, string>() { { "hoge", "1" }, { "fuga", "2" }, } };
一覧のUSER.DISPLAYには、Email、Username、Idの順に設定されてるものから表示される。何も設定されていなければ自動生成された値がIdに設定されてそれが表示される。

IP Addressは、Web側の設定で収集しないようにもできるらしい。