1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 | var test = require('tape');
|
22 |
|
23 | var captureStdio = require('./lib/capture-stdio.js');
|
24 | var FatLogger = require('./lib/fat-logger.js');
|
25 |
|
26 | test('can error(message, { err: err })', function t(assert) {
|
27 | var kafkaMessages = [];
|
28 | var sentryMessages = [];
|
29 | var logger = FatLogger({
|
30 | raw: true,
|
31 | json: true,
|
32 | kafkaListener: kafkaListener,
|
33 | sentryListener: sentryListener
|
34 | });
|
35 |
|
36 | var streams = logger._streamsByLevel.error;
|
37 | assert.ok(streams[3].name === 'sentry');
|
38 |
|
39 | streams.unshift(streams.pop());
|
40 | assert.ok(streams[0].name === 'sentry');
|
41 |
|
42 | var consoleBuf = captureStdio(null, function logError() {
|
43 | logger.error('some message', {
|
44 | err: new Error('hello'),
|
45 | other: 'key'
|
46 | }, function delay() {
|
47 |
|
48 | setTimeout(onLogged, 1000);
|
49 | });
|
50 | }, {
|
51 | raw: true
|
52 | });
|
53 |
|
54 | function onLogged() {
|
55 | assert.equal(consoleBuf.length, 1);
|
56 | var consoleObj = JSON.parse(consoleBuf[0]);
|
57 |
|
58 |
|
59 |
|
60 | assert.ok(consoleObj.err);
|
61 | assert.ok(consoleObj.err.stack);
|
62 | assert.equal(consoleObj.err.message, 'hello');
|
63 | assert.equal(consoleObj.other, 'key');
|
64 | assert.equal(consoleObj.message, 'some message');
|
65 |
|
66 |
|
67 | assert.equal(kafkaMessages.length, 1);
|
68 | var payload = kafkaMessages[0].messages[0].payload;
|
69 |
|
70 |
|
71 |
|
72 | assert.ok(payload.fields.err);
|
73 | assert.ok(payload.fields.err.stack);
|
74 | assert.equal(payload.fields.err.message, 'hello');
|
75 | assert.equal(payload.fields.other, 'key');
|
76 | assert.equal(payload.msg, 'some message');
|
77 |
|
78 | assert.equal(sentryMessages.length, 1);
|
79 | var sentryMsg = sentryMessages[0];
|
80 |
|
81 |
|
82 |
|
83 | assert.equal(sentryMsg.extra.other, 'key');
|
84 | assert.equal(sentryMsg.extra.originalMessage,
|
85 | 'some message');
|
86 | assert.equal(sentryMsg.message,
|
87 | 'Error: errors-with-all-backends.js: hello');
|
88 | var stackTrace = sentryMsg['sentry.interfaces.Stacktrace'];
|
89 | assert.ok(stackTrace.frames.length);
|
90 |
|
91 | logger.readFile(function onFile(err, file) {
|
92 | assert.ifError(err);
|
93 |
|
94 | var lines = file.split('\n')
|
95 | .filter(Boolean)
|
96 | .map(JSON.parse);
|
97 |
|
98 | assert.equal(lines.length, 1);
|
99 | var diskObj = lines[0];
|
100 |
|
101 | assert.ok(diskObj.err);
|
102 | assert.ok(diskObj.err.stack);
|
103 | assert.equal(diskObj.err.message, 'hello');
|
104 | assert.equal(diskObj.other, 'key');
|
105 | assert.equal(diskObj.message, 'some message');
|
106 |
|
107 | logger.destroy();
|
108 | assert.end();
|
109 | });
|
110 | }
|
111 |
|
112 | function kafkaListener(err, msg) {
|
113 | assert.ifError(err, 'no unexpected server error');
|
114 | kafkaMessages.push(msg);
|
115 | }
|
116 |
|
117 | function sentryListener(msg) {
|
118 | sentryMessages.push(msg);
|
119 | }
|
120 | });
|
121 |
|
122 | test('does no crash when error is not configurable', function t(assert) {
|
123 | var kafkaMessages = [];
|
124 | var sentryMessages = [];
|
125 | var logger = FatLogger({
|
126 | raw: true,
|
127 | json: true,
|
128 | kafkaListener: kafkaListener,
|
129 | sentryListener: sentryListener
|
130 | });
|
131 |
|
132 | var error = new Error('hello');
|
133 | Object.seal(error);
|
134 |
|
135 | assert.doesNotThrow(function log() {
|
136 | logger.error('some message', {
|
137 | err: error,
|
138 | }, function delay() {
|
139 |
|
140 | setTimeout(onLogged, 100);
|
141 | });
|
142 | });
|
143 |
|
144 | function onLogged() {
|
145 | logger.destroy();
|
146 | assert.end();
|
147 | }
|
148 |
|
149 | function kafkaListener(err, msg) {
|
150 | assert.ifError(err, 'no unexpected server error');
|
151 | kafkaMessages.push(msg);
|
152 | }
|
153 |
|
154 | function sentryListener(msg) {
|
155 | sentryMessages.push(msg);
|
156 | }
|
157 | });
|