Skip to content

Commit 6df008e

Browse files
committed
fix: Errors during web socket subscribe returned with status 200 code
1 parent c42a971 commit 6df008e

File tree

1 file changed

+32
-14
lines changed

1 file changed

+32
-14
lines changed

packages/cubejs-api-gateway/index.js

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -257,19 +257,25 @@ class ApiGateway {
257257
return new SubscriptionServer(this, sendMessage, this.subscriptionStore);
258258
}
259259

260+
duration(requestStarted) {
261+
return new Date().getTime() - requestStarted.getTime();
262+
}
263+
260264
async meta({ context, res }) {
265+
const requestStarted = new Date();
261266
try {
262267
const metaConfig = await this.getCompilerApi(context).metaConfig();
263268
const cubes = metaConfig.map(c => c.config);
264269
res({ cubes });
265270
} catch (e) {
266271
this.handleError({
267-
e, context, res
272+
e, context, res, requestStarted
268273
});
269274
}
270275
}
271276

272277
async sql({ query, context, res }) {
278+
const requestStarted = new Date();
273279
try {
274280
query = this.parseQueryParam(query);
275281
const normalizedQuery = await this.queryTransformer(normalizeQuery(query), context);
@@ -282,12 +288,13 @@ class ApiGateway {
282288
});
283289
} catch (e) {
284290
this.handleError({
285-
e, context, query, res
291+
e, context, query, res, requestStarted
286292
});
287293
}
288294
}
289295

290296
async load({ query, context, res }) {
297+
const requestStarted = new Date();
291298
try {
292299
query = this.parseQueryParam(query);
293300
this.log(context, {
@@ -300,6 +307,11 @@ class ApiGateway {
300307
this.getCompilerApi(context).metaConfig()
301308
]);
302309
const sqlQuery = compilerSqlResult;
310+
this.log(context, {
311+
type: 'Load Request SQL',
312+
query,
313+
sqlQuery
314+
});
303315
const annotation = prepareAnnotation(metaConfigResult, normalizedQuery);
304316
const aliasToMemberNameMap = sqlQuery.aliasNameToMember;
305317
const toExecute = {
@@ -315,6 +327,7 @@ class ApiGateway {
315327
this.log(context, {
316328
type: 'Load Request Success',
317329
query,
330+
duration: this.duration(requestStarted)
318331
});
319332
const flattenAnnotation = {
320333
...annotation.measures,
@@ -333,14 +346,15 @@ class ApiGateway {
333346
});
334347
} catch (e) {
335348
this.handleError({
336-
e, context, query, res
349+
e, context, query, res, requestStarted
337350
});
338351
}
339352
}
340353

341354
async subscribe({
342355
query, context, res, subscribe, subscriptionState
343356
}) {
357+
const requestStarted = new Date();
344358
try {
345359
this.log(context, {
346360
type: 'Subscribe',
@@ -358,24 +372,24 @@ class ApiGateway {
358372
await this.load({
359373
query,
360374
context,
361-
res: (message) => {
375+
res: (message, opts) => {
362376
if (message.error) {
363-
error = message;
377+
error = { message, opts };
364378
} else {
365-
result = message;
379+
result = { message, opts };
366380
}
367381
}
368382
});
369383
const state = await subscriptionState();
370384
if (result && (!state || JSON.stringify(state.result) !== JSON.stringify(result))) {
371-
res(result);
385+
res(result.message, result.opts);
372386
} else if (error) {
373-
res(error);
387+
res(error.message, error.opts);
374388
}
375389
await subscribe({ error, result });
376390
} catch (e) {
377391
this.handleError({
378-
e, context, query, res
392+
e, context, query, res, requestStarted
379393
});
380394
}
381395
}
@@ -413,34 +427,38 @@ class ApiGateway {
413427
}
414428

415429
handleError({
416-
e, context, query, res
430+
e, context, query, res, requestStarted
417431
}) {
418432
if (e instanceof UserError) {
419433
this.log(context, {
420434
type: 'User Error',
421435
query,
422-
error: e.message
436+
error: e.message,
437+
duration: this.duration(requestStarted)
423438
});
424439
res({ error: e.message }, { status: 400 });
425440
} else if (e.error === 'Continue wait') {
426441
this.log(context, {
427442
type: 'Continue wait',
428443
query,
429-
error: e.message
444+
error: e.message,
445+
duration: this.duration(requestStarted)
430446
});
431447
res(e, { status: 200 });
432448
} else if (e.error) {
433449
this.log(context, {
434450
type: 'Orchestrator error',
435451
query,
436-
error: e.error
452+
error: e.error,
453+
duration: this.duration(requestStarted)
437454
});
438455
res(e, { status: 400 });
439456
} else {
440457
this.log(context, {
441458
type: 'Internal Server Error',
442459
query,
443-
error: e.stack || e.toString()
460+
error: e.stack || e.toString(),
461+
duration: this.duration(requestStarted)
444462
});
445463
res({ error: e.toString() }, { status: 500 });
446464
}

0 commit comments

Comments
 (0)