UNPKG

5.04 kBJavaScriptView Raw
1// Copyright (c) 2015 Uber Technologies, Inc.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a copy
4// of this software and associated documentation files (the "Software"), to deal
5// in the Software without restriction, including without limitation the rights
6// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7// copies of the Software, and to permit persons to whom the Software is
8// furnished to do so, subject to the following conditions:
9//
10// The above copyright notice and this permission notice shall be included in
11// all copies or substantial portions of the Software.
12//
13// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19// THE SOFTWARE.
20
21var test = require('tape');
22
23var captureStdio = require('./lib/capture-stdio.js');
24var FatLogger = require('./lib/fat-logger.js');
25
26test('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 // insert sentry as the first stream
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 // delay by 1000ms for sentry
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 // console.log('consoleObj', consoleObj);
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 // console.log('p', payload);
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 // console.log('what.', sentryMsg);
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
122test('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 // delay by 100ms for sentry
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});