Skip to content

Commit 0864381

Browse files
committed
fix: Ensure to report unexpected parsing issues
1 parent f38b906 commit 0864381

File tree

1 file changed

+29
-21
lines changed

1 file changed

+29
-21
lines changed

node/packages/sdk/lib/structured-log-to-event.js

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,28 @@
33
const isObject = require('type/object/is');
44
const createErrorCapturedEvent = require('./create-error-captured-event');
55
const createWarningCapturedEvent = require('./create-warning-captured-event');
6+
const reportError = require('./report-error');
7+
8+
const safeJsonParse = (logLine) => {
9+
try {
10+
return JSON.parse(logLine);
11+
} catch {
12+
return null;
13+
}
14+
};
15+
16+
const supportedLevels = new Set(['WARN', 'ERROR']);
617

718
const parseLogLevel = (level) => {
819
if (typeof level === 'string') {
920
const levelUpperCase = level.toUpperCase();
10-
if (levelUpperCase !== 'ERROR' && levelUpperCase !== 'WARN') {
11-
throw new Error('Unsupported level');
12-
}
13-
return levelUpperCase;
21+
if (supportedLevels.has(levelUpperCase)) return levelUpperCase;
1422
} else if (typeof level === 'number') {
15-
if (level <= 30) {
16-
throw new Error('Unsupported level');
17-
}
18-
19-
if (level <= 40) {
20-
return 'WARN';
21-
}
22-
return 'ERROR';
23+
if (level <= 30) return null;
24+
if (level <= 40) return 'WARN';
25+
if (level > 40) return 'ERROR';
2326
}
24-
throw new Error('Unsupported level');
27+
return null;
2528
};
2629

2730
const highCardinalityAttributes = [
@@ -119,16 +122,21 @@ module.exports.attemptParseStructuredLogAndCapture = (logLine) => {
119122
try {
120123
if (typeof logLine !== 'string') return;
121124
if (logLine[0] !== '{') return;
122-
const logLineParsed = JSON.parse(logLine);
123-
if ('level' in logLineParsed) {
124-
const logLevel = parseLogLevel(logLineParsed.level);
125-
if (logLevel === 'ERROR') {
125+
const logLineParsed = safeJsonParse(logLine);
126+
if (!logLineParsed) return;
127+
if (!logLineParsed.level) return;
128+
const logLevel = parseLogLevel(logLineParsed.level);
129+
switch (logLevel) {
130+
case 'ERROR':
126131
handleErrorLog(logLineParsed);
127-
} else if (logLevel === 'WARN') {
132+
return;
133+
case 'WARN':
128134
handleWarningLog(logLineParsed);
129-
}
135+
return;
136+
default:
137+
throw new Error(`Unsupported log level: ${logLevel}`);
130138
}
131-
} catch (err) {
132-
// Not a structured logline
139+
} catch (error) {
140+
reportError(error);
133141
}
134142
};

0 commit comments

Comments
 (0)