Transactional

Concepts

Understand the error tracking data model - issues, occurrences, fingerprinting, and severity.

Data Model Overview

Error tracking uses a hierarchical data model:

Project
└── Issues (grouped errors)
    └── Occurrences (individual error events)

Issues vs Occurrences

Understanding the difference between issues and occurrences is fundamental to error tracking.

Issues

An issue represents a unique error type. Multiple error events that have the same root cause are grouped into a single issue.

// Issue: TypeError - Cannot read property 'name' of undefined
{
  id: "issue-abc123",
  fingerprint: "sha256:a1b2c3...",
  title: "TypeError: Cannot read property 'name' of undefined",
  culprit: "src/components/UserCard.tsx:42",
  status: "UNRESOLVED",
  severity: "ERROR",
  platform: "REACT",
  occurrenceCount: 156,
  userCount: 23,
  firstSeen: "2024-01-15T10:00:00Z",
  lastSeen: "2024-01-15T14:30:00Z",
}

Occurrences

An occurrence is a single error event - one specific instance when an error happened.

// Occurrence: One specific error event
{
  id: "occ-xyz789",
  issueId: "issue-abc123",
  eventId: "evt-123456",
  timestamp: "2024-01-15T14:30:00Z",
  severity: "ERROR",
  exceptionType: "TypeError",
  exceptionValue: "Cannot read property 'name' of undefined",
  stackTrace: { frames: [...] },
  userId: "user-456",
  userEmail: "john@example.com",
  environment: "production",
  release: "1.2.3",
  url: "https://app.example.com/users/123",
  breadcrumbs: [...],
  tags: { feature: "user-profile" },
}

Relationship

1 Issue = Many Occurrences

Issue: "TypeError: Cannot read property 'name' of undefined"
├── Occurrence 1: User A, Chrome, 10:30 AM
├── Occurrence 2: User B, Safari, 10:31 AM
├── Occurrence 3: User C, Firefox, 10:45 AM
└── ... 153 more

Fingerprinting

Fingerprinting is how the system groups similar errors into issues. A fingerprint is a hash generated from:

  1. Exception Type - The error class (TypeError, ReferenceError, etc.)
  2. Stack Trace - The call stack frames (file, function, line)
  3. Exception Message - The error message (with variables normalized)

How Fingerprinting Works

// These two errors have the SAME fingerprint (same issue):
 
// Error 1
throw new TypeError("Cannot read property 'name' of undefined");
// at UserCard (src/components/UserCard.tsx:42:15)
// at renderUser (src/pages/Profile.tsx:88:20)
 
// Error 2
throw new TypeError("Cannot read property 'name' of undefined");
// at UserCard (src/components/UserCard.tsx:42:15)
// at renderUser (src/pages/Profile.tsx:88:20)
// These two errors have DIFFERENT fingerprints (different issues):
 
// Error 1 - Different stack trace
throw new TypeError("Cannot read property 'name' of undefined");
// at UserCard (src/components/UserCard.tsx:42:15)
 
// Error 2 - Different stack trace
throw new TypeError("Cannot read property 'name' of undefined");
// at UserList (src/components/UserList.tsx:67:10)

Custom Fingerprinting

You can override the default fingerprint:

obs.captureException(error, {
  fingerprint: ['checkout-payment-failed', error.code],
});

This groups errors by your custom logic instead of stack trace.

Severity Levels

Errors are classified by severity:

LevelDescriptionWhen to Use
DEBUGDiagnostic informationDevelopment debugging
INFOInformational messageNotable events that aren't errors
WARNINGPotential issueDegraded functionality, retries
ERRORError occurredCaught exceptions, failed operations
FATALCritical failureUnrecoverable errors, crashes

Setting Severity

// Manual capture with severity
obs.captureException(error, {
  severity: 'warning', // 'debug' | 'info' | 'warning' | 'error' | 'fatal'
});
 
// Capture a message with severity
obs.captureMessage('Payment retry succeeded after 3 attempts', 'warning');

Default Severity

  • Uncaught exceptions: error
  • Unhandled promise rejections: error
  • Manual captureException(): error
  • Manual captureMessage(): info

Issue Status

Issues have a lifecycle status:

StatusDescriptionActions
UNRESOLVEDActive issue needing attentionResolve, Ignore
RESOLVEDFixed and deployedReopens on regression
IGNOREDIntentionally suppressedUnignore

Status Transitions

New Error → UNRESOLVED
                ↓
      ┌─────────┴─────────┐
      ↓                   ↓
   RESOLVED            IGNORED
      ↓                   ↓
   (regression)      (unignore)
      ↓                   ↓
   UNRESOLVED        UNRESOLVED

Regression Detection

When a RESOLVED issue receives a new occurrence:

  1. Issue status changes back to UNRESOLVED
  2. REGRESSION alert triggers (if configured)
  3. The issue appears at the top of the list

Platform Detection

The SDK automatically detects the platform:

PlatformDetection
JAVASCRIPTBrowser environment
NODENode.js runtime
REACTReact error boundaries
NEXTJSNext.js instrumentation
PYTHONPython SDK
GOGo SDK
OTHERUnknown/custom

Platform affects:

  • Stack trace formatting
  • Source map handling
  • Context enrichment

Data Retention

Error data is retained based on your plan:

Data TypeFreeProEnterprise
Issues30 days90 days1 year
Occurrences7 days30 days90 days
Stack traces7 days30 days90 days

Configure custom retention in project settings.

Next Steps