How Grouping Works
When an error is captured, Proliferate generates a fingerprint—a unique identifier based on the error’s characteristics. Errors with the same fingerprint are grouped into the same Issue.The Fingerprinting Algorithm
Proliferate uses a deterministic algorithm to generate fingerprints:1
Extract error type
The exception class name (e.g.,
TypeError, ValueError)2
Parse stack frames
Extract the first 3 frames from the stack trace
3
Build fingerprint source
Combine type and frames as
ErrorType|func1@file1|func2@file2|func3@file34
Hash
Generate a SHA256 hash and take the first 16 characters
Why This Approach?
Line numbers are intentionally excluded
Line numbers are intentionally excluded
This means:
- Refactoring code that doesn’t change the error won’t create a new Issue
- Adding/removing unrelated code in the same file won’t split Issues
- The same logical error stays grouped together across releases
Only the first 3 frames are used
Only the first 3 frames are used
This means:
- Deep call stacks with the same root cause stay grouped
- Framework-level differences in the call stack don’t split Issues
Viewing Grouped Errors
In the dashboard, you’ll see:- Issues: Unique error types grouped by fingerprint
- Events: Individual occurrences of each Issue
- First and last seen timestamps
- Total event count
- Affected users and accounts
- Trend over time
Stack Trace Parsing
Proliferate parses stack traces from both JavaScript and Python:- JavaScript
- Python
Handling Different Error Scenarios
Same Error, Different Locations
Errors of the same type thrown from different code locations will be separate Issues:Third-Party Library Errors
Errors from third-party libraries are grouped by where they’re called from your code:Issue Management
Merging Issues
If you determine that two Issues are actually the same problem, you can merge them in the dashboard. The merged Issue will combine:- All events from both Issues
- Affected users and accounts
- Timeline data
Resolving Issues
Mark an Issue as resolved when you’ve fixed the underlying problem. If new events occur:- The Issue automatically reopens
- You receive a notification (if configured)
Ignoring Issues
For known issues you can’t or don’t want to fix:- Mark the Issue as ignored
- New events are still collected but won’t trigger alerts
- You can unignore at any time
Best Practices
Use specific error types
Use specific error types
Custom error classes lead to better grouping:
Avoid dynamic error messages
Avoid dynamic error messages
The error type matters more than the message:
Don't catch and re-throw generically
Don't catch and re-throw generically
Preserve the original error type:
Include Python module paths
Include Python module paths
Full module paths help with grouping:

