Skip to content

Context & Breadcrumbs ​

Add context to your errors to make debugging easier. Sentry Sails provides access to the full Sentry SDK for managing user context, tags, and breadcrumbs.

User Context ​

Associate errors with specific users:

javascript
// In a policy or hook that runs after authentication
sails.sentry.setUser({
  id: req.session.userId,
  email: req.session.userEmail,
  username: req.session.username
})

Clear User Context ​

Clear user context on logout:

javascript
// In your logout action
sails.sentry.setUser(null)

Policy Example ​

Create a policy to automatically set user context:

api/policies/sentry-user.js

javascript
module.exports = async function (req, res, proceed) {
  if (req.session && req.session.userId) {
    sails.sentry.setUser({
      id: req.session.userId,
      email: req.session.userEmail
    })
  }
  return proceed()
}

Add to your policies:

javascript
// config/policies.js
module.exports.policies = {
  '*': ['sentry-user']
}

Tags ​

Tags are indexed key-value pairs for filtering and searching:

javascript
// Set a tag
sails.sentry.setTag('feature', 'checkout')

// Set multiple tags
sails.sentry.setTags({
  feature: 'checkout',
  tier: 'premium'
})

Common tags to consider:

  • feature - Which feature area
  • tier - User subscription tier
  • version - App version
  • region - Geographic region

Extra Data ​

Attach arbitrary data to errors:

javascript
// Set extra context
sails.sentry.setExtra('order', {
  id: order.id,
  total: order.total,
  items: order.items.length
})

// Set multiple extras
sails.sentry.setExtras({
  orderId: order.id,
  cartItems: cart.items
})

Breadcrumbs are a trail of events leading up to an error:

javascript
// Add a breadcrumb
sails.sentry.addBreadcrumb({
  category: 'auth',
  message: 'User logged in',
  level: 'info'
})
javascript
// Navigation
sails.sentry.addBreadcrumb({
  category: 'navigation',
  message: 'Navigated to checkout',
  level: 'info'
})

// User action
sails.sentry.addBreadcrumb({
  category: 'user',
  message: 'Added item to cart',
  level: 'info',
  data: {
    productId: product.id
  }
})

// HTTP request
sails.sentry.addBreadcrumb({
  category: 'http',
  message: 'API call to payment provider',
  level: 'info',
  data: {
    url: '/api/charge',
    method: 'POST',
    status_code: 200
  }
})
  • fatal
  • error
  • warning
  • info
  • debug

Scoped Context ​

Use withScope for context that should only apply to a single error:

javascript
sails.sentry.withScope((scope) => {
  scope.setUser({ id: userId })
  scope.setTag('action', 'password-reset')
  scope.setExtra('attempts', attemptCount)

  sails.sentry.captureException(error)
})
// Context is automatically cleared after the scope

Clearing Context ​

javascript
// Clear specific context
sails.sentry.setUser(null)
sails.sentry.setTag('feature', undefined)

// Clear all context on the current scope
sails.sentry.getCurrentScope().clear()

All open source projects are released under the MIT License.