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

130 lines
3.4 KiB
TypeScript
Raw Normal View History

2017-12-20 12:33:33 +01:00
import _ from 'lodash';
import {
DataSourceApi,
DataQueryRequest,
TableData,
TimeSeries,
DataSourceInstanceSettings,
DataStreamObserver,
} from '@grafana/ui';
2019-01-18 19:11:30 +01:00
import { TestDataQuery, Scenario } from './types';
import { getBackendSrv } from 'app/core/services/backend_srv';
import { StreamHandler } from './StreamHandler';
2016-09-27 14:39:51 +02:00
2019-03-20 12:50:58 -07:00
type TestData = TimeSeries | TableData;
export interface TestDataRegistry {
[key: string]: TestData[];
}
2019-01-18 17:19:35 +01:00
export class TestDataDatasource implements DataSourceApi<TestDataQuery> {
id: number;
streams = new StreamHandler();
2016-09-27 14:39:51 +02:00
/** @ngInject */
constructor(instanceSettings: DataSourceInstanceSettings) {
2017-03-29 22:54:07 +02:00
this.id = instanceSettings.id;
}
2016-09-27 14:39:51 +02:00
query(options: DataQueryRequest<TestDataQuery>, observer: DataStreamObserver) {
const queries = options.targets.map(item => {
return {
refId: item.refId,
scenarioId: item.scenarioId,
intervalMs: options.intervalMs,
maxDataPoints: options.maxDataPoints,
stringInput: item.stringInput,
points: item.points,
alias: item.alias,
2017-12-20 12:33:33 +01:00
datasourceId: this.id,
};
2016-09-27 14:39:51 +02:00
});
if (queries.length === 0) {
return Promise.resolve({ data: [] });
2016-09-27 14:39:51 +02:00
}
// Currently we do not support mixed with client only streaming
const resp = this.streams.process(options, observer);
if (resp) {
return Promise.resolve(resp);
}
return getBackendSrv()
.datasourceRequest({
method: 'POST',
url: '/api/tsdb/query',
data: {
from: options.range.from.valueOf().toString(),
to: options.range.to.valueOf().toString(),
queries: queries,
},
// This sets up a cancel token
requestId: options.requestId,
})
.then((res: any) => {
2019-03-20 12:50:58 -07:00
const data: TestData[] = [];
2019-03-20 14:50:46 -07:00
// Returns data in the order it was asked for.
// if the response has data with different refId, it is ignored
for (const query of queries) {
2019-03-20 14:50:46 -07:00
const results = res.data.results[query.refId];
if (!results) {
2019-03-20 14:50:46 -07:00
console.warn('No Results for:', query);
continue;
}
for (const t of results.tables || []) {
const table = t as TableData;
table.refId = query.refId;
data.push(table);
}
for (const series of results.series || []) {
data.push({ target: series.name, datapoints: series.points, refId: query.refId });
2019-03-20 14:50:46 -07:00
}
}
return { data: data };
});
2016-09-27 14:39:51 +02:00
}
annotationQuery(options: any) {
let timeWalker = options.range.from.valueOf();
const to = options.range.to.valueOf();
const events = [];
const eventCount = 10;
const step = (to - timeWalker) / eventCount;
for (let i = 0; i < eventCount; i++) {
events.push({
annotation: options.annotation,
time: timeWalker,
text: 'This is the text, <a href="https://grafana.com">Grafana.com</a>',
tags: ['text', 'server'],
});
timeWalker += step;
}
return Promise.resolve(events);
2016-09-27 14:39:51 +02:00
}
getQueryDisplayText(query: TestDataQuery) {
if (query.alias) {
return query.scenarioId + ' as ' + query.alias;
}
return query.scenarioId;
}
testDatasource() {
return Promise.resolve({
status: 'success',
message: 'Data source is working',
});
}
2019-01-18 19:11:30 +01:00
getScenarios(): Promise<Scenario[]> {
return getBackendSrv().get('/api/tsdb/testdata/scenarios');
2019-01-18 19:11:30 +01:00
}
2016-09-27 14:39:51 +02:00
}