Skip to content
This repository was archived by the owner on Dec 11, 2022. It is now read-only.

Commit cd146a3

Browse files
authored
Merge pull request #25 from doitintl/avivl/hanlde-not-ready-queries
Better error handling
2 parents f880268 + 2cf587a commit cd146a3

File tree

5 files changed

+169
-58
lines changed

5 files changed

+169
-58
lines changed

dist/module.js

Lines changed: 91 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34249,7 +34249,7 @@ function () {
3424934249
}
3425034250

3425134251
if (maxRetries === void 0) {
34252-
maxRetries = 1;
34252+
maxRetries = 3;
3425334253
}
3425434254

3425534255
return tslib_1.__awaiter(this, void 0, void 0, function () {
@@ -34262,21 +34262,35 @@ function () {
3426234262
url: this.url + url,
3426334263
method: 'GET',
3426434264
requestId: requestId
34265+
}).then(function (result) {
34266+
if (result.status !== 200) {
34267+
if (result.status >= 500 && maxRetries > 0) {
34268+
return _this.doRequest(url, requestId, maxRetries - 1);
34269+
}
34270+
34271+
throw BigQueryDatasource.formatBigqueryError(result.data.error);
34272+
}
34273+
34274+
return result;
3426534275
}).catch(function (error) {
3426634276
if (maxRetries > 0) {
3426734277
return _this.doRequest(url, requestId, maxRetries - 1);
3426834278
}
3426934279

34280+
if (error.cancelled === true) {
34281+
return [];
34282+
}
34283+
3427034284
console.log(error);
34271-
throw BigQueryDatasource.formatBigqueryError(error);
34285+
throw BigQueryDatasource.formatBigqueryError(error.data.error);
3427234286
})];
3427334287
});
3427434288
});
3427534289
};
3427634290

3427734291
BigQueryDatasource.prototype.doQueryRequest = function (query, requestId, maxRetries) {
3427834292
if (maxRetries === void 0) {
34279-
maxRetries = 1;
34293+
maxRetries = 3;
3428034294
}
3428134295

3428234296
return tslib_1.__awaiter(this, void 0, void 0, function () {
@@ -34297,13 +34311,27 @@ function () {
3429734311
query: query,
3429834312
useLegacySql: false
3429934313
}
34314+
}).then(function (result) {
34315+
if (result.status !== 200) {
34316+
if (result.status >= 500 && maxRetries > 0) {
34317+
return _this.doQueryRequest(query, requestId, maxRetries - 1);
34318+
}
34319+
34320+
throw BigQueryDatasource.formatBigqueryError(result.data.error);
34321+
}
34322+
34323+
return result;
3430034324
}).catch(function (error) {
3430134325
if (maxRetries > 0) {
3430234326
return _this.doQueryRequest(query, requestId, maxRetries - 1);
3430334327
}
3430434328

34329+
if (error.cancelled === true) {
34330+
return [];
34331+
}
34332+
3430534333
console.log(error);
34306-
throw BigQueryDatasource.formatBigqueryError(error);
34334+
throw BigQueryDatasource.formatBigqueryError(error.data.error);
3430734335
})];
3430834336
});
3430934337
});
@@ -34369,6 +34397,13 @@ function () {
3436934397

3437034398
case 1:
3437134399
queryResults = _a.sent();
34400+
34401+
if (queryResults.length === 0) {
34402+
return [2
34403+
/*return*/
34404+
, rows];
34405+
}
34406+
3437234407
rows = rows.concat(queryResults.data.rows);
3437334408
console.log("getting results for: ", jobId);
3437434409
return [3
@@ -34390,7 +34425,7 @@ function () {
3439034425
}
3439134426

3439234427
return tslib_1.__awaiter(this, void 0, void 0, function () {
34393-
var queryResults, jobId, rows, schema;
34428+
var notReady, queryResults, jobId, rows, schema;
3439434429
return tslib_1.__generator(this, function (_a) {
3439534430
switch (_a.label) {
3439634431
case 0:
@@ -34403,19 +34438,55 @@ function () {
3440334438
}];
3440434439
}
3440534440

34441+
notReady = false;
34442+
['-- time --', '-- value --'].forEach(function (element) {
34443+
if (query.indexOf(element) !== -1) {
34444+
notReady = true;
34445+
}
34446+
});
34447+
34448+
if (notReady) {
34449+
return [2
34450+
/*return*/
34451+
, {
34452+
rows: null,
34453+
schema: null
34454+
}];
34455+
}
34456+
3440634457
return [4
3440734458
/*yield*/
3440834459
, this.doQueryRequest(query, requestId, maxRetries = 1)];
3440934460

3441034461
case 1:
3441134462
queryResults = _a.sent();
34463+
34464+
if (queryResults.length === 0) {
34465+
return [2
34466+
/*return*/
34467+
, {
34468+
rows: null,
34469+
schema: null
34470+
}];
34471+
}
34472+
3441234473
jobId = queryResults.data.jobReference.jobId;
3441334474
return [4
3441434475
/*yield*/
3441534476
, this._waitForJobComplete(queryResults, requestId, jobId)];
3441634477

3441734478
case 2:
3441834479
queryResults = _a.sent();
34480+
34481+
if (queryResults.length === 0) {
34482+
return [2
34483+
/*return*/
34484+
, {
34485+
rows: null,
34486+
schema: null
34487+
}];
34488+
}
34489+
3441934490
rows = queryResults.data.rows;
3442034491
schema = queryResults.data.schema;
3442134492
return [4
@@ -34754,20 +34825,22 @@ function () {
3475434825

3475534826
BigQueryDatasource.formatBigqueryError = function (error) {
3475634827
var message = 'BigQuery: ';
34757-
message += error.statusText ? error.statusText + ': ' : '';
34758-
34759-
if (error.data && error.data.error) {
34760-
try {
34761-
var res = JSON.parse(error.data.error);
34762-
message += res.error.code + '. ' + res.error.message;
34763-
} catch (err) {
34764-
message += error.data.error;
34765-
}
34766-
} else {
34767-
message += 'Cannot connect to BigQuery API';
34828+
var status = '';
34829+
var data = '';
34830+
34831+
if (error !== undefined) {
34832+
message += error.message ? error.message : 'Cannot connect to BigQuery API';
34833+
status = error.code;
34834+
data = error.errors[0].reason + ": " + error.message;
3476834835
}
3476934836

34770-
return message;
34837+
return {
34838+
statusText: message,
34839+
status: status,
34840+
data: {
34841+
message: data
34842+
}
34843+
};
3477134844
};
3477234845

3477334846
return BigQueryDatasource;
@@ -35800,8 +35873,7 @@ function () {
3580035873
text: itemText,
3580135874
value: itemValue
3580235875
});
35803-
} //console.log(data)
35804-
35876+
}
3580535877

3580635878
return data;
3580735879
};

dist/module.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/datasource.ts

Lines changed: 70 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -38,23 +38,33 @@ export class BigQueryDatasource {
3838

3939
}
4040

41-
async doRequest(url, requestId = 'requestId', maxRetries = 1) {
41+
async doRequest(url, requestId = 'requestId', maxRetries = 3) {
4242
return this.backendSrv
4343
.datasourceRequest({
4444
url: this.url + url,
4545
method: 'GET',
4646
requestId: requestId,
47-
})
48-
.catch(error => {
47+
}).then(result => {
48+
if (result.status !== 200) {
49+
if (result.status >= 500 && maxRetries > 0) {
50+
return this.doRequest(url, requestId, maxRetries - 1);
51+
}
52+
throw BigQueryDatasource.formatBigqueryError(result.data.error);
53+
}
54+
return result;
55+
}).catch(error => {
4956
if (maxRetries > 0) {
5057
return this.doRequest(url, requestId, maxRetries - 1);
5158
}
59+
if (error.cancelled === true) {
60+
return [];
61+
}
5262
console.log(error);
53-
throw BigQueryDatasource.formatBigqueryError(error);
63+
throw BigQueryDatasource.formatBigqueryError(error.data.error);
5464
});
5565
}
5666

57-
async doQueryRequest(query, requestId, maxRetries = 1) {
67+
async doQueryRequest(query, requestId, maxRetries = 3) {
5868
const path = `v2/projects/${this.projectName}/queries`;
5969
const url = this.url + `${this.baseUrl}${path}`;
6070
return this.backendSrv
@@ -66,13 +76,23 @@ export class BigQueryDatasource {
6676
query: query,
6777
useLegacySql: false,
6878
},
69-
})
70-
.catch(error => {
79+
}).then(result => {
80+
if (result.status !== 200) {
81+
if (result.status >= 500 && maxRetries > 0) {
82+
return this.doQueryRequest(query, requestId, maxRetries - 1);
83+
}
84+
throw BigQueryDatasource.formatBigqueryError(result.data.error);
85+
}
86+
return result;
87+
}).catch(error => {
7188
if (maxRetries > 0) {
7289
return this.doQueryRequest(query, requestId, maxRetries - 1);
7390
}
91+
if (error.cancelled === true) {
92+
return [];
93+
}
7494
console.log(error);
75-
throw BigQueryDatasource.formatBigqueryError(error);
95+
throw BigQueryDatasource.formatBigqueryError(error.data.error);
7696
});
7797
}
7898

@@ -96,6 +116,9 @@ export class BigQueryDatasource {
96116
while (queryResults.data.pageToken) {
97117
const path = `v2/projects/${this.projectName}/queries/` + jobId + '?pageToken=' + queryResults.data.pageToken;
98118
queryResults = await this.doRequest(`${this.baseUrl}${path}`, requestId);
119+
if (queryResults.length === 0) {
120+
return rows;
121+
}
99122
rows = rows.concat(queryResults.data.rows);
100123
console.log("getting results for: ", jobId);
101124
}
@@ -110,9 +133,33 @@ export class BigQueryDatasource {
110133
schema: null
111134
};
112135
}
136+
let notReady = false;
137+
['-- time --', '-- value --'].forEach(function (element) {
138+
if (query.indexOf(element) !== -1) {
139+
notReady = true;
140+
}
141+
});
142+
if (notReady) {
143+
return {
144+
rows: null,
145+
schema: null
146+
};
147+
}
113148
let queryResults = await this.doQueryRequest(query, requestId, maxRetries = 1);
149+
if (queryResults.length === 0) {
150+
return {
151+
rows: null,
152+
schema: null
153+
};
154+
}
114155
let jobId = queryResults.data.jobReference.jobId;
115156
queryResults = await this._waitForJobComplete(queryResults, requestId, jobId);
157+
if (queryResults.length === 0) {
158+
return {
159+
rows: null,
160+
schema: null
161+
};
162+
}
116163
let rows = queryResults.data.rows;
117164
let schema = queryResults.data.schema;
118165
rows = await this._getQueryResults(queryResults, rows, requestId, jobId);
@@ -139,7 +186,7 @@ export class BigQueryDatasource {
139186
return BigQueryQuery.quoteLiteral(v);
140187
});
141188
return quotedValues.join(',');
142-
}
189+
};
143190

144191
async query(options) {
145192
const queries = _.filter(options.targets, target => {
@@ -169,11 +216,11 @@ export class BigQueryDatasource {
169216
});
170217
return this.$q.all(allQueryPromise).then((responses): any => {
171218
let data = [];
172-
for (let i = 0; i < responses.length; i++){
219+
for (let i = 0; i < responses.length; i++) {
173220

174221
data.push(responses[i]);
175222
}
176-
return {data: data};
223+
return {data: data};
177224
});
178225
}
179226

@@ -204,11 +251,11 @@ export class BigQueryDatasource {
204251
.then(data => this.responseParser.transformAnnotationResponse(options, data));
205252
}
206253

207-
async paginatedResults(path, dataName){
254+
async paginatedResults(path, dataName) {
208255
let queryResults = await this.doRequest(`${this.baseUrl}${path}`);
209256
let data = queryResults.data;
210257
let dataList = dataName.split(".");
211-
dataList.forEach(function(element) {
258+
dataList.forEach(function (element) {
212259
data = data[element];
213260
});
214261
while (queryResults.data.nextPageToken) {
@@ -217,6 +264,7 @@ export class BigQueryDatasource {
217264
}
218265
return data;
219266
}
267+
220268
async getProjects(): Promise<ResultFormat[]> {
221269
const path = `v2/projects`;
222270
const data = await this.paginatedResults(path, "projects");
@@ -284,18 +332,15 @@ export class BigQueryDatasource {
284332

285333
static formatBigqueryError(error) {
286334
let message = 'BigQuery: ';
287-
message += error.statusText ? error.statusText + ': ' : '';
288-
if (error.data && error.data.error) {
289-
try {
290-
const res = JSON.parse(error.data.error);
291-
message += res.error.code + '. ' + res.error.message;
292-
} catch (err) {
293-
message += error.data.error;
294-
}
295-
} else {
296-
message += 'Cannot connect to BigQuery API';
335+
let status = '';
336+
let data = '';
337+
if (error !== undefined) {
338+
message += error.message ? error.message : 'Cannot connect to BigQuery API';
339+
status = error.code;
340+
data = error.errors[0].reason + ": " + error.message;
297341
}
298-
return message;
342+
return {statusText: message, status: status,data: {
343+
message: data,
344+
},};
299345
}
300-
301346
}

src/response_parser.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ export default class ResponseParser {
3838
}
3939
data.push({text: itemText, value: itemValue});
4040
}
41-
//console.log(data)
4241
return data;
4342
}
4443
static parseProjects(results): ResultFormat[] {

0 commit comments

Comments
 (0)