diff --git a/public/app/features/logs/components/otel/formats.test.ts b/public/app/features/logs/components/otel/formats.test.ts index 286654f8995..4844e2a307a 100644 --- a/public/app/features/logs/components/otel/formats.test.ts +++ b/public/app/features/logs/components/otel/formats.test.ts @@ -1,7 +1,7 @@ import { LOG_LINE_BODY_FIELD_NAME } from '../LogDetailsBody'; import { createLogLine } from '../mocks/logRow'; -import { getDisplayedFieldsForLogs, getOtelFormattedBody } from './formats'; +import { getDisplayedFieldsForLogs, getOtelFormattedBody, OTEL_PROBE_FIELD } from './formats'; describe('getDisplayedFieldsForLogs', () => { test('Does not return displayed fields if not an OTel log line', () => { @@ -10,19 +10,30 @@ describe('getDisplayedFieldsForLogs', () => { expect(getDisplayedFieldsForLogs([log])).toEqual([]); }); - test('Does not return displayed fields if telemetry_sdk_language is empty', () => { - const log = createLogLine({ labels: { severity_number: '1' }, entry: `place="luna" 1ms 3 KB` }); + test('Does not return displayed fields if the OTel probe field is not present', () => { + const log = createLogLine({ labels: { severity_level: '1' }, entry: `place="luna" 1ms 3 KB` }); expect(getDisplayedFieldsForLogs([log])).toEqual([]); }); - test('Does not return displayed fields if telemetry_sdk_language is empty', () => { + test('Returns displayed fields if the OTel probe field is present', () => { const log = createLogLine({ - labels: { severity_number: '1', telemetry_sdk_language: 'php', scope_name: 'scope' }, + labels: { [OTEL_PROBE_FIELD]: '1', telemetry_sdk_language: 'php', scope_name: 'scope' }, entry: `place="luna" 1ms 3 KB`, }); expect(getDisplayedFieldsForLogs([log])).toEqual(['scope_name', LOG_LINE_BODY_FIELD_NAME]); + expect(log.otelLanguage).toBe('php'); + }); + + test('Returns displayed fields if the OTel probe field is present and the language unknown', () => { + const log = createLogLine({ + labels: { [OTEL_PROBE_FIELD]: '1', scope_name: 'scope' }, + entry: `place="luna" 1ms 3 KB`, + }); + + expect(getDisplayedFieldsForLogs([log])).toEqual(['scope_name', LOG_LINE_BODY_FIELD_NAME]); + expect(log.otelLanguage).toBe('unknown'); }); }); diff --git a/public/app/features/logs/components/otel/formats.ts b/public/app/features/logs/components/otel/formats.ts index 640009a39a3..dc28b49e52a 100644 --- a/public/app/features/logs/components/otel/formats.ts +++ b/public/app/features/logs/components/otel/formats.ts @@ -6,7 +6,8 @@ import { LogListModel } from '../panel/processing'; /** * The presence of this field along log fields determines OTel origin. */ -const OTEL_PROBE_FIELD = 'severity_number'; +export const OTEL_PROBE_FIELD = 'severity_number'; +const OTEL_LANGUAGE_UNKNOWN = 'unknown'; export function identifyOTelLanguages(logs: LogListModel[] | LogRowModel[]): string[] { const languagesSet = new Set(); logs.forEach((log) => { @@ -22,8 +23,8 @@ export function identifyOTelLanguage(log: LogListModel | LogRowModel): string | if ('otelLanguage' in log && log.otelLanguage) { return log.otelLanguage; } - return log.labels[OTEL_PROBE_FIELD] !== undefined && log.labels.telemetry_sdk_language - ? log.labels.telemetry_sdk_language + return log.labels[OTEL_PROBE_FIELD] !== undefined + ? (log.labels.telemetry_sdk_language ?? OTEL_LANGUAGE_UNKNOWN) : undefined; }