Skip to content

Commit f0cb704

Browse files
authored
Merge pull request #67 from MindscapeHQ/inner-error-support
Inner error support
2 parents 361f2c6 + cf35f8c commit f0cb704

File tree

9 files changed

+2220
-234
lines changed

9 files changed

+2220
-234
lines changed

.travis.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
language: node_js
22
node_js:
33
- "6.1.0"
4-
- "4.1"
54
- "0.12"
65
- "0.11"
76
- "0.10"

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 0.10.0
2+
- Add support for inner errors. Option `innerErrorFieldName` to specify a field or a function on the error object to use for retrieval of an inner error. Defaults to `cause` which is used in [VError](https://github.com/joyent/node-verror)
3+
14
## 0.9.1
25

36
- Add an option to report column number for each frame of the stack trace

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@ Release 0.3 previously had a setUser function that accepted a string or function
139139

140140
Call setVersion(*string*) on a RaygunClient to set the version of the calling application. This is expected to be of the format x.x.x.x, where x is a positive integer. The version will be visible in the dashboard.
141141

142+
### Inner Errors
143+
144+
Starting from 0.10.0 support for inner errors was added. Provide option `innerErrorFieldName` to specify a field or a function on the error object to use for retrieval of an inner error. Inner errors will be retrieved recursively until there is no more errors. Option `innerErrorFieldName` defaults to `cause` which is used in [VError](https://github.com/joyent/node-verror), therefore `VError` is supported out of the box.
145+
142146
### Changing the API endpoint
143147

144148
You can change the endpoint that error messages are sent to by specifying the `host`, `port`, and `useSSL` properties in the `raygunClient.init()` options hash. By default, `host` is `api.raygun.io`, `port` is `443`, and `useSSL` is `true`.

lib/raygun.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ var MessageBuilder = require('./raygun.messageBuilder');
1515
var OfflineStorage = require('./raygun.offline');
1616

1717
var Raygun = function () {
18-
var _apiKey, _filters, raygun = this, _user, _version, _host, _port, _useSSL, _onBeforeSend, _offlineStorage, _isOffline, _offlineStorageOptions, _groupingKey, _tags, _useHumanStringForObject, _reportColumnNumbers;
18+
var _apiKey, _filters, raygun = this, _user, _version, _host, _port, _useSSL, _onBeforeSend, _offlineStorage, _isOffline, _offlineStorageOptions, _groupingKey, _tags, _useHumanStringForObject, _reportColumnNumbers, _innerErrorFieldName;
1919

2020
raygun.init = function (options) {
2121
_apiKey = options.apiKey;
@@ -31,6 +31,7 @@ var Raygun = function () {
3131
_tags = options.tags;
3232
_useHumanStringForObject = options.useHumanStringForObject === undefined ? true : options.useHumanStringForObject;
3333
_reportColumnNumbers = options.reportColumnNumbers;
34+
_innerErrorFieldName = options.innerErrorFieldName || 'cause'; // VError function to retrieve inner error;
3435

3536
if (_isOffline) {
3637
_offlineStorage.init(_offlineStorageOptions);
@@ -94,7 +95,7 @@ var Raygun = function () {
9495
mergedTags = mergedTags.concat(tags);
9596
}
9697

97-
var builder = new MessageBuilder({filters: _filters, useHumanStringForObject: _useHumanStringForObject, reportColumnNumbers: _reportColumnNumbers})
98+
var builder = new MessageBuilder({filters: _filters, useHumanStringForObject: _useHumanStringForObject, reportColumnNumbers: _reportColumnNumbers, innerErrorFieldName: _innerErrorFieldName})
9899
.setErrorDetails(exception)
99100
.setRequestDetails(request)
100101
.setMachineName()

lib/raygun.messageBuilder.js

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,44 @@ function filterKeys(obj, filters) {
2727
return obj;
2828
}
2929

30+
function getStackTrace(error, options) {
31+
var stack = [];
32+
var trace = stackTrace.parse(error);
33+
34+
trace.forEach(function (callSite) {
35+
var frame = {
36+
lineNumber: callSite.getLineNumber(),
37+
className: callSite.getTypeName() || 'unknown',
38+
fileName: callSite.getFileName(),
39+
methodName: callSite.getFunctionName() || '[anonymous]'
40+
};
41+
42+
if (!!options.reportColumnNumbers && typeof (callSite.getColumnNumber) === 'function') {
43+
frame.columnNumber = callSite.getColumnNumber();
44+
}
45+
46+
stack.push(frame);
47+
});
48+
49+
return stack;
50+
}
51+
52+
function buildError(error, options) {
53+
var builtError = {
54+
stackTrace: getStackTrace(error, options),
55+
message: error.message || "NoMessage",
56+
className: error.name
57+
};
58+
59+
var innerError = typeof error[options.innerErrorFieldName] === 'function' ? error[options.innerErrorFieldName]() : error[options.innerErrorFieldName];
60+
61+
if(innerError instanceof Error) {
62+
builtError.innerError = buildError(innerError, options);
63+
}
64+
65+
return builtError;
66+
}
67+
3068
var RaygunMessageBuilder = function (options) {
3169
options = options || {};
3270
var _filters;
@@ -63,28 +101,7 @@ var RaygunMessageBuilder = function (options) {
63101
return this;
64102
}
65103

66-
var stack = [];
67-
var trace = stackTrace.parse(error);
68-
trace.forEach(function (callSite) {
69-
var frame = {
70-
lineNumber: callSite.getLineNumber(),
71-
className: callSite.getTypeName() || 'unknown',
72-
fileName: callSite.getFileName(),
73-
methodName: callSite.getFunctionName() || '[anonymous]'
74-
};
75-
76-
if (!!options.reportColumnNumbers && typeof (callSite.getColumnNumber) === 'function') {
77-
frame.columnNumber = callSite.getColumnNumber();
78-
}
79-
80-
stack.push(frame);
81-
});
82-
83-
message.details.error = {
84-
stackTrace: stack,
85-
message: error.message || "NoMessage",
86-
className: error.name
87-
};
104+
message.details.error = buildError(error, options);
88105

89106
return this;
90107
};

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "raygun",
33
"description": "Raygun.io plugin for Node",
4-
"version": "0.9.1",
4+
"version": "0.10.0",
55
"homepage": "https://github.com/MindscapeHQ/raygun4node",
66
"author": {
77
"name": "MindscapeHQ",
@@ -30,9 +30,11 @@
3030
"devDependencies": {
3131
"jshint": "^2.5.6",
3232
"semver": "^5.0.3",
33-
"tap": "^7.1.2"
33+
"tap": "^7.1.2",
34+
"verror": "^1.10.0"
3435
},
3536
"dependencies": {
37+
"nock": "~8",
3638
"object-to-human-string": "0.0.3",
3739
"stack-trace": "0.0.6"
3840
},

0 commit comments

Comments
 (0)