diff --git a/public/app/plugins/datasource/influxdb/datasource.ts b/public/app/plugins/datasource/influxdb/datasource.ts index 22e501696d8..78467ba3a0f 100644 --- a/public/app/plugins/datasource/influxdb/datasource.ts +++ b/public/app/plugins/datasource/influxdb/datasource.ts @@ -296,12 +296,7 @@ export default class InfluxDatasource extends DataSourceWithBackend { - if (rsp.data?.length) { - return frameToMetricFindValue(rsp.data[0]); - } - return []; - }); + ).then(this.toMetricFindValue); } async metricFindQuery(query: string, options?: any): Promise { @@ -316,12 +311,7 @@ export default class InfluxDatasource extends DataSourceWithBackend { - if (rsp.data?.length) { - return frameToMetricFindValue(rsp.data[0]); - } - return []; - }); + ).then(this.toMetricFindValue); } const interpolated = this.templateSrv.replace(query, options?.scopedVars, this.interpolateQueryExpr); @@ -331,6 +321,14 @@ export default class InfluxDatasource extends DataSourceWithBackend frameToMetricFindValue(d)).flat(); + // Filter out duplicate elements + return values.filter((elm, idx, self) => idx === self.findIndex((t) => t.text === elm.text)); + } + // By implementing getTagKeys and getTagValues we add ad-hoc filters functionality // Used in public/app/features/variables/adhoc/picker/AdHocFilterKey.tsx::fetchFilterKeys getTagKeys(options?: DataSourceGetTagKeysOptions) { diff --git a/public/app/plugins/datasource/influxdb/datasource_backend_mode.test.ts b/public/app/plugins/datasource/influxdb/datasource_backend_mode.test.ts index c1e5d5f0b64..608c1109c95 100644 --- a/public/app/plugins/datasource/influxdb/datasource_backend_mode.test.ts +++ b/public/app/plugins/datasource/influxdb/datasource_backend_mode.test.ts @@ -283,4 +283,67 @@ describe('InfluxDataSource Backend Mode', () => { expect(qData).toBe(qe); }); }); + + describe('metric find query', () => { + let ds = getMockInfluxDS(getMockDSInstanceSettings()); + it('handles multiple frames', async () => { + const fetchMockImpl = () => { + return of(mockMetricFindQueryResponse); + }; + + fetchMock.mockImplementation(fetchMockImpl); + const values = await ds.getTagValues({ key: 'test_id', filters: [] }); + expect(fetchMock).toHaveBeenCalled(); + expect(values.length).toBe(5); + expect(values[0].text).toBe('test-t2-1'); + }); + }); }); + +const mockMetricFindQueryResponse = { + data: { + results: { + metricFindQuery: { + status: 200, + frames: [ + { + schema: { + name: 'NoneNone', + refId: 'metricFindQuery', + fields: [ + { + name: 'Value', + type: 'string', + typeInfo: { + frame: 'string', + }, + }, + ], + }, + data: { + values: [['test-t2-1', 'test-t2-10']], + }, + }, + { + schema: { + name: 'some-other', + refId: 'metricFindQuery', + fields: [ + { + name: 'Value', + type: 'string', + typeInfo: { + frame: 'string', + }, + }, + ], + }, + data: { + values: [['test-t2-1', 'test-t2-10', 'test-t2-2', 'test-t2-3', 'test-t2-4']], + }, + }, + ], + }, + }, + }, +};