diff --git a/ui/src/features/common/analysis-modal/transforms.test.ts b/ui/src/features/common/analysis-modal/transforms.test.ts index e3750a498f..e2716d5db4 100644 --- a/ui/src/features/common/analysis-modal/transforms.test.ts +++ b/ui/src/features/common/analysis-modal/transforms.test.ts @@ -24,7 +24,8 @@ import { metricStatusLabel, metricSubstatus, printableCloudWatchQuery, - printableDatadogQuery + printableDatadogQuery, + transformMeasurements } from './transforms'; import { AnalysisStatus, FunctionalStatus } from './types'; @@ -559,4 +560,15 @@ describe('analysis modal transforms', () => { tableValue: { latency: null, cpuUsage: null } }); }); + + test('transformMeasurements() with a non-JSON string measurement value', () => { + // a provider may return a plain string (e.g. "kargo") that is not valid JSON; + // this should not throw -- the value is placed in the table as-is + expect(transformMeasurements([], [{ value: 'kargo' }])).toEqual({ + chartable: false, + min: 0, + max: null, + measurements: [{ value: 'kargo', chartValue: null, tableValue: 'kargo' }] + }); + }); }); diff --git a/ui/src/features/common/analysis-modal/transforms.ts b/ui/src/features/common/analysis-modal/transforms.ts index 046ef4f86e..689c1aa893 100644 --- a/ui/src/features/common/analysis-modal/transforms.ts +++ b/ui/src/features/common/analysis-modal/transforms.ts @@ -783,7 +783,17 @@ const transformMeasurementValue = ( }; } - const parsedValue = JSON.parse(value); + let parsedValue; + try { + parsedValue = JSON.parse(value); + } catch { + // value is a plain string (not JSON) -- not chartable + return { + canChart: false, + chartValue: null, + tableValue: value + }; + } // single number measurement value if (isFiniteNumber(parsedValue)) {