diff --git a/packages/grafana-data/src/types/logs.ts b/packages/grafana-data/src/types/logs.ts index f7748a69681..d6b4522c83c 100644 --- a/packages/grafana-data/src/types/logs.ts +++ b/packages/grafana-data/src/types/logs.ts @@ -132,9 +132,9 @@ export interface LogsParser { getValueFromField: (field: string) => string; /** * Function to verify if this is a valid parser for the given line. - * The parser accepts the line unless it returns undefined. + * The parser accepts the line if it returns true. */ - test: (line: string) => any; + test: (line: string) => boolean; } export enum LogsDedupDescription { diff --git a/packages/grafana-data/src/utils/logs.test.ts b/packages/grafana-data/src/utils/logs.test.ts index 2a0b336f30d..85d2c881775 100644 --- a/packages/grafana-data/src/utils/logs.test.ts +++ b/packages/grafana-data/src/utils/logs.test.ts @@ -165,6 +165,7 @@ describe('LogsParsers', () => { test('should detect format', () => { expect(parser.test('foo')).toBeFalsy(); + expect(parser.test('"foo"')).toBeFalsy(); expect(parser.test('{"foo":"bar"}')).toBeTruthy(); }); diff --git a/packages/grafana-data/src/utils/logs.ts b/packages/grafana-data/src/utils/logs.ts index fb3ed84706d..96af4c4a602 100644 --- a/packages/grafana-data/src/utils/logs.ts +++ b/packages/grafana-data/src/utils/logs.ts @@ -83,9 +83,13 @@ export const LogsParsers: { [name: string]: LogsParser } = { getLabelFromField: (field) => (field.match(/^"([^"]+)"\s*:/) || [])[1], getValueFromField: (field) => (field.match(/:\s*(.*)$/) || [])[1], test: (line) => { + let parsed; try { - return JSON.parse(line); + parsed = JSON.parse(line); } catch (error) {} + // The JSON parser should only be used for log lines that are valid serialized JSON objects. + // If it would be used for a string, detected fields would include each letter as a separate field. + return typeof parsed === 'object'; }, },