diff --git a/public/app/plugins/datasource/loki/result_transformer.test.ts b/public/app/plugins/datasource/loki/result_transformer.test.ts index e11aa99dbe7..35ab13e21f3 100644 --- a/public/app/plugins/datasource/loki/result_transformer.test.ts +++ b/public/app/plugins/datasource/loki/result_transformer.test.ts @@ -1,7 +1,7 @@ import { CircularDataFrame, FieldCache, FieldType, MutableDataFrame } from '@grafana/data'; import { LokiStreamResult, LokiTailResponse, LokiStreamResponse, LokiResultType, TransformerOptions } from './types'; import * as ResultTransformer from './result_transformer'; -import { enhanceDataFrame } from './result_transformer'; +import { enhanceDataFrame, lokiPointsToTimeseriesPoints } from './result_transformer'; import { setTemplateSrv } from '@grafana/runtime'; import { TemplateSrv } from 'app/features/templating/template_srv'; @@ -256,4 +256,30 @@ describe('enhanceDataFrame', () => { url: '', }); }); + + describe('lokiPointsToTimeseriesPoints()', () => { + /** + * NOTE on time parameters: + * - Input time series data has timestamps in sec (like Prometheus) + * - Output time series has timestamps in ms (as expected for the chart lib) + * - Start/end parameters are in ns (as expected for Loki) + * - Step is in sec (like in Prometheus) + */ + const data: Array<[number, string]> = [ + [1, '1'], + [2, '0'], + [4, '1'], + ]; + + it('returns data as is if step, start, and end align', () => { + const options: Partial = { start: 1 * 1e9, end: 4 * 1e9, step: 1 }; + const result = lokiPointsToTimeseriesPoints(data, options as TransformerOptions); + expect(result).toEqual([ + [1, 1000], + [0, 2000], + [null, 3000], + [1, 4000], + ]); + }); + }); }); diff --git a/public/app/plugins/datasource/loki/result_transformer.ts b/public/app/plugins/datasource/loki/result_transformer.ts index 94d2cd09282..f430e44c8da 100644 --- a/public/app/plugins/datasource/loki/result_transformer.ts +++ b/public/app/plugins/datasource/loki/result_transformer.ts @@ -185,7 +185,10 @@ function lokiMatrixToTimeSeries(matrixResult: LokiMatrixResult, options: Transfo }; } -function lokiPointsToTimeseriesPoints(data: Array<[number, string]>, options: TransformerOptions): TimeSeriesValue[][] { +export function lokiPointsToTimeseriesPoints( + data: Array<[number, string]>, + options: TransformerOptions +): TimeSeriesValue[][] { const stepMs = options.step * 1000; const datapoints: TimeSeriesValue[][] = []; @@ -199,7 +202,7 @@ function lokiPointsToTimeseriesPoints(data: Array<[number, string]>, options: Tr const timestamp = time * 1000; for (let t = baseTimestampMs; t < timestamp; t += stepMs) { - datapoints.push([0, t]); + datapoints.push([null, t]); } baseTimestampMs = timestamp + stepMs; @@ -208,7 +211,7 @@ function lokiPointsToTimeseriesPoints(data: Array<[number, string]>, options: Tr const endTimestamp = options.end / 1e6; for (let t = baseTimestampMs; t <= endTimestamp; t += stepMs) { - datapoints.push([0, t]); + datapoints.push([null, t]); } return datapoints;