mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Elastic: Replace range as number not string (#22173)
This commit is contained in:
parent
e60b124001
commit
9c55500cc0
@ -1,5 +1,5 @@
|
||||
import angular from 'angular';
|
||||
import { dateMath, Field } from '@grafana/data';
|
||||
import { CoreApp, DataQueryRequest, dateMath, Field } from '@grafana/data';
|
||||
import _ from 'lodash';
|
||||
import { ElasticDatasource } from './datasource';
|
||||
import { toUtc, dateTime } from '@grafana/data';
|
||||
@ -7,7 +7,7 @@ import { backendSrv } from 'app/core/services/backend_srv'; // will use the vers
|
||||
import { TimeSrv } from 'app/features/dashboard/services/TimeSrv';
|
||||
import { TemplateSrv } from 'app/features/templating/template_srv';
|
||||
import { DataSourceInstanceSettings } from '@grafana/data';
|
||||
import { ElasticsearchOptions } from './types';
|
||||
import { ElasticsearchOptions, ElasticsearchQuery } from './types';
|
||||
|
||||
jest.mock('@grafana/runtime', () => ({
|
||||
...jest.requireActual('@grafana/runtime'),
|
||||
@ -613,8 +613,57 @@ describe('ElasticDatasource', function(this: any) {
|
||||
expect(body['aggs']['1']['terms'].size).not.toBe(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe('query', () => {
|
||||
it('should replace range as integer not string', () => {
|
||||
const dataSource = new ElasticDatasource(
|
||||
{
|
||||
url: 'http://es.com',
|
||||
database: '[asd-]YYYY.MM.DD',
|
||||
jsonData: {
|
||||
interval: 'Daily',
|
||||
esVersion: 2,
|
||||
timeField: '@time',
|
||||
},
|
||||
} as DataSourceInstanceSettings<ElasticsearchOptions>,
|
||||
templateSrv as TemplateSrv,
|
||||
timeSrv as TimeSrv
|
||||
);
|
||||
(dataSource as any).post = jest.fn(() => Promise.resolve({ responses: [] }));
|
||||
dataSource.query(createElasticQuery());
|
||||
|
||||
const query = ((dataSource as any).post as jest.Mock).mock.calls[0][1];
|
||||
expect(typeof JSON.parse(query.split('\n')[1]).query.bool.filter[0].range['@time'].gte).toBe('number');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
const createElasticQuery = (): DataQueryRequest<ElasticsearchQuery> => {
|
||||
return {
|
||||
requestId: '',
|
||||
dashboardId: 0,
|
||||
interval: '',
|
||||
panelId: 0,
|
||||
scopedVars: {},
|
||||
timezone: '',
|
||||
app: CoreApp.Dashboard,
|
||||
startTime: 0,
|
||||
range: {
|
||||
from: dateTime([2015, 4, 30, 10]),
|
||||
to: dateTime([2015, 5, 1, 10]),
|
||||
} as any,
|
||||
targets: [
|
||||
{
|
||||
refId: '',
|
||||
isLogsQuery: false,
|
||||
bucketAggs: [{ type: 'date_histogram', field: '@timestamp', id: '2' }],
|
||||
metrics: [{ type: 'count', id: '' }],
|
||||
query: 'test',
|
||||
},
|
||||
],
|
||||
};
|
||||
};
|
||||
|
||||
const logsResponse = {
|
||||
data: {
|
||||
responses: [
|
||||
|
@ -368,8 +368,12 @@ export class ElasticDatasource extends DataSourceApi<ElasticsearchQuery, Elastic
|
||||
return Promise.resolve({ data: [] });
|
||||
}
|
||||
|
||||
payload = payload.replace(/\$timeFrom/g, options.range.from.valueOf().toString());
|
||||
payload = payload.replace(/\$timeTo/g, options.range.to.valueOf().toString());
|
||||
// We replace the range here for actual values. We need to replace it together with enclosing "" so that we replace
|
||||
// it as an integer not as string with digits. This is because elastic will convert the string only if the time
|
||||
// field is specified as type date (which probably should) but can also be specified as integer (millisecond epoch)
|
||||
// and then sending string will error out.
|
||||
payload = payload.replace(/"\$timeFrom"/g, options.range.from.valueOf().toString());
|
||||
payload = payload.replace(/"\$timeTo"/g, options.range.to.valueOf().toString());
|
||||
payload = this.templateSrv.replace(payload, options.scopedVars);
|
||||
|
||||
const url = this.getMultiSearchUrl();
|
||||
|
Loading…
Reference in New Issue
Block a user