diff --git a/public/app/plugins/datasource/elasticsearch/datasource.test.ts b/public/app/plugins/datasource/elasticsearch/datasource.test.ts index d56366a7364..89c64faab0e 100644 --- a/public/app/plugins/datasource/elasticsearch/datasource.test.ts +++ b/public/app/plugins/datasource/elasticsearch/datasource.test.ts @@ -955,28 +955,53 @@ describe('enhanceDataFrame', () => { field: 'urlField', url: 'someUrl', }, + { + field: 'urlField', + url: 'someOtherUrl', + }, { field: 'traceField', url: 'query', - datasourceUid: 'dsUid', + datasourceUid: 'ds1', + }, + { + field: 'traceField', + url: 'otherQuery', + datasourceUid: 'ds2', }, ]); - expect(df.fields[0].config.links!.length).toBe(1); - expect(df.fields[0].config.links![0]).toEqual({ + expect(df.fields[0].config.links).toHaveLength(2); + expect(df.fields[0].config.links).toContainEqual({ title: '', url: 'someUrl', }); - expect(df.fields[1].config.links!.length).toBe(1); - expect(df.fields[1].config.links![0]).toEqual({ + expect(df.fields[0].config.links).toContainEqual({ title: '', - url: '', - internal: { - query: { query: 'query' }, - datasourceName: 'elastic25', - datasourceUid: 'dsUid', - }, + url: 'someOtherUrl', }); + + expect(df.fields[1].config.links).toHaveLength(2); + expect(df.fields[1].config.links).toContainEqual( + expect.objectContaining({ + title: '', + url: '', + internal: expect.objectContaining({ + query: { query: 'query' }, + datasourceUid: 'ds1', + }), + }) + ); + expect(df.fields[1].config.links).toContainEqual( + expect.objectContaining({ + title: '', + url: '', + internal: expect.objectContaining({ + query: { query: 'otherQuery' }, + datasourceUid: 'ds2', + }), + }) + ); }); it('adds limit to dataframe', () => { diff --git a/public/app/plugins/datasource/elasticsearch/datasource.ts b/public/app/plugins/datasource/elasticsearch/datasource.ts index 2dc88f3d344..ea0c5375200 100644 --- a/public/app/plugins/datasource/elasticsearch/datasource.ts +++ b/public/app/plugins/datasource/elasticsearch/datasource.ts @@ -936,8 +936,6 @@ export class ElasticDatasource * Exported for tests. */ export function enhanceDataFrame(dataFrame: DataFrame, dataLinks: DataLinkConfig[], limit?: number) { - const dataSourceSrv = getDataSourceSrv(); - if (limit) { dataFrame.meta = { ...dataFrame.meta, @@ -950,35 +948,37 @@ export function enhanceDataFrame(dataFrame: DataFrame, dataLinks: DataLinkConfig } for (const field of dataFrame.fields) { - const dataLinkConfig = dataLinks.find((dataLink) => field.name && field.name.match(dataLink.field)); + const linksToApply = dataLinks.filter((dataLink) => new RegExp(dataLink.field).test(field.name)); - if (!dataLinkConfig) { + if (linksToApply.length === 0) { continue; } - let link: DataLink; - - if (dataLinkConfig.datasourceUid) { - const dsSettings = dataSourceSrv.getInstanceSettings(dataLinkConfig.datasourceUid); - - link = { - title: dataLinkConfig.urlDisplayLabel || '', - url: '', - internal: { - query: { query: dataLinkConfig.url }, - datasourceUid: dataLinkConfig.datasourceUid, - datasourceName: dsSettings?.name ?? 'Data source not found', - }, - }; - } else { - link = { - title: dataLinkConfig.urlDisplayLabel || '', - url: dataLinkConfig.url, - }; - } - field.config = field.config || {}; - field.config.links = [...(field.config.links || []), link]; + field.config.links = [...(field.config.links || [], linksToApply.map(generateDataLink))]; + } +} + +function generateDataLink(linkConfig: DataLinkConfig): DataLink { + const dataSourceSrv = getDataSourceSrv(); + + if (linkConfig.datasourceUid) { + const dsSettings = dataSourceSrv.getInstanceSettings(linkConfig.datasourceUid); + + return { + title: linkConfig.urlDisplayLabel || '', + url: '', + internal: { + query: { query: linkConfig.url }, + datasourceUid: linkConfig.datasourceUid, + datasourceName: dsSettings?.name ?? 'Data source not found', + }, + }; + } else { + return { + title: linkConfig.urlDisplayLabel || '', + url: linkConfig.url, + }; } }