From 8b067a5fe016d6e14a46907469a1caf3df150de6 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Fri, 13 Mar 2020 14:40:16 -0700 Subject: [PATCH] DataSourceWithBackend: use /health endpoint for test (#22789) --- .../src/utils/DataSourceWithBackend.ts | 48 +++++++++++++++++-- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/packages/grafana-runtime/src/utils/DataSourceWithBackend.ts b/packages/grafana-runtime/src/utils/DataSourceWithBackend.ts index 4499892b266..2b627289828 100644 --- a/packages/grafana-runtime/src/utils/DataSourceWithBackend.ts +++ b/packages/grafana-runtime/src/utils/DataSourceWithBackend.ts @@ -13,6 +13,18 @@ import { getBackendSrv } from '../services'; // Ideally internal (exported for consistency) const ExpressionDatasourceID = '__expr__'; +export enum HealthStatus { + Unknown = 'UNKNOWN', + OK = 'OK', + Error = 'ERROR', +} + +export interface HealthCheckResult { + status: HealthStatus; + message: string; + details?: Record; +} + export class DataSourceWithBackend< TQuery extends DataQuery = DataQuery, TOptions extends DataSourceJsonData = DataSourceJsonData @@ -22,7 +34,7 @@ export class DataSourceWithBackend< } /** - * Ideally final -- any other implementation would be wrong! + * Ideally final -- any other implementation may not work as expected */ query(request: DataQueryRequest): Observable { const { targets, intervalMs, maxDataPoints, range } = request; @@ -101,8 +113,36 @@ export class DataSourceWithBackend< return getBackendSrv().post(`/api/datasources/${this.id}/resources/${path}`, { ...body }); } - testDatasource() { - // TODO, this will call the backend healthcheck endpoint - return Promise.resolve({}); + /** + * Run the datasource healthcheck + */ + async callHealthCheck(): Promise { + return getBackendSrv() + .get(`/api/datasources/${this.id}/health`) + .then(v => { + return v as HealthCheckResult; + }) + .catch(err => { + err.isHandled = true; // Avoid extra popup warning + return err.data as HealthCheckResult; + }); + } + + /** + * Checks the plugin health + */ + async testDatasource(): Promise { + return this.callHealthCheck().then(res => { + if (res.status === HealthStatus.OK) { + return { + status: 'success', + message: res.message, + }; + } + return { + status: 'fail', + message: res.message, + }; + }); } }