Build Sentry integrations that never take your application down via three pillars: safe initialization with graceful degradation, a circuit breaker that stops hammering Sentry when unreachable, and an offline event queue that buffers errors during outages. Every pattern prioritizes application uptime over telemetry completeness.
@sentry/node v8+ (TypeScript) or sentry-sdk v2+ (Python)sentry.io
Wrap Sentry.init() in try/catch so an invalid DSN, network error, or SDK bug never crashes the app. Track initialization state with a boolean flag. Protect beforeSend callbacks with their own error boundary.
Create lib/sentry-safe.ts with initSentrySafe() and captureError(). See graceful-degradation.md for full implementation.
Key rules:
Sentry.init() crash the process — wrap in try/catch, set sentryAvailable = false on failureSentry.getClient() — invalid DSNs silently produce no clientbeforeSend hooks in nested try/catch — return raw event on hook failureWhen Sentry is unreachable, continued attempts waste resources and add latency. Track consecutive failures and trip open after a threshold. After cooldown, enter half-open state and send a single probe.
Implement SentryCircuitBreaker class with closed/open/half-open states. See circuit-breaker-pattern.md for full implementation. Expose state via health-checks.md endpoint.
Key rules:
getStatus() for health check endpoints and monitoring dashboardsBuffer events when network is unavailable and replay on reconnect. Use bounded file-based queue to survive restarts. Pair with signal handlers that flush via Sentry.close() before process exit.
Implement three modules:
lib/sentry-offline-queue.ts — enqueueEvent() and drainQueue(). See network-failure-handling.md
lib/sentry-transport.ts — Custom transport with exponential backoff retry. See timeout-handling.md
lib/sentry-shutdown.ts — SIGTERM/SIGINT handlers calling Sentry.close(2000). See timeout-handling.md
Key rules:
Sentry.close(timeout) before process.exit() — without it, in-flight events are silently droppedPromise.allSettled
captureError() with automatic fallback to local logging| Error | Cause | Solution |
|---|---|---|
App crashes on Sentry.init() |
Invalid DSN or SDK bug | Wrap in try/catch via initSentrySafe() |
Events lost on SIGTERM |
No Sentry.close() before exit |
Register signal handlers with Sentry.close(2000) |
| Sentry outage cascades latency | Every error path hits Sentry HTTP | Circuit breaker trips after 5 failures |
| Events lost during network blip | SDK drops events silently | Retry transport + offline queue |
| Silent event loss | SDK fails without throwing | Health check probes with captureMessage + flush |
| Queue grows unbounded | Never drained, Sentry permanently down | Cap at 1000 events, drain on startup |
beforeSend crashes pipeline |
User hook throws | Nested try/catch, return raw event |
See errors.md for extended troubleshooting.
See examples.md for complete TypeScript and Python integration examples including full-stack wiring of all three patterns.
beforeSend, sampleRate, init optionsSentry.close() and Sentry.flush()
sentry_sdk.init(), flush(), scope managementdrainQueue() via setInterval (Node) or cron (Python) instead of startup-onlysentry_sdk.init(transport=...) parameterbeforeSend to verify circuit breaker behavior