From 71064cc760a18d88226eaea923c7890c839a330c Mon Sep 17 00:00:00 2001 From: Benedict Aas Date: Wed, 2 May 2018 22:02:31 +0100 Subject: [PATCH] fix(GUI): fix multi-writes analytics (#2295) We make the analytics block into a function `handleErrorLogging` and use it in the fail event that happens during multi-writes. Previously error events would be handled when single drives were flashed on Promise rejection, instead we now only handle the Promise rejection when all devices fail as a special event. Change-Type: patch Changelog-Entry: Fix multi-writes analytics by reusing existing logic in multi-write events. --- lib/gui/app/modules/image-writer.js | 57 +++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/lib/gui/app/modules/image-writer.js b/lib/gui/app/modules/image-writer.js index 026012b8..24b1d435 100644 --- a/lib/gui/app/modules/image-writer.js +++ b/lib/gui/app/modules/image-writer.js @@ -60,6 +60,35 @@ const getApplicationEntryPoint = () => { return path.resolve(PROJECT_ROOT, relativeEntryPoint) } +/** + * @summary Handle a flash error and log it to analytics + * @function + * @private + * + * @param {Error} error - error object + * @param {Object} analyticsData - analytics object + * + * @example + * handleErrorLogging({ code: 'EUNPLUGGED' }, { image: 'resin.img' }) + */ +const handleErrorLogging = (error, analyticsData) => { + if (error.code === 'EVALIDATION') { + analytics.logEvent('Validation error', analyticsData) + } else if (error.code === 'EUNPLUGGED') { + analytics.logEvent('Drive unplugged', analyticsData) + } else if (error.code === 'EIO') { + analytics.logEvent('Input/output error', analyticsData) + } else if (error.code === 'ENOSPC') { + analytics.logEvent('Out of space', analyticsData) + } else if (error.code === 'ECHILDDIED') { + analytics.logEvent('Child died unexpectedly', analyticsData) + } else { + analytics.logEvent('Flash error', _.merge({ + error: errors.toJSON(error) + }, analyticsData)) + } +} + /** * @summary Perform write operation * @function @@ -127,9 +156,16 @@ exports.performWrite = (image, drives, onProgress) => { }) const flashResults = {} + const analyticsData = { + image, + drives, + uuid: flashState.getFlashUuid(), + unmountOnSuccess: settings.get('unmountOnSuccess'), + validateWriteOnSuccess: settings.get('validateWriteOnSuccess') + } - ipc.server.on('fail', (error) => { - console.log('Fail:', error) + ipc.server.on('fail', ({ device, error }) => { + handleErrorLogging(error, analyticsData) }) ipc.server.on('done', (event) => { @@ -275,20 +311,9 @@ exports.flash = (image, drives) => { errorCode: error.code }) - if (error.code === 'EVALIDATION') { - analytics.logEvent('Validation error', analyticsData) - } else if (error.code === 'EUNPLUGGED') { - analytics.logEvent('Drive unplugged', analyticsData) - } else if (error.code === 'EIO') { - analytics.logEvent('Input/output error', analyticsData) - } else if (error.code === 'ENOSPC') { - analytics.logEvent('Out of space', analyticsData) - } else if (error.code === 'ECHILDDIED') { - analytics.logEvent('Child died unexpectedly', analyticsData) - } else { - analytics.logEvent('Flash error', _.merge({ - error: errors.toJSON(error) - }, analyticsData)) + // eslint-disable-next-line no-magic-numbers + if (drives.length > 1) { + analytics.logEvent('Write failed', analyticsData) } return Bluebird.reject(error)