diff --git a/packages/grafana-ui/src/utils/logs.ts b/packages/grafana-ui/src/utils/logs.ts index fb8c7977e2a..b5c45b635da 100644 --- a/packages/grafana-ui/src/utils/logs.ts +++ b/packages/grafana-ui/src/utils/logs.ts @@ -23,6 +23,15 @@ export function getLogLevel(line: string): LogLevel { return LogLevel.unknown; } +export function getLogLevelFromKey(key: string): LogLevel { + const level = (LogLevel as any)[key]; + if (level) { + return level; + } + + return LogLevel.unknown; +} + export function addLogLevelToSeries(series: SeriesData, lineIndex: number): SeriesData { return { ...series, // Keeps Tags, RefID etc diff --git a/public/app/core/logs_model.ts b/public/app/core/logs_model.ts index d2a4780b62a..5fe95a182d0 100644 --- a/public/app/core/logs_model.ts +++ b/public/app/core/logs_model.ts @@ -13,6 +13,7 @@ import { toLegacyResponseData, FieldCache, FieldType, + getLogLevelFromKey, LogRowModel, LogsModel, LogsMetaItem, @@ -368,7 +369,17 @@ export function processLogSeriesRow( const timeEpochMs = time.valueOf(); const timeFromNow = time.fromNow(); const timeLocal = time.format('YYYY-MM-DD HH:mm:ss'); - const logLevel = getLogLevel(message); + + let logLevel = LogLevel.unknown; + const logLevelField = fieldCache.getFieldByName('level'); + + if (logLevelField) { + logLevel = getLogLevelFromKey(row[logLevelField.index]); + } else if (series.labels && Object.keys(series.labels).indexOf('level') !== -1) { + logLevel = getLogLevelFromKey(series.labels['level']); + } else { + logLevel = getLogLevel(message); + } const hasAnsi = hasAnsiCodes(message); const searchWords = series.meta && series.meta.searchWords ? series.meta.searchWords : []; diff --git a/public/app/core/specs/logs_model.test.ts b/public/app/core/specs/logs_model.test.ts index a2d47412bd0..c83f0ce6c1c 100644 --- a/public/app/core/specs/logs_model.test.ts +++ b/public/app/core/specs/logs_model.test.ts @@ -1,4 +1,4 @@ -import { SeriesData, FieldType, LogsModel, LogsMetaKind, LogsDedupStrategy } from '@grafana/ui'; +import { SeriesData, FieldType, LogsModel, LogsMetaKind, LogsDedupStrategy, LogLevel } from '@grafana/ui'; import { dedupLogRows, calculateFieldStats, @@ -460,8 +460,12 @@ describe('seriesDataToLogsModel', () => { name: 'message', type: FieldType.string, }, + { + name: 'level', + type: FieldType.string, + }, ], - rows: [['1970-01-01T00:00:01Z', 'WARN boooo']], + rows: [['1970-01-01T00:00:01Z', 'WARN boooo', 'dbug']], }, ]; const logsModel = seriesDataToLogsModel(series, 0); @@ -470,7 +474,7 @@ describe('seriesDataToLogsModel', () => { { entry: 'WARN boooo', labels: undefined, - logLevel: 'warning', + logLevel: LogLevel.debug, uniqueLabels: {}, }, ]); @@ -482,6 +486,7 @@ describe('seriesDataToLogsModel', () => { labels: { foo: 'bar', baz: '1', + level: 'dbug', }, fields: [ { @@ -500,6 +505,7 @@ describe('seriesDataToLogsModel', () => { labels: { foo: 'bar', baz: '2', + level: 'err', }, fields: [ { @@ -521,19 +527,19 @@ describe('seriesDataToLogsModel', () => { { entry: 'INFO 2', labels: { foo: 'bar', baz: '2' }, - logLevel: 'info', + logLevel: LogLevel.error, uniqueLabels: { baz: '2' }, }, { entry: 'WARN boooo', labels: { foo: 'bar', baz: '1' }, - logLevel: 'warning', + logLevel: LogLevel.debug, uniqueLabels: { baz: '1' }, }, { entry: 'INFO 1', labels: { foo: 'bar', baz: '2' }, - logLevel: 'info', + logLevel: LogLevel.error, uniqueLabels: { baz: '2' }, }, ]);