Skip to content

Instantly share code, notes, and snippets.

@Br3nda
Created October 20, 2025 21:44
Show Gist options
  • Save Br3nda/8a3c84c16bc9d91bdb2d5864f5aadd4a to your computer and use it in GitHub Desktop.
Save Br3nda/8a3c84c16bc9d91bdb2d5864f5aadd4a to your computer and use it in GitHub Desktop.
Adding sentry to gorm queries
package database
import (
"errors"
"github.com/AnimationMentor/art-go-artelladata/v2/libs/logging"
"github.com/getsentry/sentry-go"
"github.com/rs/zerolog/log"
"gorm.io/gorm"
)
func RegisterCallbacks(db *gorm.DB) {
// queries
if err := db.Callback().Query().Before("gorm:query").Register("sentryStartQuery", startSentrySpan); err != nil {
log.Error(err)
}
if err := db.Callback().Query().After("gorm:query").Register("sentryFinishQuery", sentryLog); err != nil {
log.Error(err)
}
// inserts
if err := db.Callback().Create().Before("gorm:create").Register("sentryStartCreate", startSentrySpan); err != nil {
log.Error(err)
}
if err := db.Callback().Create().After("gorm:create").Register("sentryFinishCreate", sentryLog); err != nil {
log.Error(err)
}
// delete
if err := db.Callback().Delete().Before("gorm:delete").Register("sentryStartDelete", startSentrySpan); err != nil {
log.Error(err)
}
if err := db.Callback().Delete().After("gorm:delete").Register("sentryFinishDelete", sentryLog); err != nil {
log.Error(err)
}
// update
if err := db.Callback().Update().Before("gorm:update").Register("sentryStartUpdate", startSentrySpan); err != nil {
log.Error(err)
}
if err := db.Callback().Update().After("gorm:update").Register("sentryFinishUpdate", sentryLog); err != nil {
log.Error(err)
}
}
func startSentrySpan(db *gorm.DB) {
if db.Statement != nil {
span := sentry.StartSpan(db.Statement.Context, "db.sql.query")
span.SetData("db.system.name", "postgresql")
db.Set("span", span)
}
}
func sentryLog(db *gorm.DB) {
if db.Statement != nil {
s, ok := db.Get("span")
if !ok {
return
}
span, ok := s.(*sentry.Span)
if !ok {
return
}
defer span.Finish()
sql := db.Statement.SQL.String()
realSQL := db.ToSQL(func(tx *gorm.DB) *gorm.DB { return db }) // <-- with the actual values
span.Name = sql
span.Description = sql
span.SetData("db.query", realSQL)
span.SetData("db.vars", db.Statement.Vars)
span.SetData("db.collection.name", db.Statement.Table)
if db.Error != nil && !errors.Is(db.Error, gorm.ErrRecordNotFound) {
logging.TellSentry(db.Error)
span.Status = sentry.SpanStatusInternalError
} else {
span.Status = sentry.SpanStatusOK
}
}
}
// TO USE: comment to db then do:
RegisterCallbacks(db)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment