Files
grafana/public/app/plugins/datasource/testdata/query_ctrl.ts

120 lines
3.3 KiB
TypeScript
Raw Normal View History

2017-12-20 12:33:33 +01:00
import _ from 'lodash';
import { dateMath, dateTime } from '@grafana/data';
import { e2e } from '@grafana/e2e';
2017-12-20 12:33:33 +01:00
import { QueryCtrl } from 'app/plugins/sdk';
QueryProcessing: Observable query interface and RxJS for query & stream processing (#18899) * I needed to learn some rxjs and understand this more, so just playing around * Updated * Removed all the complete calls * Refactoring * StreamHandler -> observable start * progress * simple singal works * Handle update time range * added error handling * wrap old function * minor changes * handle data format in the subscribe function * Use replay subject to return last value to subscribers * Set loading state after no response in 50ms * added missing file * updated comment * Added cancelation of network requests * runRequest: Added unit test scenario framework * Progress on tests * minor refactor of unit tests * updated test * removed some old code * Shared queries work again, and also became so much simplier * unified query and observe methods * implict any fix * Fixed closed subject issue * removed comment * Use last returned data for loading state * WIP: Explore to runRequest makover step1 * Minor progress * Minor progress on explore and runRequest * minor progress * Things are starting to work in explore * Updated prometheus to use new observable query response, greatly simplified code * Revert refId change * Found better solution for key/refId/requestId problem * use observable with loki * tests compile * fix loki query prep * Explore: correct first response handling * Refactorings * Refactoring * Explore: Fixes LoadingState and GraphResults between runs (#18986) * Refactor: Adds state to DataQueryResponse * Fix: Fixes so we do not empty results before new data arrives Fixes: #17409 * Transformations work * observable test data * remove single() from loki promise * Fixed comment * Explore: Fixes failing Loki and Prometheus unit tests (#18995) * Tests: Makes datasource tests work again * Fix: Fixes loki datasource so highligthing works * Chore: Runs Prettier * Fixed query runner tests * Delay loading state indication to 200ms * Fixed test * fixed unit tests * Clear cached calcs * Fixed bug getProcesedDataFrames * Fix the correct test is a better idea * Fix: Fixes so queries in Explore are only run if Graph/Table is shown (#19000) * Fix: Fixes so queries in Explore are only run if Graph/Table is shown Fixes: #18618 * Refactor: Removes unnecessary condition * PanelData: provide legacy data only when needed (#19018) * no legacy * invert logic... now compiles * merge getQueryResponseData and getDataRaw * update comment about query editor * use single getData() function * only send legacy when it is used in explore * pre process rather than post process * pre process rather than post process * Minor refactoring * Add missing tags to test datasource response * MixedDatasource: Adds query observable pattern to MixedDatasource (#19037) * start mixed datasource * Refactor: Refactors into observable parttern * Tests: Fixes tests * Tests: Removes console.log * Refactor: Adds unique requestId
2019-09-12 17:28:46 +02:00
import { defaultQuery } from './runStreams';
import { getBackendSrv } from 'app/core/services/backend_srv';
2016-09-27 14:39:51 +02:00
export const defaultPulse: any = {
timeStep: 60,
onCount: 3,
onValue: 2,
offCount: 3,
offValue: 1,
};
export const defaultCSVWave: any = {
timeStep: 60,
valuesCSV: '0,0,2,2,1,1',
};
const showLabelsFor = ['random_walk', 'predictable_pulse', 'predictable_csv_wave'];
2016-09-27 14:39:51 +02:00
export class TestDataQueryCtrl extends QueryCtrl {
2017-12-20 12:33:33 +01:00
static templateUrl = 'partials/query.editor.html';
2016-09-27 14:39:51 +02:00
scenarioList: any;
scenario: any;
newPointValue: number;
newPointTime: any;
selectedPoint: any;
2016-09-27 14:39:51 +02:00
showLabels = false;
selectors: typeof e2e.pages.Dashboard.Panels.DataSource.TestData.QueryTab.selectors;
/** @ngInject */
constructor($scope: any, $injector: any) {
2016-09-27 14:39:51 +02:00
super($scope, $injector);
2017-12-20 12:33:33 +01:00
this.target.scenarioId = this.target.scenarioId || 'random_walk';
this.scenarioList = [];
this.newPointTime = dateTime();
2017-12-20 12:33:33 +01:00
this.selectedPoint = { text: 'Select point', value: null };
this.showLabels = showLabelsFor.includes(this.target.scenarioId);
this.selectors = e2e.pages.Dashboard.Panels.DataSource.TestData.QueryTab.selectors;
}
getPoints() {
return _.map(this.target.points, (point, index) => {
return {
text: dateTime(point[1]).format('MMMM Do YYYY, H:mm:ss') + ' : ' + point[0],
2017-12-20 12:33:33 +01:00
value: index,
};
});
}
pointSelected(option: any) {
this.selectedPoint = option;
}
deletePoint() {
this.target.points.splice(this.selectedPoint.value, 1);
2017-12-20 12:33:33 +01:00
this.selectedPoint = { text: 'Select point', value: null };
this.refresh();
}
addPoint() {
this.target.points = this.target.points || [];
this.newPointTime = dateMath.parse(this.newPointTime);
this.target.points.push([this.newPointValue, this.newPointTime.valueOf()]);
this.target.points = _.sortBy(this.target.points, p => p[1]);
this.refresh();
}
2016-09-27 14:39:51 +02:00
$onInit() {
return getBackendSrv()
.get('/api/tsdb/testdata/scenarios')
.then((res: any) => {
this.scenarioList = res;
this.scenario = _.find(this.scenarioList, { id: this.target.scenarioId });
});
2016-09-27 14:39:51 +02:00
}
scenarioChanged() {
this.scenario = _.find(this.scenarioList, { id: this.target.scenarioId });
this.target.stringInput = this.scenario.stringInput;
this.showLabels = showLabelsFor.includes(this.target.scenarioId);
2017-12-20 12:33:33 +01:00
if (this.target.scenarioId === 'manual_entry') {
this.target.points = this.target.points || [];
} else {
delete this.target.points;
}
if (this.target.scenarioId === 'streaming_client') {
this.target.stream = _.defaults(this.target.stream || {}, defaultQuery);
} else {
delete this.target.stream;
}
if (this.target.scenarioId === 'predictable_pulse') {
this.target.pulseWave = _.defaults(this.target.pulseWave || {}, defaultPulse);
} else {
delete this.target.pulseWave;
}
if (this.target.scenarioId === 'predictable_csv_wave') {
this.target.csvWave = _.defaults(this.target.csvWave || {}, defaultCSVWave);
} else {
delete this.target.csvWave;
}
this.refresh();
}
streamChanged() {
this.refresh();
}
2016-09-27 14:39:51 +02:00
}