diff --git a/public/app/plugins/datasource/stackdriver/datasource.ts b/public/app/plugins/datasource/stackdriver/datasource.ts index 1bb2d4721a83..bed63635340c 100644 --- a/public/app/plugins/datasource/stackdriver/datasource.ts +++ b/public/app/plugins/datasource/stackdriver/datasource.ts @@ -1,13 +1,63 @@ /** @ngInject */ -export function StackdriverDatasource(this: any, instanceSettings, $q, backendSrv, templateSrv) { - // this.basicAuth = instanceSettings.basicAuth; - // this.url = instanceSettings.url; - // this.name = instanceSettings.name; - // this.graphiteVersion = instanceSettings.jsonData.graphiteVersion || '0.9'; - // this.supportsTags = supportsTags(this.graphiteVersion); - // this.cacheTimeout = instanceSettings.cacheTimeout; - // this.withCredentials = instanceSettings.withCredentials; - // this.render_method = instanceSettings.render_method || 'POST'; - // this.funcDefs = null; - // this.funcDefsPromise = null; +export default class StackdriverDatasource { + url: string; + baseUrl: string; + cloudName: string; + + constructor(instanceSettings, private backendSrv) { + this.cloudName = 'stackdriver'; + this.baseUrl = `/${this.cloudName}/`; + this.url = instanceSettings.url; + } + + testDatasource() { + const path = `v3/projects/raintank-production/timeSeries?aggregation.crossSeriesReducer= + REDUCE_NONE&filter=metric.type%20%3D%20%22compute.googleapis.com%2Finstance%2Fcpu%2Fusage_time% + 22&aggregation.perSeriesAligner=ALIGN_NONE&interval.startTime=2018-09-04T05%3A16%3A02.383Z&interval.endTime=2018-09-04T11%3A16%3A02.383Z`; + return this.doRequest(`${this.baseUrl}${path}`) + .then(response => { + if (response.status === 200) { + return { + status: 'success', + message: 'Successfully queried the Azure Monitor service.', + title: 'Success', + }; + } else { + throw new Error(); + } + }) + .catch(error => { + let message = 'Azure Monitor: '; + message += error.statusText ? error.statusText + ': ' : ''; + + if (error.data && error.data.error && error.data.error.code) { + message += error.data.error.code + '. ' + error.data.error.message; + } else if (error.data && error.data.error) { + message += error.data.error; + } else if (error.data) { + message += error.data; + } else { + message += 'Cannot connect to Azure Monitor REST API.'; + } + return { + status: 'error', + message: message, + }; + }); + } + + doRequest(url, maxRetries = 1) { + return this.backendSrv + .datasourceRequest({ + url: this.url + url, + method: 'GET', + }) + .catch(error => { + if (maxRetries > 0) { + return this.doRequest(url, maxRetries - 1); + } + + throw error; + }); + } } diff --git a/public/app/plugins/datasource/stackdriver/module.ts b/public/app/plugins/datasource/stackdriver/module.ts index 52d3aa584535..104ac13b4228 100644 --- a/public/app/plugins/datasource/stackdriver/module.ts +++ b/public/app/plugins/datasource/stackdriver/module.ts @@ -1,4 +1,4 @@ -// import { StackdriverDatasource } from './datasource'; +import StackdriverDatasource from './datasource'; // import { StackdriverQueryCtrl } from './query_ctrl'; import { StackdriverConfigCtrl } from './config_ctrl'; @@ -7,7 +7,7 @@ import { StackdriverConfigCtrl } from './config_ctrl'; // } export { - // StackdriverDatasource as Datasource, + StackdriverDatasource as Datasource, // StackdriverQueryCtrl as QueryCtrl, StackdriverConfigCtrl as ConfigCtrl, // AnnotationsQueryCtrl, diff --git a/public/app/plugins/datasource/stackdriver/plugin.json b/public/app/plugins/datasource/stackdriver/plugin.json index c2d04eb97172..d2a482bae5b7 100644 --- a/public/app/plugins/datasource/stackdriver/plugin.json +++ b/public/app/plugins/datasource/stackdriver/plugin.json @@ -12,5 +12,19 @@ "info": { "description": "Data Source for Stackdriver", "version": "1.0.0" - } + }, + "routes": [ + { + "path": "stackdriver", + "method": "GET", + "url": "https://content-monitoring.googleapis.com", + "jwtTokenAuth": { + "params": { + "token_uri": "{{.JsonData.tokenUri}}", + "client_email": "{{.JsonData.clientEmail}}", + "private_key": "{{.SecureJsonData.privateKey}}" + } + } + } + ] } \ No newline at end of file