[local-sync] Differentiate sync loop & other errors by additional fingerprint info

Summary:
If an exception has the same stack trace, by default Sentry will always group
it together in the same event. We don't want to do that for sync loop
errors---e.g. 'Invalid credentials' errors should not be grouped together with
stuff like 'Too many simultaneous connections'. Creating more unique groups
will allow us to better evaluate the effect of sync & other bugfixes.

Test Plan: writing unit test right now

Reviewers: juan, mark

Subscribers:

Differential Revision: https://phab.nylas.com/D3915
This commit is contained in:
Christine Spang 2017-02-17 13:27:16 -08:00
parent 00299e446d
commit faf44193a7
4 changed files with 13 additions and 8 deletions

View file

@ -174,7 +174,8 @@ export default class NylasAPIRequest {
response.statusCode = NylasAPI.TimeoutErrorCodes[0];
}
const apiError = new APIError({error, response, body, requestOptions: this.options});
NylasEnv.errorLogger.apiDebug(apiError);
const fingerprint = ["{{ default }}", "local api", response.statusCode, error.message];
NylasEnv.reportError(apiError, {fingerprint: fingerprint});
reject(apiError);
} else {
if (this.options.ensureOnce === true) {

View file

@ -176,7 +176,8 @@ class SyncWorker {
if (statusCode >= 500) {
// Even though we don't consider 500s as permanent errors when
// refreshing tokens, we want to report them
NylasEnv.reportError(err)
const fingerprint = ["{{ default }}", "access token refresh", statusCode, err.message];
NylasEnv.reportError(err, {fingerprint: fingerprint})
}
const isNonPermanentError = (
// If we got a 5xx error from the server, that means that something is wrong
@ -195,7 +196,8 @@ class SyncWorker {
}
}
this._logger.error(`🔃 Unable to refresh access token.`, err);
NylasEnv.reportError(err)
const fingerprint = ["{{ default }}", "access token refresh", err.message];
NylasEnv.reportError(err, {fingerprint: fingerprint})
throw new Error(`Unable to refresh access token, unknown error encountered`);
}
}
@ -365,8 +367,9 @@ class SyncWorker {
// Step 4 Update account error state
const errorJSON = error.toJSON()
error.message = `Error in sync loop: ${error.message}`
NylasEnv.reportError(error)
const fingerprint = ["{{ default }}", "sync loop", error.message];
NylasEnv.reportError(error, {fingerprint: fingerprint});
const isAuthError = error instanceof IMAPErrors.IMAPAuthenticationError
const accountSyncState = isAuthError ? SYNC_STATE_AUTH_FAILED : SYNC_STATE_ERROR;
// TODO this is currently a hack to keep N1's account in sync and notify of

View file

@ -187,10 +187,10 @@ class SyncbackTaskRunner {
syncbackRequest.status = "NEW";
this._logger.warn(`🔃 📤 ${task.description()} Failed with retryable error, retrying in next loop (${after.getTime() - before.getTime()}ms)`, {syncbackRequest: syncbackRequest.toJSON(), error})
} else {
error.message = `Syncback Task Failed: ${error.message}`
const fingerprint = ["{{ default }}", "syncback task", error.message];
NylasEnv.reportError(error, {fingerprint: fingerprint});
syncbackRequest.error = error;
syncbackRequest.status = "FAILED";
NylasEnv.reportError(error);
this._logger.error(`🔃 📤 ${task.description()} Failed (${after.getTime() - before.getTime()}ms)`, {syncbackRequest: syncbackRequest.toJSON(), error})
}
} finally {

View file

@ -151,7 +151,8 @@ class MessageProcessor {
imapMessage,
desiredParts,
})
NylasEnv.reportError(err)
const fingerprint = ["{{ default }}", "message processor", err.message];
NylasEnv.reportError(err, {fingerprint: fingerprint})
// Keep track of uids we failed to fetch
const {failedUIDs = []} = folder.syncState