mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Elasticsearch: Fix adhoc filters with number fields (#99514)
This commit is contained in:
parent
53cc790180
commit
49f8359ce5
@ -5,6 +5,8 @@
|
||||
- "discovery.type=single-node"
|
||||
- "xpack.license.self_generated.type=basic"
|
||||
- "xpack.security.enabled=false"
|
||||
- 'ES_JAVA_OPTS=-XX:UseSVE=0'
|
||||
- 'CLI_JAVA_OPTS=-XX:UseSVE=0'
|
||||
ports:
|
||||
- 9200:9200
|
||||
|
||||
|
@ -121,6 +121,48 @@ describe('ElasticDatasource', () => {
|
||||
expect(gte).toBe('1663740610000'); // 2022-09-21T06:10:10Z
|
||||
expect(lte).toBe('1663999821000'); // 2022-09-24T06:10:21Z
|
||||
});
|
||||
|
||||
it('should return fields properly', async () => {
|
||||
const ds = createElasticDatasource({ jsonData: { timeField: '@timestamp' } });
|
||||
const getTagValuesData = {
|
||||
responses: [
|
||||
{
|
||||
aggregations: {
|
||||
'1': {
|
||||
buckets: [
|
||||
{
|
||||
doc_count: 10,
|
||||
key: 'foo',
|
||||
},
|
||||
{
|
||||
doc_count: 20,
|
||||
key: 6,
|
||||
key_as_string: 'six',
|
||||
},
|
||||
{
|
||||
doc_count: 30,
|
||||
key: 7,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
const postResource = jest.spyOn(ds, 'postResourceRequest').mockResolvedValue(getTagValuesData);
|
||||
const values = await ds.getTagValues({ key: 'test', timeRange: timeRangeMock, filters: [] });
|
||||
expect(postResource).toHaveBeenCalledTimes(1);
|
||||
|
||||
expect(values.length).toBe(3);
|
||||
expect(values[0].text).toBe('foo');
|
||||
expect(values[0].value).toBe('foo');
|
||||
|
||||
expect(values[1].text).toBe('six');
|
||||
expect(values[1].value).toBe('6');
|
||||
|
||||
expect(values[2].text).toBe('7');
|
||||
expect(values[2].value).toBe('7');
|
||||
});
|
||||
});
|
||||
|
||||
describe('query', () => {
|
||||
@ -1078,6 +1120,10 @@ describe('ElasticDatasource', () => {
|
||||
key: 'test2',
|
||||
key_as_string: 'test2_as_string',
|
||||
},
|
||||
{
|
||||
doc_count: 2,
|
||||
key: 5,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
@ -1102,13 +1148,14 @@ describe('ElasticDatasource', () => {
|
||||
|
||||
it('should get results', async () => {
|
||||
const { results } = await runScenario();
|
||||
expect(results.length).toEqual(2);
|
||||
expect(results.length).toEqual(3);
|
||||
});
|
||||
|
||||
it('should use key or key_as_string', async () => {
|
||||
it('should use key, key_as_string, or cast key to string', async () => {
|
||||
const { results } = await runScenario();
|
||||
expect(results[0].text).toEqual('test');
|
||||
expect(results[1].text).toEqual('test2_as_string');
|
||||
expect(results[2].text).toEqual('5');
|
||||
});
|
||||
|
||||
it('should not set search type to count', async () => {
|
||||
|
@ -897,7 +897,11 @@ export class ElasticDatasource
|
||||
* Get values for a given field.
|
||||
* Used for example in getTagValues.
|
||||
*/
|
||||
getTerms(queryDef: TermsQuery, range = getDefaultTimeRange()): Observable<MetricFindValue[]> {
|
||||
getTerms(
|
||||
queryDef: TermsQuery,
|
||||
range = getDefaultTimeRange(),
|
||||
isTagValueQuery = false
|
||||
): Observable<MetricFindValue[]> {
|
||||
const searchType = 'query_then_fetch';
|
||||
const header = this.getQueryHeader(searchType, range.from, range.to);
|
||||
let esQuery = JSON.stringify(this.queryBuilder.getTermsQuery(queryDef));
|
||||
@ -919,9 +923,10 @@ export class ElasticDatasource
|
||||
|
||||
const buckets = res.responses[0].aggregations['1'].buckets;
|
||||
return _map(buckets, (bucket) => {
|
||||
const keyString = String(bucket.key);
|
||||
return {
|
||||
text: bucket.key_as_string || bucket.key,
|
||||
value: bucket.key,
|
||||
text: bucket.key_as_string || keyString,
|
||||
value: isTagValueQuery ? keyString : bucket.key,
|
||||
};
|
||||
});
|
||||
})
|
||||
@ -979,7 +984,7 @@ export class ElasticDatasource
|
||||
* @returns A Promise that resolves to an array of label values represented as MetricFindValue objects
|
||||
*/
|
||||
getTagValues(options: DataSourceGetTagValuesOptions<ElasticsearchQuery>) {
|
||||
return lastValueFrom(this.getTerms({ field: options.key }, options.timeRange));
|
||||
return lastValueFrom(this.getTerms({ field: options.key }, options.timeRange, true));
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user