mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
loki: use metadataRequest in testDatasource (#48431)
This commit is contained in:
parent
46b40b6e82
commit
60cabaea0a
@ -534,74 +534,56 @@ describe('LokiDatasource', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('when performing testDataSource', () => {
|
describe('when performing testDataSource', () => {
|
||||||
describe('and call succeeds', () => {
|
it('should return successfully when call succeeds with labels', async () => {
|
||||||
it('should return successfully', async () => {
|
const ds = createLokiDSForTests({} as TemplateSrv);
|
||||||
fetchMock.mockImplementation(() => of(createFetchResponse({ values: ['avalue'] })));
|
ds.metadataRequest = () => Promise.resolve(['avalue']);
|
||||||
const ds = createLokiDSForTests({} as TemplateSrv);
|
|
||||||
|
|
||||||
const result = await ds.testDatasource();
|
const result = await ds.testDatasource();
|
||||||
|
|
||||||
expect(result.status).toBe('success');
|
expect(result).toStrictEqual({
|
||||||
|
status: 'success',
|
||||||
|
message: 'Data source connected and labels found.',
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('and call fails with 401 error', () => {
|
it('should return error when call succeeds without labels', async () => {
|
||||||
it('should return error status and a detailed error message', async () => {
|
const ds = createLokiDSForTests({} as TemplateSrv);
|
||||||
fetchMock.mockImplementation(() =>
|
ds.metadataRequest = () => Promise.resolve([]);
|
||||||
throwError({
|
|
||||||
statusText: 'Unauthorized',
|
|
||||||
status: 401,
|
|
||||||
data: {
|
|
||||||
message: 'Unauthorized',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
);
|
|
||||||
const ds = createLokiDSForTests({} as TemplateSrv);
|
|
||||||
|
|
||||||
const result = await ds.testDatasource();
|
const result = await ds.testDatasource();
|
||||||
|
|
||||||
expect(result.status).toEqual('error');
|
expect(result).toStrictEqual({
|
||||||
expect(result.message).toBe('Loki: Unauthorized. 401. Unauthorized');
|
status: 'error',
|
||||||
|
message: 'Data source connected, but no labels received. Verify that Loki and Promtail is configured properly.',
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('and call fails with 404 error', () => {
|
it('should return error status with no details when call fails with no details', async () => {
|
||||||
it('should return error status and a detailed error message', async () => {
|
const ds = createLokiDSForTests({} as TemplateSrv);
|
||||||
fetchMock.mockImplementation(() =>
|
ds.metadataRequest = () => Promise.reject({});
|
||||||
throwError({
|
|
||||||
statusText: 'Not found',
|
|
||||||
status: 404,
|
|
||||||
data: {
|
|
||||||
message: '404 page not found',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
const ds = createLokiDSForTests({} as TemplateSrv);
|
const result = await ds.testDatasource();
|
||||||
|
|
||||||
const result = await ds.testDatasource();
|
expect(result).toStrictEqual({
|
||||||
|
status: 'error',
|
||||||
expect(result.status).toEqual('error');
|
message: 'Unable to fetch labels from Loki, please check the server logs for more details',
|
||||||
expect(result.message).toBe('Loki: Not found. 404. 404 page not found');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('and call fails with 502 error', () => {
|
it('should return error status with details when call fails with details', async () => {
|
||||||
it('should return error status and a detailed error message', async () => {
|
const ds = createLokiDSForTests({} as TemplateSrv);
|
||||||
fetchMock.mockImplementation(() =>
|
ds.metadataRequest = () =>
|
||||||
throwError({
|
Promise.reject({
|
||||||
statusText: 'Bad Gateway',
|
data: {
|
||||||
status: 502,
|
message: 'error42',
|
||||||
data: '',
|
},
|
||||||
})
|
});
|
||||||
);
|
|
||||||
|
|
||||||
const ds = createLokiDSForTests({} as TemplateSrv);
|
const result = await ds.testDatasource();
|
||||||
|
|
||||||
const result = await ds.testDatasource();
|
expect(result).toStrictEqual({
|
||||||
|
status: 'error',
|
||||||
expect(result.status).toEqual('error');
|
message: 'Unable to fetch labels from Loki (error42), please check the server logs for more details',
|
||||||
expect(result.message).toBe('Loki: Bad Gateway. 502');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -689,44 +689,35 @@ export class LokiDatasource
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
testDatasource() {
|
testDatasource(): Promise<{ status: string; message: string }> {
|
||||||
// Consider only last 10 minutes otherwise request takes too long
|
// Consider only last 10 minutes otherwise request takes too long
|
||||||
const startMs = Date.now() - 10 * 60 * 1000;
|
const nowMs = Date.now();
|
||||||
const start = `${startMs}000000`; // API expects nanoseconds
|
const params = {
|
||||||
return lastValueFrom(
|
start: (nowMs - 10 * 60 * 1000) * NS_IN_MS,
|
||||||
this._request(`${LOKI_ENDPOINT}/label`, { start }).pipe(
|
end: nowMs * NS_IN_MS,
|
||||||
map((res) => {
|
};
|
||||||
const values: any[] = res?.data?.data || res?.data?.values || [];
|
|
||||||
const testResult =
|
|
||||||
values.length > 0
|
|
||||||
? { status: 'success', message: 'Data source connected and labels found.' }
|
|
||||||
: {
|
|
||||||
status: 'error',
|
|
||||||
message:
|
|
||||||
'Data source connected, but no labels received. Verify that Loki and Promtail is configured properly.',
|
|
||||||
};
|
|
||||||
return testResult;
|
|
||||||
}),
|
|
||||||
catchError((err: any) => {
|
|
||||||
let message = 'Loki: ';
|
|
||||||
if (err.statusText) {
|
|
||||||
message += err.statusText;
|
|
||||||
} else {
|
|
||||||
message += 'Cannot connect to Loki';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err.status) {
|
return this.metadataRequest('labels', params).then(
|
||||||
message += `. ${err.status}`;
|
(values) => {
|
||||||
}
|
return values.length > 0
|
||||||
|
? { status: 'success', message: 'Data source connected and labels found.' }
|
||||||
if (err.data && err.data.message) {
|
: {
|
||||||
message += `. ${err.data.message}`;
|
status: 'error',
|
||||||
} else if (err.data) {
|
message:
|
||||||
message += `. ${err.data}`;
|
'Data source connected, but no labels received. Verify that Loki and Promtail is configured properly.',
|
||||||
}
|
};
|
||||||
return of({ status: 'error', message: message });
|
},
|
||||||
})
|
(err) => {
|
||||||
)
|
// we did a resource-call that failed.
|
||||||
|
// the only info we have, if exists, is err.data.message
|
||||||
|
// (when in development-mode, err.data.error exists too, but not in production-mode)
|
||||||
|
// things like err.status & err.statusText does not help,
|
||||||
|
// because those will only describe how the request between browser<>server failed
|
||||||
|
const info: string = err?.data?.message ?? '';
|
||||||
|
const infoInParentheses = info !== '' ? ` (${info})` : '';
|
||||||
|
const message = `Unable to fetch labels from Loki${infoInParentheses}, please check the server logs for more details`;
|
||||||
|
return { status: 'error', message: message };
|
||||||
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user