Interface ProdErrorReport
Production Error Reporting
Smart GWT provides a comprehensive set of APIs for capturing rich diagnostic information when JavaScript errors occur in production systems. These APIs enable developers to gather detailed context about errors, making it significantly easier to troubleshoot issues that occur in deployed applications.
This information can be captured by saving it to a DataSource
for later analysis, or
by integrating with third-party error monitoring tools such as
Datadog or
Sentry. These tools can automatically
aggregate errors, track trends, and alert developers when issues occur.
Automated AI Analysis
It's particularly effective to automate feeding error reports to AI systems for analysis. At Reify.com, we use an end-to-end approach where novel errors are automatically reported via email to developers, with AI adding analysis and suggested remedies inline. This dramatically reduces the time needed to diagnose and fix production issues.
Available Telemetry
Smart GWT's error reporting APIs can capture:
- Rich Stack Traces - Browser-specific stack trace with function names, arguments, and line numbers via Class.getStackTrace()
- Timer Origin Traces - When an error occurs in a timer callback, the stack trace leading up to the setTimeout() call is automatically included, showing where the timer was originally set
- Event Stream History - Complete record of user interactions leading up to the error
via
EventStream, including mouse clicks, key presses, and other events - UI Component State - Full snapshot of visible UI components and their states via
Canvas.getTopLevelComponents()andCanvas.getUISummary() - Framework and Browser Info - Smart GWT version, build date, browser type and version
Example: Capturing Error Context
The following code demonstrates how to capture comprehensive error information when a JavaScript error occurs. This example shows the key APIs and how they work together:
// Set up EventStream to capture user interactions
var eventStream = isc.EventStream.create({
autoStart: true,
captureEventErrors: true,
captureClickEvents: true,
captureKeyEvents: true
});
// Enable timer trace logging for setTimeout() origin tracking
isc.Log.setPriority("timerTrace", "DEBUG");
// Set up error listener to capture full context
eventStream.setEventErrorListener(function(eventStreamData) {
// Capture full stack trace
var errorEvent = eventStreamData.events ? eventStreamData.events.last() : null;
var stackTrace = errorEvent ? errorEvent.errorTrace : "No error trace available";
// Get timer trace if error occurred in setTimeout callback
var timerTrace = isc.Timer.getTimerTrace();
// Get visible top-level components
var topLevelComponents = isc.Canvas.getTopLevelComponents();
// Capture UI summary for each visible component
var componentSummaries = topLevelComponents.map(function(canvas) {
return canvas.getUISummary();
});
// Assemble complete error report
var report = {
timestamp: new Date().toISOString(),
errorMessage: stackTrace.split('\n')[0],
// Stack traces
stackTrace: stackTrace,
timerTrace: timerTrace,
// User interaction history
eventStream: {
startTime: eventStreamData.startTime,
endTime: eventStreamData.endTime,
nEvents: eventStreamData.nEvents,
events: eventStreamData.events
},
// UI state at time of error
visibleComponents: componentSummaries,
topLevelComponentsCount: topLevelComponents.length,
// Environment info
browser: {
name: isc.Browser.appCodeName || isc.Browser.appName,
version: isc.Browser.version,
platform: isc.Browser.OS || isc.Browser.platform
},
framework: {
version: isc.version,
buildDate: isc.buildDate
}
};
// Verify data is JSON serializable
var reportJSON = JSON.stringify(report, null, 2);
// Send to your error tracking system (DataSource, Datadog, Sentry, etc.)
// myErrorTrackingDS.addData(report);
});
Example Error Report Data
Here's an abridged sample of what the captured error data looks like:
{
"timestamp": "2025-10-16T00:42:59.912Z",
"errorMessage": "Error: Test error triggered from setTimeout callback",
"stackTrace": "Error: Test error triggered from setTimeout callback
null.eval(<no args: exited>) @ [no file]:167:23
[c]Class.fireCallback(...) on [Class Timer] @ ISC_Core.js:3500:34
[c]Timer._fireTimeout(...) on [Class Timer] @ ISC_Core.js:31803:10
Stack trace for setTimeout() call:
isc_Button.click() on [Button ID:isc_Button_2] @ [no file]:161:32
...",
"timerTrace": "
isc_Button.click() on [Button ID:isc_Button_2] @ [no file]:161:32
...",
"eventStream": {
"startTime": "2025-10-16T00:42:58.958Z",
"nEvents": 1,
"events": [
{
"eventType": "mouseout",
"timeOffset": 948,
"locator": "//:Label[title=\"Header Section\"]/",
"targetID": "isc_Label_0",
"targetClass": "Label",
"errorTrace": "...",
"threadCode": "TMR0"
}
]
},
"visibleComponents": [
{
"id": "testModalWindow",
"smartClientComponentType": "Window",
"members": [
{
"id": "isc_DynamicForm_0",
"smartClientComponentType": "DynamicForm",
"values": {},
"fields": [...]
}
]
},
{
"id": "testMainLayout",
"smartClientComponentType": "VLayout",
"members": [...]
}
],
"topLevelComponentsCount": 2,
"browser": {
"name": "Chrome",
"version": 140,
"platform": "MacOS"
},
"framework": {
"version": "v15.0d_2025-10-16",
"buildDate": "2025-10-16"
}
}
This comprehensive error context makes it much easier to reproduce and fix issues that occur in production, especially when combined with AI analysis tools.
- See Also:
-
Canvas.getTopLevelComponents()EventStream.setEventErrorListener(com.smartgwt.client.callbacks.EventErrorCallback)com.smartgwt.client.widgets.Canvas#getUISummary