diff --git a/packages/grafana-ui/src/types/data.ts b/packages/grafana-ui/src/types/data.ts index fcbf95f9f4a..f589e1c4e29 100644 --- a/packages/grafana-ui/src/types/data.ts +++ b/packages/grafana-ui/src/types/data.ts @@ -20,27 +20,10 @@ export interface TimeSeriesVM { label: string; color: string; data: TimeSeriesValue[][]; - stats: TimeSeriesStats; allIsNull: boolean; allIsZero: boolean; } -export interface TimeSeriesStats { - [key: string]: number | null; - total: number | null; - max: number | null; - min: number | null; - logmin: number; - avg: number | null; - current: number | null; - first: number | null; - delta: number; - diff: number | null; - range: number | null; - timeStep: number; - count: number; -} - export enum NullValueMode { Null = 'null', Ignore = 'connected', diff --git a/packages/grafana-ui/src/utils/index.ts b/packages/grafana-ui/src/utils/index.ts index eb05e828616..45b8d049a63 100644 --- a/packages/grafana-ui/src/utils/index.ts +++ b/packages/grafana-ui/src/utils/index.ts @@ -1,4 +1,3 @@ -export * from './processTimeSeries'; export * from './processTableData'; export * from './valueFormats/valueFormats'; export * from './colors'; diff --git a/packages/grafana-ui/src/utils/processTimeSeries.ts b/packages/grafana-ui/src/utils/processTimeSeries.ts deleted file mode 100644 index 2574ae84ac4..00000000000 --- a/packages/grafana-ui/src/utils/processTimeSeries.ts +++ /dev/null @@ -1,200 +0,0 @@ -// Libraries -import isNumber from 'lodash/isNumber'; - -import { colors } from './colors'; - -// Types -import { getFlotPairs } from './flotPairs'; -import { TimeSeriesVMs, NullValueMode, TimeSeriesValue, TableData } from '../types'; - -interface Options { - data: TableData[]; - xColumn?: number; // Time (or null to guess) - yColumn?: number; // Value (or null to guess) - nullValueMode: NullValueMode; -} - -// NOTE: this should move to processTableData.ts -// I left it as is so the merge changes are more clear. -export function processTimeSeries({ data, xColumn, yColumn, nullValueMode }: Options): TimeSeriesVMs { - const vmSeries = data.map((item, index) => { - if (!isNumber(xColumn)) { - xColumn = 1; // Default timeseries colum. TODO, find first time field! - } - if (!isNumber(yColumn)) { - yColumn = 0; // TODO, find first non-time field - } - - // TODO? either % or throw error? - if (xColumn >= item.columns.length) { - throw new Error('invalid colum: ' + xColumn); - } - if (yColumn >= item.columns.length) { - throw new Error('invalid colum: ' + yColumn); - } - - const colorIndex = index % colors.length; - const label = item.columns[yColumn].text; - - // Use external calculator just to make sure it works :) - const result = getFlotPairs({ - rows: item.rows, - xIndex: xColumn, - yIndex: yColumn, - nullValueMode, - }); - - // stat defaults - let total = 0; - let max: TimeSeriesValue = -Number.MAX_VALUE; - let min: TimeSeriesValue = Number.MAX_VALUE; - let logmin = Number.MAX_VALUE; - let avg: TimeSeriesValue = null; - let current: TimeSeriesValue = null; - let first: TimeSeriesValue = null; - let delta: TimeSeriesValue = 0; - let diff: TimeSeriesValue = null; - let range: TimeSeriesValue = null; - let timeStep = Number.MAX_VALUE; - let allIsNull = true; - let allIsZero = true; - - const ignoreNulls = nullValueMode === NullValueMode.Ignore; - const nullAsZero = nullValueMode === NullValueMode.AsZero; - - let currentTime: TimeSeriesValue = null; - let currentValue: TimeSeriesValue = null; - let nonNulls = 0; - let previousTime: TimeSeriesValue = null; - let previousValue = 0; - let previousDeltaUp = true; - - for (let i = 0; i < item.rows.length; i++) { - currentValue = item.rows[i][yColumn]; - currentTime = item.rows[i][xColumn]; - - if (typeof currentTime !== 'number') { - continue; - } - - if (currentValue !== null && typeof currentValue !== 'number') { - throw { message: 'Time series contains non number values' }; - } - - // Due to missing values we could have different timeStep all along the series - // so we have to find the minimum one (could occur with aggregators such as ZimSum) - if (previousTime !== null && currentTime !== null) { - const currentStep = currentTime - previousTime; - if (currentStep < timeStep) { - timeStep = currentStep; - } - } - - previousTime = currentTime; - - if (currentValue === null) { - if (ignoreNulls) { - continue; - } - if (nullAsZero) { - currentValue = 0; - } - } - - if (currentValue !== null) { - if (isNumber(currentValue)) { - total += currentValue; - allIsNull = false; - nonNulls++; - } - - if (currentValue > max) { - max = currentValue; - } - - if (currentValue < min) { - min = currentValue; - } - - if (first === null) { - first = currentValue; - } else { - if (previousValue > currentValue) { - // counter reset - previousDeltaUp = false; - if (i === item.rows.length - 1) { - // reset on last - delta += currentValue; - } - } else { - if (previousDeltaUp) { - delta += currentValue - previousValue; // normal increment - } else { - delta += currentValue; // account for counter reset - } - previousDeltaUp = true; - } - } - previousValue = currentValue; - - if (currentValue < logmin && currentValue > 0) { - logmin = currentValue; - } - - if (currentValue !== 0) { - allIsZero = false; - } - } - } - - if (max === -Number.MAX_VALUE) { - max = null; - } - - if (min === Number.MAX_VALUE) { - min = null; - } - - if (result.length && !allIsNull) { - avg = total / nonNulls; - current = result[result.length - 1][1]; - if (current === null && result.length > 1) { - current = result[result.length - 2][1]; - } - } - - if (max !== null && min !== null) { - range = max - min; - } - - if (current !== null && first !== null) { - diff = current - first; - } - - const count = result.length; - - return { - data: result, - label: label, - color: colors[colorIndex], - allIsZero, - allIsNull, - stats: { - total, - min, - max, - current, - logmin, - avg, - diff, - delta, - timeStep, - range, - count, - first, - }, - }; - }); - - return vmSeries; -} diff --git a/public/app/plugins/panel/graph2/GraphPanel.tsx b/public/app/plugins/panel/graph2/GraphPanel.tsx index 5d3bdca5dca..bdcade365d7 100644 --- a/public/app/plugins/panel/graph2/GraphPanel.tsx +++ b/public/app/plugins/panel/graph2/GraphPanel.tsx @@ -2,17 +2,9 @@ import _ from 'lodash'; import React, { PureComponent } from 'react'; -import { - Graph, - PanelProps, - NullValueMode, - colors, - TimeSeriesVMs, - ColumnType, - getFirstTimeColumn, - processTimeSeries, -} from '@grafana/ui'; +import { Graph, PanelProps, NullValueMode, colors, TimeSeriesVMs, ColumnType, getFirstTimeColumn } from '@grafana/ui'; import { Options } from './types'; +import { getFlotPairs } from '@grafana/ui/src/utils/flotPairs'; interface Props extends PanelProps {} @@ -33,16 +25,23 @@ export class GraphPanel extends PureComponent { // Show all numeric columns if (column.type === ColumnType.number) { - const tsvm = processTimeSeries({ - data: [table], - xColumn: timeColumn, - yColumn: i, + // Use external calculator just to make sure it works :) + const points = getFlotPairs({ + rows: table.rows, + xIndex: timeColumn, + yIndex: i, nullValueMode: NullValueMode.Null, - })[0]; + }); - const colorIndex = vmSeries.length % colors.length; - tsvm.color = colors[colorIndex]; - vmSeries.push(tsvm); + vmSeries.push({ + label: column.text, + data: points, + color: colors[vmSeries.length % colors.length], + + // TODO (calculate somewhere) + allIsNull: false, + allIsZero: false, + }); } } } diff --git a/public/app/plugins/panel/piechart/PieChartPanel.tsx b/public/app/plugins/panel/piechart/PieChartPanel.tsx index 282b3ffb1a5..9c6d7d1a072 100644 --- a/public/app/plugins/panel/piechart/PieChartPanel.tsx +++ b/public/app/plugins/panel/piechart/PieChartPanel.tsx @@ -18,7 +18,6 @@ export class PieChartPanel extends PureComponent { render() { const { width, height, options } = this.props; - // TODO -- only process when the data/config changes const values = getSingleStatValues(this.props); return (