mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* WIP: Initial hardcoded version * Feature: Introduces SearchFiltering to Graphite * Feature: Adds searchFiltering to MySql * Tests: Adds tests to Graphite and MySql * Feature: Adds $__searchFilter to TestData * Refactor: Adds searchFilter to Postgres and extracts function * Tests: Adds tests to variable * Refactor: Adds debounce and lodash import optimization * Docs: Adds documentation * Refactor: Removes unused function and fixes typo * Docs: Updates docs * Fixed issue with UI not updating when no was used due to async func and no .apply in the non lazy path
138 lines
4.0 KiB
TypeScript
138 lines
4.0 KiB
TypeScript
import {
|
|
DataQueryRequest,
|
|
DataQueryResponse,
|
|
DataSourceApi,
|
|
DataSourceInstanceSettings,
|
|
MetricFindValue,
|
|
} from '@grafana/ui';
|
|
import { TableData, TimeSeries } from '@grafana/data';
|
|
import { Scenario, TestDataQuery } from './types';
|
|
import { getBackendSrv } from 'app/core/services/backend_srv';
|
|
import { queryMetricTree } from './metricTree';
|
|
import { from, merge, Observable } from 'rxjs';
|
|
import { runStream } from './runStreams';
|
|
import templateSrv from 'app/features/templating/template_srv';
|
|
import { interpolateSearchFilter } from '../../../features/templating/variable';
|
|
|
|
type TestData = TimeSeries | TableData;
|
|
|
|
export class TestDataDataSource extends DataSourceApi<TestDataQuery> {
|
|
constructor(instanceSettings: DataSourceInstanceSettings) {
|
|
super(instanceSettings);
|
|
}
|
|
|
|
query(options: DataQueryRequest<TestDataQuery>): Observable<DataQueryResponse> {
|
|
const queries: any[] = [];
|
|
const streams: Array<Observable<DataQueryResponse>> = [];
|
|
|
|
// Start streams and prepare queries
|
|
for (const target of options.targets) {
|
|
if (target.scenarioId === 'streaming_client') {
|
|
streams.push(runStream(target, options));
|
|
} else {
|
|
queries.push({
|
|
...target,
|
|
intervalMs: options.intervalMs,
|
|
maxDataPoints: options.maxDataPoints,
|
|
datasourceId: this.id,
|
|
alias: templateSrv.replace(target.alias || ''),
|
|
});
|
|
}
|
|
}
|
|
|
|
if (queries.length) {
|
|
const req: Promise<DataQueryResponse> = 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) => this.processQueryResult(queries, res));
|
|
|
|
streams.push(from(req));
|
|
}
|
|
|
|
return merge(...streams);
|
|
}
|
|
|
|
processQueryResult(queries: any, res: any): DataQueryResponse {
|
|
const data: TestData[] = [];
|
|
|
|
for (const query of queries) {
|
|
const results = res.data.results[query.refId];
|
|
|
|
for (const t of results.tables || []) {
|
|
const table = t as TableData;
|
|
table.refId = query.refId;
|
|
table.name = query.alias;
|
|
data.push(table);
|
|
}
|
|
|
|
for (const series of results.series || []) {
|
|
data.push({ target: series.name, datapoints: series.points, refId: query.refId, tags: series.tags });
|
|
}
|
|
}
|
|
|
|
return { data };
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
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',
|
|
});
|
|
}
|
|
|
|
getScenarios(): Promise<Scenario[]> {
|
|
return getBackendSrv().get('/api/tsdb/testdata/scenarios');
|
|
}
|
|
|
|
metricFindQuery(query: string, options: any) {
|
|
return new Promise<MetricFindValue[]>((resolve, reject) => {
|
|
setTimeout(() => {
|
|
const interpolatedQuery = interpolateSearchFilter({
|
|
query: templateSrv.replace(query),
|
|
options,
|
|
wildcardChar: '*',
|
|
quoteLiteral: false,
|
|
});
|
|
const children = queryMetricTree(interpolatedQuery);
|
|
const items = children.map(item => ({ value: item.name, text: item.name }));
|
|
resolve(items);
|
|
}, 100);
|
|
});
|
|
}
|
|
}
|