Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit 3662683

Browse files
authored
Merge pull request #32 from AckeeCZ/feat/28-setnry-level
✨ Add sentry level
2 parents 90ba71c + 6eb3565 commit 3662683

4 files changed

Lines changed: 38 additions & 23 deletions

File tree

src/interfaces.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,6 @@ export interface CosmasOptions {
2222
config?: LoggerOptions;
2323
pretty?: boolean;
2424
sentry?: string | boolean;
25+
sentryLevel?: pino.LevelWithSilent;
2526
skip?: (req: Request, res?: Response) => boolean;
2627
}

src/sentry.ts

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { captureException, captureMessage, Severity, withScope } from '@sentry/node';
22
import { Transform, TransformCallback } from 'stream';
3+
import { CosmasOptions } from './interfaces';
4+
import { levels } from './levels';
35

46
const reportToSentry = (obj: any) => {
57
if (!obj.stack) {
@@ -21,17 +23,20 @@ const PINO_TO_SENTRY: { [key: number]: Severity } = {
2123
60: Severity.Critical,
2224
};
2325

24-
class SentryTransformStream extends Transform {
25-
// tslint:disable-next-line:function-name
26-
public _transform(chunk: any, _encoding: string, callback: TransformCallback) {
27-
const obj = JSON.parse(chunk);
28-
withScope(scope => {
29-
scope.setLevel(PINO_TO_SENTRY[obj.level]);
30-
scope.setExtras(obj);
31-
reportToSentry(obj);
32-
});
33-
this.push(chunk);
34-
callback();
35-
}
36-
}
37-
export { SentryTransformStream };
26+
export const createSentryTransformStream = (options: CosmasOptions): any => {
27+
return class SentryTransformStream extends Transform {
28+
// tslint:disable-next-line:function-name
29+
public _transform(chunk: any, _encoding: string, callback: TransformCallback) {
30+
const obj = JSON.parse(chunk);
31+
if (obj.level >= (options.sentryLevel || levels.warn)) {
32+
withScope(scope => {
33+
scope.setLevel(PINO_TO_SENTRY[obj.level]);
34+
scope.setExtras(obj);
35+
reportToSentry(obj);
36+
});
37+
}
38+
this.push(chunk);
39+
callback();
40+
}
41+
};
42+
};

src/streams.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ const initLoggerStreams = (
7373
streams = decorateStreams(streams, getDefaultTransformStream(options));
7474

7575
if (options.sentry) {
76-
const { SentryTransformStream } = require('./sentry');
77-
streams = decorateStreams(streams, SentryTransformStream);
76+
const { createSentryTransformStream } = require('./sentry');
77+
streams = decorateStreams(streams, createSentryTransformStream(options));
7878
}
7979

8080
return streams;

src/tests/sentry-mocked.test.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { levels } from '../levels';
2+
13
let loggerFactory;
24
const scope: any = {};
35
const withScope = jest.fn(fn =>
@@ -60,31 +62,38 @@ describe('sentry mocked', () => {
6062
`);
6163
});
6264

63-
test('sentry captureMessage is called with correct scope', async () => {
65+
test('sentry captureMessage is called with correct scope (respects sentry level)', async () => {
6466
await new Promise((resolve, reject) => {
6567
const logger = loggerFactory({
6668
sentry: 'DSN',
69+
sentryLevel: levels.fatal,
6770
});
6871
captureMessage.mockImplementation(createCapture(resolve));
69-
logger.info('Foo');
72+
// expect to trigger only fatal
73+
logger.trace('trace');
74+
logger.debug('debug');
75+
logger.info('info');
76+
logger.warn('warn');
77+
logger.error('error');
78+
logger.fatal('fatal');
7079
});
7180
expect(captureMessage).toHaveBeenCalledTimes(1);
7281
expect(captureException).not.toHaveBeenCalled();
7382
expect(captureMessage.mock.calls[0]).toMatchInlineSnapshot(`
7483
Array [
75-
"Foo",
84+
"fatal",
7685
]
7786
`);
7887
expect(captureMessage.mock.results[0].value).toMatchInlineSnapshot(`
7988
Object {
80-
"data": "Foo",
89+
"data": "fatal",
8190
"scope": Object {
8291
"extras": Object {
83-
"level": 30,
84-
"message": "Foo",
92+
"level": 60,
93+
"message": "fatal",
8594
"v": 1,
8695
},
87-
"level": "info",
96+
"level": "critical",
8897
},
8998
}
9099
`);

0 commit comments

Comments
 (0)