概要
GoのAPIプロジェクト上に、Sentry(APMツール)を導入します。
環境構築
前提
Goプロジェクト上で動作するため、環境を用意します。
go mod init
アカウント作成
ホームページよりSentryのアカウントを作成します。
今回はTRIALで進めます。
Welcome to Sentry
今回は、SDKを使用するため「Install Sentry」を選択します。
Select the platforms you want to monitor
Prepare the Go SDK
SDKをインストールします。
go get github.com/getsentry/sentry-go
動作確認を行うため、下部のコードをmain.go
を作成し記述します。
Dsnは各自のURLを記述してください。
package main
import (
"log"
"github.com/getsentry/sentry-go"
)
func main() {
err := sentry.Init(sentry.ClientOptions{
Dsn: "https://",
// Set TracesSampleRate to 1.0 to capture 100%
// of transactions for performance monitoring.
// We recommend adjusting this value in production,
TracesSampleRate: 1.0,
})
if err != nil {
log.Fatalf("sentry.Init: %s", err)
}
// Flush buffered events before the program terminates.
defer sentry.Flush(2 * time.Second)
sentry.CaptureMessage("It works!")
}
接続確認
先程のmain.go
を実行します。
go run main
IssuesにてCaptureMessageが確認できます。
APM環境構築
APIのトランザクションを監視するため、先程のmain.go
にWebサーバー部分を追記します。
今回はGoの標準ライブラリである net/http
を使用します。
ドキュメント通りに進めます。
net/http
用のSDKをインストールします。
go get github.com/getsentry/sentry-go/http
ドキュメントのUsageを参考にコードに追記し、実行します。
package main
import (
"fmt"
"log"
"net/http"
"time"
"github.com/getsentry/sentry-go"
sentryhttp "github.com/getsentry/sentry-go/http"
)
type handler struct{}
func (h *handler) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
if hub := sentry.GetHubFromContext(r.Context()); hub != nil {
hub.WithScope(func(scope *sentry.Scope) {
scope.SetExtra("unwantedQuery", "someQueryDataMaybe")
hub.CaptureMessage("User provided unwanted query string, but we recovered just fine")
})
}
rw.WriteHeader(http.StatusOK)
}
func enhanceSentryEvent(handler http.HandlerFunc) http.HandlerFunc {
return func(rw http.ResponseWriter, r *http.Request) {
if hub := sentry.GetHubFromContext(r.Context()); hub != nil {
hub.Scope().SetTag("someRandomTag", "maybeYouNeedIt")
}
handler(rw, r)
}
}
func main() {
err := sentry.Init(sentry.ClientOptions{
Dsn: "https://",
EnableTracing: true,
// Set TracesSampleRate to 1.0 to capture 100%
// of transactions for performance monitoring.
// We recommend adjusting this value in production,
TracesSampleRate: 1.0,
})
if err != nil {
log.Fatalf("sentry.Init: %s", err)
}
// Flush buffered events before the program terminates.
defer sentry.Flush(2 * time.Second)
sentry.CaptureMessage("It works!")
sentryHandler := sentryhttp.New(sentryhttp.Options{
Repanic: true,
})
http.Handle("/", sentryHandler.Handle(&handler{}))
http.HandleFunc("/foo", sentryHandler.HandleFunc(
enhanceSentryEvent(func(rw http.ResponseWriter, r *http.Request) {
panic("y tho")
}),
))
fmt.Println("Listening and serving HTTP on :3000")
if err := http.ListenAndServe(":3000", nil); err != nil {
panic(err)
}
実行後、トランザクションを確認したため、それぞれにアクセスします。
監視
リクエストの詳細,パフォーマンスはPerformanceにて確認できます。
Performanceでは、自分が監視できるすべてのリクエストを一覧として見ることができます。
各エンドポイントの詳細を見たい場合は、画面下部から選択します。
Transaction Summary
各エンドポイントのごとの詳細を確認できます。
リクエスト単位で詳細を見たい場合は、EVENTを選択します。
Event Details
リクエストの詳細を見ることができます。
ボトルネックとなっている箇所に関して、炎のマークにて確認できます。
今回は、main.go
のみのAPIでしたが、外部APIやDBを利用するプロジェクトだと、そちらも確認することができます。
さいごに
Go+Sentryの導入記事が少なかったため、作成しました。
日々の開発のお役に立てればと思います。
これ以外にもSentryは様々な監視を行えます。ぜひ試してみてください!!
(今回は標準ライブラリを使用しましたが、ドキュメントを見る限りgin
やecho
と言ったフレームワークにも対応しています。
しかし、接続は可能でしたが、APIのパフォーマンスを監視することができませんでした。
そのため、できた方がいらっしゃいましたら、コメントに教えていただけると幸いです。)