diff --git a/packages/client-app/src/flux/nylas-api-request.es6 b/packages/client-app/src/flux/nylas-api-request.es6 index fd72a7af2..55f105237 100644 --- a/packages/client-app/src/flux/nylas-api-request.es6 +++ b/packages/client-app/src/flux/nylas-api-request.es6 @@ -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) { diff --git a/packages/client-sync/src/local-sync-worker/sync-worker.es6 b/packages/client-sync/src/local-sync-worker/sync-worker.es6 index 739ff23ad..757e37e7a 100644 --- a/packages/client-sync/src/local-sync-worker/sync-worker.es6 +++ b/packages/client-sync/src/local-sync-worker/sync-worker.es6 @@ -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 diff --git a/packages/client-sync/src/local-sync-worker/syncback-task-runner.es6 b/packages/client-sync/src/local-sync-worker/syncback-task-runner.es6 index 86a6d478a..f8660fd7f 100644 --- a/packages/client-sync/src/local-sync-worker/syncback-task-runner.es6 +++ b/packages/client-sync/src/local-sync-worker/syncback-task-runner.es6 @@ -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 { diff --git a/packages/client-sync/src/message-processor/index.js b/packages/client-sync/src/message-processor/index.js index c8a771560..3474b7a66 100644 --- a/packages/client-sync/src/message-processor/index.js +++ b/packages/client-sync/src/message-processor/index.js @@ -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