Refactor: use data rather than series in stream callback(#18126)

This commit is contained in:
Ryan McKinley 2019-08-01 23:16:29 -07:00 committed by GitHub
parent 85da4a169d
commit 5f4b5dfecd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 48 additions and 48 deletions

View File

@ -309,9 +309,9 @@ export interface DataStreamState {
request: DataQueryRequest; request: DataQueryRequest;
/** /**
* Series data may not be known yet * Data may not be known yet
*/ */
series?: DataFrame[]; data?: DataFrame[];
/** /**
* Error in stream (but may still be running) * Error in stream (but may still be running)

View File

@ -11,7 +11,7 @@ import ErrorBoundary from 'app/core/components/ErrorBoundary/ErrorBoundary';
import { getTimeSrv, TimeSrv } from '../services/TimeSrv'; import { getTimeSrv, TimeSrv } from '../services/TimeSrv';
import { applyPanelTimeOverrides, calculateInnerPanelHeight } from 'app/features/dashboard/utils/panel'; import { applyPanelTimeOverrides, calculateInnerPanelHeight } from 'app/features/dashboard/utils/panel';
import { profiler } from 'app/core/profiler'; import { profiler } from 'app/core/profiler';
import { getProcessedDataFrame } from '../state/PanelQueryState'; import { getProcessedDataFrames } from '../state/PanelQueryState';
import templateSrv from 'app/features/templating/template_srv'; import templateSrv from 'app/features/templating/template_srv';
import config from 'app/core/config'; import config from 'app/core/config';
@ -71,7 +71,7 @@ export class PanelChrome extends PureComponent<Props, State> {
this.setState({ this.setState({
data: { data: {
state: LoadingState.Done, state: LoadingState.Done,
series: getProcessedDataFrame(panel.snapshotData), series: getProcessedDataFrames(panel.snapshotData),
}, },
isFirstLoad: false, isFirstLoad: false,
}); });

View File

@ -168,7 +168,7 @@ describe('PanelQueryRunner', () => {
streamState = { streamState = {
state: LoadingState.Streaming, state: LoadingState.Streaming,
key: 'test-stream-1', key: 'test-stream-1',
series: [ data: [
{ {
rows: [], rows: [],
fields: [], fields: [],

View File

@ -34,7 +34,7 @@ export interface QueryRunnerOptions<
} }
export enum PanelQueryRunnerFormat { export enum PanelQueryRunnerFormat {
series = 'series', frames = 'frames',
legacy = 'legacy', legacy = 'legacy',
both = 'both', both = 'both',
} }
@ -57,7 +57,7 @@ export class PanelQueryRunner {
* Listen for updates to the PanelData. If a query has already run for this panel, * Listen for updates to the PanelData. If a query has already run for this panel,
* the results will be immediatly passed to the observer * the results will be immediatly passed to the observer
*/ */
subscribe(observer: PartialObserver<PanelData>, format = PanelQueryRunnerFormat.series): Unsubscribable { subscribe(observer: PartialObserver<PanelData>, format = PanelQueryRunnerFormat.frames): Unsubscribable {
if (!this.subject) { if (!this.subject) {
this.subject = new Subject(); // Delay creating a subject until someone is listening this.subject = new Subject(); // Delay creating a subject until someone is listening
} }
@ -65,10 +65,10 @@ export class PanelQueryRunner {
if (format === PanelQueryRunnerFormat.legacy) { if (format === PanelQueryRunnerFormat.legacy) {
this.state.sendLegacy = true; this.state.sendLegacy = true;
} else if (format === PanelQueryRunnerFormat.both) { } else if (format === PanelQueryRunnerFormat.both) {
this.state.sendSeries = true; this.state.sendFrames = true;
this.state.sendLegacy = true; this.state.sendLegacy = true;
} else { } else {
this.state.sendSeries = true; this.state.sendFrames = true;
} }
// Send the last result // Send the last result

View File

@ -1,4 +1,4 @@
import { toDataQueryError, PanelQueryState, getProcessedDataFrame } from './PanelQueryState'; import { toDataQueryError, PanelQueryState, getProcessedDataFrames } from './PanelQueryState';
import { MockDataSourceApi } from 'test/mocks/datasource_srv'; import { MockDataSourceApi } from 'test/mocks/datasource_srv';
import { LoadingState } from '@grafana/data'; import { LoadingState } from '@grafana/data';
import { DataQueryResponse } from '@grafana/ui'; import { DataQueryResponse } from '@grafana/ui';
@ -65,7 +65,7 @@ describe('getProcessedDataFrame', () => {
target: '', target: '',
datapoints: [[100, 1], [200, 2]], datapoints: [[100, 1], [200, 2]],
}; };
const data = getProcessedDataFrame([null, input1, input2, null, null]); const data = getProcessedDataFrames([null, input1, input2, null, null]);
expect(data.length).toBe(2); expect(data.length).toBe(2);
expect(data[0].fields[0].name).toBe(input1.target); expect(data[0].fields[0].name).toBe(input1.target);
expect(data[0].rows).toBe(input1.datapoints); expect(data[0].rows).toBe(input1.datapoints);
@ -83,10 +83,10 @@ describe('getProcessedDataFrame', () => {
}); });
it('supports null values from query OK', () => { it('supports null values from query OK', () => {
expect(getProcessedDataFrame([null, null, null, null])).toEqual([]); expect(getProcessedDataFrames([null, null, null, null])).toEqual([]);
expect(getProcessedDataFrame(undefined)).toEqual([]); expect(getProcessedDataFrames(undefined)).toEqual([]);
expect(getProcessedDataFrame((null as unknown) as any[])).toEqual([]); expect(getProcessedDataFrames((null as unknown) as any[])).toEqual([]);
expect(getProcessedDataFrame([])).toEqual([]); expect(getProcessedDataFrames([])).toEqual([]);
}); });
}); });
@ -129,7 +129,7 @@ describe('stream handling', () => {
state: LoadingState.Loading, state: LoadingState.Loading,
key: 'C', key: 'C',
request: state.request, // From the same request request: state.request, // From the same request
series: [makeSeriesStub('C')], data: [makeSeriesStub('C')],
unsubscribe: () => {}, unsubscribe: () => {},
}); });
expect(state.streams.length).toBe(1); expect(state.streams.length).toBe(1);
@ -146,7 +146,7 @@ describe('stream handling', () => {
state: LoadingState.Loading, state: LoadingState.Loading,
key: 'D', key: 'D',
request: state.request, // From the same request request: state.request, // From the same request
series: [makeSeriesStub('D')], data: [makeSeriesStub('D')],
unsubscribe: () => {}, unsubscribe: () => {},
}); });
expect(state.streams.length).toBe(2); expect(state.streams.length).toBe(2);
@ -163,7 +163,7 @@ describe('stream handling', () => {
state: LoadingState.Loading, state: LoadingState.Loading,
key: 'C', // The key to replace previous index 2 key: 'C', // The key to replace previous index 2
request: state.request, // From the same request request: state.request, // From the same request
series: [makeSeriesStub('X')], data: [makeSeriesStub('X')],
unsubscribe: () => {}, unsubscribe: () => {},
}); });
expect(state.streams.length).toBe(2); expect(state.streams.length).toBe(2);
@ -181,7 +181,7 @@ describe('stream handling', () => {
...state.request, ...state.request,
requestId: 'XXX', // Different request and id requestId: 'XXX', // Different request and id
} as any, } as any,
series: [makeSeriesStub('C')], data: [makeSeriesStub('C')],
unsubscribe: () => {}, unsubscribe: () => {},
}); });

View File

@ -41,7 +41,7 @@ export class PanelQueryState {
// Active stream results // Active stream results
streams: DataStreamState[] = []; streams: DataStreamState[] = [];
sendSeries = false; sendFrames = false;
sendLegacy = false; sendLegacy = false;
// A promise for the running query // A promise for the running query
@ -127,15 +127,15 @@ export class PanelQueryState {
this.executor = null; this.executor = null;
// Make sure we send something back -- called run() w/o subscribe! // Make sure we send something back -- called run() w/o subscribe!
if (!(this.sendSeries || this.sendLegacy)) { if (!(this.sendFrames || this.sendLegacy)) {
this.sendSeries = true; this.sendFrames = true;
} }
// Save the result state // Save the result state
this.response = { this.response = {
state: LoadingState.Done, state: LoadingState.Done,
request: this.request, request: this.request,
series: this.sendSeries ? getProcessedDataFrame(resp.data) : [], series: this.sendFrames ? getProcessedDataFrames(resp.data) : [],
legacy: this.sendLegacy ? translateToLegacyData(resp.data) : undefined, legacy: this.sendLegacy ? translateToLegacyData(resp.data) : undefined,
}; };
resolve(this.validateStreamsAndGetPanelData()); resolve(this.validateStreamsAndGetPanelData());
@ -156,7 +156,7 @@ export class PanelQueryState {
// it will then delegate real changes to the PanelQueryRunner // it will then delegate real changes to the PanelQueryRunner
dataStreamObserver: DataStreamObserver = (stream: DataStreamState) => { dataStreamObserver: DataStreamObserver = (stream: DataStreamState) => {
// Streams only work with the 'series' format // Streams only work with the 'series' format
this.sendSeries = true; this.sendFrames = true;
// Add the stream to our list // Add the stream to our list
let found = false; let found = false;
@ -189,8 +189,8 @@ export class PanelQueryState {
const series: DataFrame[] = []; const series: DataFrame[] = [];
for (const stream of this.streams) { for (const stream of this.streams) {
if (stream.series) { if (stream.data) {
series.push.apply(series, stream.series); series.push.apply(series, stream.data);
} }
try { try {
@ -243,7 +243,7 @@ export class PanelQueryState {
} }
active.push(stream); active.push(stream);
series.push.apply(series, stream.series); series.push.apply(series, stream.data);
if (!this.isFinished(stream.state)) { if (!this.isFinished(stream.state)) {
done = false; done = false;
@ -277,11 +277,11 @@ export class PanelQueryState {
* Make sure all requested formats exist on the data * Make sure all requested formats exist on the data
*/ */
getDataAfterCheckingFormats(): PanelData { getDataAfterCheckingFormats(): PanelData {
const { response, sendLegacy, sendSeries } = this; const { response, sendLegacy, sendFrames } = this;
if (sendLegacy && (!response.legacy || !response.legacy.length)) { if (sendLegacy && (!response.legacy || !response.legacy.length)) {
response.legacy = response.series.map(v => toLegacyResponseData(v)); response.legacy = response.series.map(v => toLegacyResponseData(v));
} }
if (sendSeries && !response.series.length && response.legacy) { if (sendFrames && !response.series.length && response.legacy) {
response.series = response.legacy.map(v => toDataFrame(v)); response.series = response.legacy.map(v => toDataFrame(v));
} }
return this.validateStreamsAndGetPanelData(); return this.validateStreamsAndGetPanelData();
@ -349,7 +349,7 @@ function translateToLegacyData(data: DataQueryResponseData) {
* *
* This is also used by PanelChrome for snapshot support * This is also used by PanelChrome for snapshot support
*/ */
export function getProcessedDataFrame(results?: any[]): DataFrame[] { export function getProcessedDataFrames(results?: any[]): DataFrame[] {
if (!results) { if (!results) {
return []; return [];
} }

View File

@ -189,7 +189,7 @@ describe('runQueriesBatchEpic', () => {
) )
.whenQueryObserverReceivesEvent({ .whenQueryObserverReceivesEvent({
state: LoadingState.Done, state: LoadingState.Done,
series: null, data: null,
delta, delta,
key: 'some key', key: 'some key',
request: {} as DataQueryRequest, request: {} as DataQueryRequest,

View File

@ -104,8 +104,8 @@ export const runQueriesBatchEpic: Epic<ActionOf<any>, ActionOf<any>, StoreState>
// observer subscription, handles datasourceInstance.query observer events and pushes that forward // observer subscription, handles datasourceInstance.query observer events and pushes that forward
const streamSubscription = streamHandler.subscribe({ const streamSubscription = streamHandler.subscribe({
next: event => { next: event => {
const { state, error, series, delta } = event; const { state, error, data, delta } = event;
if (!series && !delta && !error) { if (!data && !delta && !error) {
return; return;
} }

View File

@ -3,7 +3,7 @@ import { DataQueryResponse, DataQueryResponseData } from '@grafana/ui';
import { TableData, isTableData, LogsModel, toDataFrame, guessFieldTypes, TimeSeries } from '@grafana/data'; import { TableData, isTableData, LogsModel, toDataFrame, guessFieldTypes, TimeSeries } from '@grafana/data';
import { ExploreItemState, ExploreMode } from 'app/types/explore'; import { ExploreItemState, ExploreMode } from 'app/types/explore';
import { getProcessedDataFrame } from 'app/features/dashboard/state/PanelQueryState'; import { getProcessedDataFrames } from 'app/features/dashboard/state/PanelQueryState';
import TableModel, { mergeTablesIntoModel } from 'app/core/table_model'; import TableModel, { mergeTablesIntoModel } from 'app/core/table_model';
import { sortLogsResult } from 'app/core/utils/explore'; import { sortLogsResult } from 'app/core/utils/explore';
import { dataFrameToLogsModel } from 'app/core/logs_model'; import { dataFrameToLogsModel } from 'app/core/logs_model';
@ -101,7 +101,7 @@ export class ResultProcessor {
}; };
private makeTimeSeriesList = (rawData: any[]) => { private makeTimeSeriesList = (rawData: any[]) => {
const dataList = getProcessedDataFrame(rawData); const dataList = getProcessedDataFrames(rawData);
const dataProcessor = new DataProcessor({ xaxis: {}, aliasColors: [] }); // Hack before we use GraphSeriesXY instead const dataProcessor = new DataProcessor({ xaxis: {}, aliasColors: [] }); // Hack before we use GraphSeriesXY instead
const timeSeries = dataProcessor.getSeriesList({ dataList }); const timeSeries = dataProcessor.getSeriesList({ dataList });

View File

@ -158,7 +158,7 @@ class MetricsPanelCtrl extends PanelCtrl {
data: data.legacy, data: data.legacy,
}); });
} else { } else {
this.handleDataFrame(data.series); this.handleDataFrames(data.series);
} }
}, },
}; };
@ -217,7 +217,7 @@ class MetricsPanelCtrl extends PanelCtrl {
}); });
} }
handleDataFrame(data: DataFrame[]) { handleDataFrames(data: DataFrame[]) {
if (this.dashboard && this.dashboard.snapshot) { if (this.dashboard && this.dashboard.snapshot) {
this.panel.snapshotData = data; this.panel.snapshotData = data;
} }

View File

@ -113,7 +113,7 @@ export class StreamWorker {
const maxRows = query.buffer ? query.buffer : stream.request.maxDataPoints; const maxRows = query.buffer ? query.buffer : stream.request.maxDataPoints;
// Edit the first series // Edit the first series
const series = stream.series[0]; const series = stream.data[0];
let rows = series.rows.concat(append); let rows = series.rows.concat(append);
const extra = maxRows - rows.length; const extra = maxRows - rows.length;
if (extra < 0) { if (extra < 0) {
@ -143,7 +143,7 @@ export class SignalWorker extends StreamWorker {
constructor(key: string, query: TestDataQuery, request: DataQueryRequest, observer: DataStreamObserver) { constructor(key: string, query: TestDataQuery, request: DataQueryRequest, observer: DataStreamObserver) {
super(key, query, request, observer); super(key, query, request, observer);
setTimeout(() => { setTimeout(() => {
this.stream.series = [this.initBuffer(query.refId)]; this.stream.data = [this.initBuffer(query.refId)];
this.looper(); this.looper();
}, 10); }, 10);
@ -253,7 +253,7 @@ export class FetchWorker extends StreamWorker {
onHeader = (series: DataFrame) => { onHeader = (series: DataFrame) => {
series.refId = this.refId; series.refId = this.refId;
this.stream.series = [series]; this.stream.data = [series];
}; };
onRow = (row: any[]) => { onRow = (row: any[]) => {
@ -269,7 +269,7 @@ export class LogsWorker extends StreamWorker {
super(key, query, request, observer); super(key, query, request, observer);
window.setTimeout(() => { window.setTimeout(() => {
this.stream.series = [this.initBuffer(query.refId)]; this.stream.data = [this.initBuffer(query.refId)];
this.looper(); this.looper();
}, 10); }, 10);
} }

View File

@ -13,7 +13,7 @@ import config from 'app/core/config';
import TimeSeries from 'app/core/time_series2'; import TimeSeries from 'app/core/time_series2';
import { DataFrame, DataLink } from '@grafana/data'; import { DataFrame, DataLink } from '@grafana/data';
import { getColorFromHexRgbOrName, LegacyResponseData, VariableSuggestion } from '@grafana/ui'; import { getColorFromHexRgbOrName, LegacyResponseData, VariableSuggestion } from '@grafana/ui';
import { getProcessedDataFrame } from 'app/features/dashboard/state/PanelQueryState'; import { getProcessedDataFrames } from 'app/features/dashboard/state/PanelQueryState';
import { PanelQueryRunnerFormat } from 'app/features/dashboard/state/PanelQueryRunner'; import { PanelQueryRunnerFormat } from 'app/features/dashboard/state/PanelQueryRunner';
import { GraphContextMenuCtrl } from './GraphContextMenuCtrl'; import { GraphContextMenuCtrl } from './GraphContextMenuCtrl';
import { getDataLinksVariableSuggestions } from 'app/features/panel/panellinks/link_srv'; import { getDataLinksVariableSuggestions } from 'app/features/panel/panellinks/link_srv';
@ -143,7 +143,7 @@ class GraphCtrl extends MetricsPanelCtrl {
_.defaults(this.panel.xaxis, this.panelDefaults.xaxis); _.defaults(this.panel.xaxis, this.panelDefaults.xaxis);
_.defaults(this.panel.options, this.panelDefaults.options); _.defaults(this.panel.options, this.panelDefaults.options);
this.dataFormat = PanelQueryRunnerFormat.series; this.dataFormat = PanelQueryRunnerFormat.frames;
this.processor = new DataProcessor(this.panel); this.processor = new DataProcessor(this.panel);
this.contextMenuCtrl = new GraphContextMenuCtrl($scope); this.contextMenuCtrl = new GraphContextMenuCtrl($scope);
@ -210,12 +210,12 @@ class GraphCtrl extends MetricsPanelCtrl {
// This should only be called from the snapshot callback // This should only be called from the snapshot callback
onDataReceived(dataList: LegacyResponseData[]) { onDataReceived(dataList: LegacyResponseData[]) {
this.handleDataFrame(getProcessedDataFrame(dataList)); this.handleDataFrames(getProcessedDataFrames(dataList));
} }
// Directly support DataFrame skipping event callbacks // Directly support DataFrame skipping event callbacks
handleDataFrame(data: DataFrame[]) { handleDataFrames(data: DataFrame[]) {
super.handleDataFrame(data); super.handleDataFrames(data);
this.dataList = data; this.dataList = data;
this.seriesList = this.processor.getSeriesList({ this.seriesList = this.processor.getSeriesList({

View File

@ -1,5 +1,5 @@
import { DataProcessor } from '../data_processor'; import { DataProcessor } from '../data_processor';
import { getProcessedDataFrame } from 'app/features/dashboard/state/PanelQueryState'; import { getProcessedDataFrames } from 'app/features/dashboard/state/PanelQueryState';
describe('Graph DataProcessor', () => { describe('Graph DataProcessor', () => {
const panel: any = { const panel: any = {
@ -11,7 +11,7 @@ describe('Graph DataProcessor', () => {
describe('getTimeSeries from LegacyResponseData', () => { describe('getTimeSeries from LegacyResponseData', () => {
// Try each type of data // Try each type of data
const dataList = getProcessedDataFrame([ const dataList = getProcessedDataFrames([
{ {
alias: 'First (time_series)', alias: 'First (time_series)',
datapoints: [[1, 1001], [2, 1002], [3, 1003]], datapoints: [[1, 1001], [2, 1002], [3, 1003]],