Loki: Support X-ray as internal link in derived fields (#75756)

Update Loki datasource to support X-ray as internal link in derived fields
This commit is contained in:
harshabaddam 2023-10-04 13:59:46 +01:00 committed by GitHub
parent 9813d17e93
commit 65fa94b16b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 59 additions and 3 deletions

View File

@ -7,7 +7,13 @@ jest.mock('@grafana/runtime', () => ({
...jest.requireActual('@grafana/runtime'),
getDataSourceSrv: () => {
return {
getInstanceSettings: () => {
getInstanceSettings: (datasourceUid?: string) => {
switch (datasourceUid) {
case 'tempo-datasource-uid':
return { name: 'Tempo', type: 'tempo' };
case 'xray-datasource-uid':
return { name: 'X-ray', type: 'grafana-x-ray-datasource' };
}
return { name: 'Loki1' };
},
};
@ -36,8 +42,22 @@ describe('getDerivedFields', () => {
datasourceUid: 'uid2',
urlDisplayLabel: 'Custom Label',
},
{
matcherRegex: 'trace=(\\w+)',
name: 'tempoTraceId',
url: 'test',
datasourceUid: 'tempo-datasource-uid',
urlDisplayLabel: 'Tempo',
},
{
matcherRegex: 'trace=(\\w+)',
name: 'xrayTraceId',
url: 'test',
datasourceUid: 'xray-datasource-uid',
urlDisplayLabel: 'AWS X-ray',
},
]);
expect(newFields.length).toBe(2);
expect(newFields.length).toBe(4);
const trace1 = newFields.find((f) => f.name === 'trace1');
expect(trace1!.values).toEqual([null, '1234', null]);
expect(trace1!.config.links![0]).toEqual({
@ -58,5 +78,31 @@ describe('getDerivedFields', () => {
internal: { datasourceName: 'Loki1', datasourceUid: 'uid2', query: { query: 'test' } },
url: '',
});
const tempoTraceId = newFields.find((f) => f.name === 'tempoTraceId');
expect(tempoTraceId!.values).toEqual([null, null, null]);
expect(tempoTraceId!.config.links!.length).toBe(1);
expect(tempoTraceId!.config.links![0]).toEqual({
title: 'Tempo',
internal: {
datasourceName: 'Tempo',
datasourceUid: 'tempo-datasource-uid',
query: { query: 'test', queryType: 'traceql' },
},
url: '',
});
const xrayTraceId = newFields.find((f) => f.name === 'xrayTraceId');
expect(xrayTraceId!.values).toEqual([null, null, null]);
expect(xrayTraceId!.config.links!.length).toBe(1);
expect(xrayTraceId!.config.links![0]).toEqual({
title: 'AWS X-ray',
internal: {
datasourceName: 'X-ray',
datasourceUid: 'xray-datasource-uid',
query: { query: 'test', queryType: 'getTrace' },
},
url: '',
});
});
});

View File

@ -42,6 +42,16 @@ function fieldFromDerivedFieldConfig(derivedFieldConfigs: DerivedFieldConfig[]):
// Having field.datasourceUid means it is an internal link.
if (derivedFieldConfig.datasourceUid) {
const dsSettings = dataSourceSrv.getInstanceSettings(derivedFieldConfig.datasourceUid);
const queryType = (type: string | undefined): string | undefined => {
switch (type) {
case 'tempo':
return 'traceql';
case 'grafana-x-ray-datasource':
return 'getTrace';
default:
return undefined;
}
};
acc.push({
// Will be filled out later
@ -49,7 +59,7 @@ function fieldFromDerivedFieldConfig(derivedFieldConfigs: DerivedFieldConfig[]):
url: '',
// This is hardcoded for Jaeger or Zipkin not way right now to specify datasource specific query object
internal: {
query: { query: derivedFieldConfig.url, queryType: dsSettings?.type === 'tempo' ? 'traceql' : undefined },
query: { query: derivedFieldConfig.url, queryType: queryType(dsSettings?.type) },
datasourceUid: derivedFieldConfig.datasourceUid,
datasourceName: dsSettings?.name ?? 'Data source not found',
},