Skip to content

Commit 90fe2ef

Browse files
committed
feat(add): sentry stuff
1 parent b347c2d commit 90fe2ef

7 files changed

Lines changed: 136 additions & 24 deletions

File tree

.env.example

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ CORS_ORIGINS=http://localhost:3000
2424
# Hytale Staging OAuth Credentials (optional, required for Hytale features)
2525
HYTALE_USE_STAGING=false
2626

27+
# Sentry Error Tracking (optional)
28+
# DSN from: https://console.sentry.io/
29+
# SENTRY_DSN=https://key@sentry.io/project
30+
2731
# Auto-sync Settings (optional)
2832
# AUTO_SYNC_ENABLED=true
2933
# AUTO_SYNC_INTERVAL=60 # Environment values are in MINUTES (e.g., 60 = 1 hour, 1 = 1 minute)

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2020
## [0.2.1] - Unreleased
2121

2222
### Added
23+
- **Sentry Error Tracking Integration** - Production error monitoring
24+
- Optional Sentry SDK integration for real-time error tracking
25+
- Fiber middleware for automatic panic recovery and error reporting
26+
- `SENTRY_DSN` environment variable configuration
27+
- Request context preservation with tags and custom data
28+
- Helper functions for manual error capture (`sentry.CaptureException`, `sentry.CaptureMessage`)
29+
- 5-second timeout during graceful shutdown for pending event delivery
30+
- 10% transaction trace sampling for performance monitoring
2331
- **Comprehensive Unit Test Suite** - Core packages tested for reliability
2432
- Config loading and environment variable parsing tests
2533
- Error handling and HTTP status mapping tests

cmd/api/main.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import (
4343
"github.com/nodebyte/backend/internal/database"
4444
"github.com/nodebyte/backend/internal/handlers"
4545
"github.com/nodebyte/backend/internal/queue"
46+
"github.com/nodebyte/backend/internal/sentry"
4647
"github.com/nodebyte/backend/internal/workers"
4748
)
4849

@@ -118,7 +119,11 @@ func main() {
118119

119120
log.Info().Str("redis", cfg.RedisURL).Msg("Connected to Redis")
120121

121-
// Initialize Fiber app
122+
sentryHandler, err := sentry.InitSentry(cfg.SentryDSN, cfg.Env, "0.2.1")
123+
if err != nil {
124+
log.Warn().Err(err).Msg("Failed to initialize Sentry")
125+
}
126+
122127
app := fiber.New(fiber.Config{
123128
AppName: "NodeByte Backend v1.0.0",
124129
ReadTimeout: 30 * time.Second,
@@ -128,6 +133,9 @@ func main() {
128133

129134
// Middleware
130135
app.Use(recover.New())
136+
if sentryHandler != nil {
137+
app.Use(sentryHandler)
138+
}
131139
app.Use(logger.New(logger.Config{
132140
Format: "[${time}] ${status} - ${latency} ${method} ${path}\n",
133141
}))
@@ -159,21 +167,19 @@ func main() {
159167
}
160168
}()
161169

162-
// Graceful shutdown
163170
quit := make(chan os.Signal, 1)
164171
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
165172

166173
go func() {
167174
<-quit
168175
log.Info().Msg("Shutting down server...")
169176

177+
sentry.Flush(5 * time.Second)
178+
170179
// Stop scheduler
171180
scheduler.Stop()
172-
173-
// Stop worker server
174181
workerServer.Stop()
175182

176-
// Shutdown Fiber with timeout
177183
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
178184
defer cancel()
179185

@@ -182,7 +188,6 @@ func main() {
182188
}
183189
}()
184190

185-
// Start HTTP server
186191
port := cfg.Port
187192
if port == "" {
188193
port = "8080"

go.mod

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ module github.com/nodebyte/backend
33
go 1.24.0
44

55
require (
6-
github.com/gofiber/fiber/v2 v2.52.5
6+
github.com/getsentry/sentry-go v0.40.0
7+
github.com/getsentry/sentry-go/fiber v0.40.0
8+
github.com/gofiber/fiber/v2 v2.52.9
79
github.com/google/uuid v1.6.0
810
github.com/hibiken/asynq v0.24.1
911
github.com/jackc/pgx/v5 v5.7.2
@@ -16,7 +18,7 @@ require (
1618

1719
require (
1820
github.com/KyleBanks/depth v1.2.1 // indirect
19-
github.com/andybalholm/brotli v1.1.0 // indirect
21+
github.com/andybalholm/brotli v1.1.1 // indirect
2022
github.com/cespare/xxhash/v2 v2.2.0 // indirect
2123
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
2224
github.com/go-openapi/jsonpointer v0.19.5 // indirect
@@ -28,18 +30,18 @@ require (
2830
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
2931
github.com/jackc/puddle/v2 v2.2.2 // indirect
3032
github.com/josharian/intern v1.0.0 // indirect
31-
github.com/klauspost/compress v1.17.7 // indirect
33+
github.com/klauspost/compress v1.17.11 // indirect
3234
github.com/mailru/easyjson v0.7.6 // indirect
3335
github.com/mattn/go-colorable v0.1.13 // indirect
3436
github.com/mattn/go-isatty v0.0.20 // indirect
35-
github.com/mattn/go-runewidth v0.0.15 // indirect
37+
github.com/mattn/go-runewidth v0.0.16 // indirect
3638
github.com/redis/go-redis/v9 v9.7.0 // indirect
37-
github.com/rivo/uniseg v0.2.0 // indirect
39+
github.com/rivo/uniseg v0.4.7 // indirect
3840
github.com/rogpeppe/go-internal v1.14.1 // indirect
3941
github.com/spf13/cast v1.3.1 // indirect
4042
github.com/stretchr/testify v1.9.0 // indirect
4143
github.com/valyala/bytebufferpool v1.0.0 // indirect
42-
github.com/valyala/fasthttp v1.52.0 // indirect
44+
github.com/valyala/fasthttp v1.57.0 // indirect
4345
github.com/valyala/tcplisten v1.0.0 // indirect
4446
golang.org/x/mod v0.31.0 // indirect
4547
golang.org/x/sync v0.19.0 // indirect

go.sum

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
22
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
3-
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
4-
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
3+
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
4+
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
55
github.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w=
66
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
77
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
@@ -17,6 +17,12 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
1717
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1818
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
1919
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
20+
github.com/getsentry/sentry-go v0.40.0 h1:VTJMN9zbTvqDqPwheRVLcp0qcUcM+8eFivvGocAaSbo=
21+
github.com/getsentry/sentry-go v0.40.0/go.mod h1:eRXCoh3uvmjQLY6qu63BjUZnaBu5L5WhMV1RwYO8W5s=
22+
github.com/getsentry/sentry-go/fiber v0.40.0 h1:oe0CgYH92C8sqPIttaRDZJLkh3R1KA1/47A2E2UPMbc=
23+
github.com/getsentry/sentry-go/fiber v0.40.0/go.mod h1:VH3cIF1lE/syUuKokAJvvgja0nao4GzSEpr+bKv379s=
24+
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
25+
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
2026
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
2127
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
2228
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
@@ -28,8 +34,8 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh
2834
github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM=
2935
github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
3036
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
31-
github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo=
32-
github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ=
37+
github.com/gofiber/fiber/v2 v2.52.9 h1:YjKl5DOiyP3j0mO61u3NTmK7or8GzzWzCFzkboyP5cw=
38+
github.com/gofiber/fiber/v2 v2.52.9/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw=
3339
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
3440
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
3541
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
@@ -54,8 +60,8 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
5460
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
5561
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
5662
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
57-
github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg=
58-
github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
63+
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
64+
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
5965
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
6066
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
6167
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
@@ -73,17 +79,21 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/
7379
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
7480
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
7581
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
76-
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
77-
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
82+
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
83+
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
7884
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
85+
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
86+
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
87+
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
7988
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
8089
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
8190
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8291
github.com/redis/go-redis/v9 v9.0.3/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=
8392
github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E=
8493
github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw=
85-
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
8694
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
95+
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
96+
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
8797
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
8898
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
8999
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
@@ -104,13 +114,16 @@ github.com/swaggo/swag v1.16.6 h1:qBNcx53ZaX+M5dxVyTrgQ0PJ/ACK+NzhwcbieTt+9yI=
104114
github.com/swaggo/swag v1.16.6/go.mod h1:ngP2etMK5a0P3QBizic5MEwpRmluJZPHjXcMoj4Xesg=
105115
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
106116
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
107-
github.com/valyala/fasthttp v1.52.0 h1:wqBQpxH71XW0e2g+Og4dzQM8pk34aFYlA1Ga8db7gU0=
108-
github.com/valyala/fasthttp v1.52.0/go.mod h1:hf5C4QnVMkNXMspnsUlfM3WitlgYflyhHYoKol/szxQ=
117+
github.com/valyala/fasthttp v1.57.0 h1:Xw8SjWGEP/+wAAgyy5XTvgrWlOD1+TxbbvNADYCm1Tg=
118+
github.com/valyala/fasthttp v1.57.0/go.mod h1:h6ZBaPRlzpZ6O3H5t2gEk1Qi33+TmLvfwgLLp0t9CpE=
109119
github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
110120
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
121+
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
122+
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
111123
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
112-
go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
113124
go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
125+
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
126+
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
114127
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
115128
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
116129
golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=

internal/config/config.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ type Config struct {
5757

5858
// Hytale OAuth
5959
HytaleUseStaging bool
60+
61+
// Sentry Error Tracking
62+
SentryDSN string
6063
}
6164

6265
// Load reads configuration from environment variables
@@ -94,6 +97,9 @@ func Load() (*Config, error) {
9497

9598
// Hytale
9699
HytaleUseStaging: getEnvBool("HYTALE_USE_STAGING", false),
100+
101+
// Sentry
102+
SentryDSN: os.Getenv("SENTRY_DSN"),
97103
}
98104

99105
// Validate required fields

internal/sentry/sentry.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package sentry
2+
3+
import (
4+
"fmt"
5+
"time"
6+
7+
"github.com/getsentry/sentry-go"
8+
sentryfiber "github.com/getsentry/sentry-go/fiber"
9+
"github.com/gofiber/fiber/v2"
10+
"github.com/rs/zerolog/log"
11+
)
12+
13+
func InitSentry(dsn string, environment string, release string) (fiber.Handler, error) {
14+
if dsn == "" {
15+
log.Warn().Msg("Sentry DSN not configured; error tracking disabled")
16+
return nil, nil
17+
}
18+
19+
err := sentry.Init(sentry.ClientOptions{
20+
Dsn: dsn,
21+
Environment: environment,
22+
Release: release,
23+
TracesSampleRate: 0.1,
24+
BeforeSend: func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event {
25+
return event
26+
},
27+
})
28+
29+
if err != nil {
30+
return nil, fmt.Errorf("failed to initialize Sentry: %w", err)
31+
}
32+
33+
log.Info().Str("environment", environment).Msg("Sentry initialized for error tracking")
34+
35+
handler := sentryfiber.New(sentryfiber.Options{
36+
Repanic: true,
37+
WaitForDelivery: false,
38+
Timeout: 5 * time.Second,
39+
})
40+
41+
return handler, nil
42+
}
43+
44+
func GetHubFromContext(c *fiber.Ctx) *sentry.Hub {
45+
return sentryfiber.GetHubFromContext(c)
46+
}
47+
48+
func CaptureException(c *fiber.Ctx, err error) {
49+
if hub := GetHubFromContext(c); hub != nil {
50+
hub.CaptureException(err)
51+
}
52+
}
53+
54+
func CaptureMessage(c *fiber.Ctx, message string) {
55+
if hub := GetHubFromContext(c); hub != nil {
56+
hub.CaptureMessage(message)
57+
}
58+
}
59+
60+
func SetTag(c *fiber.Ctx, key, value string) {
61+
if hub := GetHubFromContext(c); hub != nil {
62+
hub.Scope().SetTag(key, value)
63+
}
64+
}
65+
66+
func SetExtra(c *fiber.Ctx, key string, value interface{}) {
67+
if hub := GetHubFromContext(c); hub != nil {
68+
hub.Scope().SetExtra(key, value)
69+
}
70+
}
71+
72+
func Flush(timeout time.Duration) bool {
73+
return sentry.Flush(timeout)
74+
}

0 commit comments

Comments
 (0)