Sentryとは
エラーを補足して整理することができるSaaSです。ログに埋もれがちなエラーを集計してチケット化し、すばやく修正していくことができます。
必要なこと
Javaのlogbackにフックを仕掛けることで、Sentryのサーバへエラーログを送信する方法でやります。
- SentryでOrganizationとProjectを作り、DSNを取得
- 必要なパッケージを設定
- 設定を書き込んだDSNでSentry.initする
- logbackにSentryを設定する
順番に説明していきます
DSN取得
SentryサイトでJavaプロジェクトを作成するとDSNが表示されるのでこれを使います。
必要なパッケージを設定
build.sbtにsentry-logbackの依存を書きます。
libraryDependencies += "io.sentry" % "sentry-logback" % "VERSION"
Sentry.initする
Sentryに設定を書き込む必要があるのですが、いくらか方法があります。
- sentry.properties
- 起動引数
- 環境変数
- Sentry.initを起動時に実行
どの方法でもいいのですが、Environmentなどの設定が厄介なので、ここでは汎用的なSentry.initを使ってやります。
package modules
import com.google.inject.AbstractModule
import io.sentry.Sentry
import javax.inject.{Inject, Singleton}
import play.api.{Configuration, Environment, Logger}
class SentryModule extends AbstractModule {
override def configure(): Unit = bind(classOf[SentryService]).asEagerSingleton()
}
@Singleton
class SentryService @Inject()(conf: Configuration, env: Environment) {
val Packages =
"controllers" ::
"modules" ::
"models" ::
"services" ::
"utils" :: Nil
val dsn = conf.get[String]("sentry.dsn")
val packages = Packages.mkString(",")
val params = Map(
"environment" -> env.mode.toString,
"stacktrace.app.packages" -> packages,
"servername" -> InetAddress.getLocalHost.getHostAddress
)
val full = s"${dsn}?${params.map { case (k, v) => s"${k}=${v}" }.mkString("&&")}"
Sentry.init(full)
}
コードは長いですがやってることはそんな難しくなくて、
- 設定はDSNのURIにパラメータとしてくっつける
- このパラメータをEnvironmentその他から生成する
- DIのModuleで一度だけSentry.initにフルのDSNを渡して実行する
だけです。
このModuleを有効にするにはapplication.confに以下をセットします。
play.modules.enabled += "modules.SentryModule"
sentry.dsn = "https://hoge@sentry.io/fuga"
Logbackの設定
公式を読むのが早いです。
動作確認
以上で設定は完了です。Sentryはイベントが発生しない限りデータを送信することが無いので、わざと例外を発生させるエンドポイントを作っておくと動作確認がとても楽になります。