devlog

[Go] fiber アプリを Sentry でトレースする (雑記)

2023-09-04

概要

  • fiber でウェブアプリケーションを作っている
  • Sentry に無料枠があるのを知り、試してみたかったので、fiber アプリに仕込んでみた

パッケージ

sentry-go を用います。Sentry の公式SDKです

go get github.com/getsentry/sentry-go

 
インポートします。

package main import ( "github.com/getsentry/sentry-go" sentryhttp "github.com/getsentry/sentry-go/http" )

 
sentry-go には、トレーサーを仕込むとき便利なハンドラーが用意されてます

  • sentryhttp ... net/http 用のハンドラー(http.Handler)
  • sentryfasthttp ... fasthttp 用のハンドラー(fasthttp.RequestHandler)

今回は sentryhttp を用いました。

fiber は fasthttp ベースなので出来れば sentryfasthttp を用いた方が良いのですが、 実装がやや複雑になりそうで今回は見送りました。

セットアップ

sentry.Init をします。

Sentry の DSN(Data Source Name) を環境変数 SENTRY_DSN に入れます。

package main import ( "fmt" "os" "github.com/getsentry/sentry-go" ) func main() { err := sentry.Init(sentry.ClientOptions{ Dsn: os.Getenv("SENTRY_DSN"), // like `https://xx.sentry.io/xxx` EnableTracing: true, TracesSampleRate: 1.0, ProfilesSampleRate: 1.0, }) if err != nil { fmt.Println(err) } }

fiber に仕込む

fiber の middleware として仕込みます。

自前で実装しても良いのですが、ここでは adapter を用いました。 net/http のミドルウェアを fiber のミドルウェアに変換してくれるものです。(参考)

package main import ( "net/http" "os" "github.com/getsentry/sentry-go" sentryhttp "github.com/getsentry/sentry-go/http" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/adaptor" ) func main() { app := fiber.New() // Sentry のトレーサーを仕込む app.Use(adaptor.HTTPMiddleware(sentryTracer)) app.Get("/api/contents", listContentsHandler) app.Listen(":3000") } func sentryTracer(next http.Handler) http.Handler { // sentry init err := sentry.Init(sentry.ClientOptions{ Dsn: os.Getenv("SENTRY_DSN"), EnableTracing: true, TracesSampleRate: 1.0, ProfilesSampleRate: 1.0, }) if err != nil { return next } // net/http の handler sentryHandler := sentryhttp.New(sentryhttp.Options{}) return sentryHandler.Handle(next) }

以上で Sentry にデータが送信されるようになりました。

なお Sentry に入門したてなので設定項目を深く見れてません。
データは送れましたがHTTPステータス情報が欠落してます。設定不足です。。

おわりに

プロファイリングを楽しみにしてたんですが、Go 言語はまだ alpha版 らしいです。

  • 作成日
    2023-09-04
  • 更新日
    2023-09-04