From 0aeae089af000bcda880677a705a0ee7b7517220 Mon Sep 17 00:00:00 2001 From: Ben Irvin Date: Thu, 30 Mar 2023 17:20:02 +0200 Subject: [PATCH 1/4] add telemetry to transfer --- .../strapi/lib/commands/transfer/transfer.js | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/packages/core/strapi/lib/commands/transfer/transfer.js b/packages/core/strapi/lib/commands/transfer/transfer.js index 9ced25ffd9..128d2d5401 100644 --- a/packages/core/strapi/lib/commands/transfer/transfer.js +++ b/packages/core/strapi/lib/commands/transfer/transfer.js @@ -161,10 +161,23 @@ module.exports = async (opts) => { updateLoader(stage, data).fail(); }); - let results; - try { + const getTelemetryPayload = (/* payload */) => { + return { + eventProperties: { + source: engine.sourceProvider.name, + destination: engine.destinationProvider.name, + }, + }; + }; + + progress.on('transfer::start', async () => { console.log(`Starting transfer...`); + await strapi.telemetry.send('didDEITSProcessStart', getTelemetryPayload()); + }); + + let results; + try { // Abort transfer if user interrupts process ['SIGTERM', 'SIGINT', 'SIGQUIT'].forEach((signal) => { process.removeAllListeners(signal); @@ -173,10 +186,18 @@ module.exports = async (opts) => { results = await engine.transfer(); } catch (e) { + await strapi.telemetry.send('didDEITSProcessFail', getTelemetryPayload()); exitWith(1, exitMessageText('transfer', true)); } - const table = buildTransferTable(results.engine); - console.log(table.toString()); + await strapi.telemetry.send('didDEITSProcessFinish', getTelemetryPayload()); + + try { + const table = buildTransferTable(results.engine); + console.log(table.toString()); + } catch (e) { + console.error('There was an error displaying the results of the transfer.'); + } + exitWith(0, exitMessageText('transfer')); }; From e40bbacc3b8a6f0a214b645abe6e3ab44aa312ea Mon Sep 17 00:00:00 2001 From: Ben Irvin Date: Fri, 14 Apr 2023 08:59:09 +0200 Subject: [PATCH 2/4] move telemetrypayload to utils --- .../strapi/lib/commands/transfer/export.js | 18 ++++++----------- .../strapi/lib/commands/transfer/import.js | 20 ++++++++----------- .../strapi/lib/commands/transfer/transfer.js | 17 +++++----------- .../strapi/lib/commands/transfer/utils.js | 15 ++++++++++++++ 4 files changed, 34 insertions(+), 36 deletions(-) diff --git a/packages/core/strapi/lib/commands/transfer/export.js b/packages/core/strapi/lib/commands/transfer/export.js index 769b140797..f4f2a712d7 100644 --- a/packages/core/strapi/lib/commands/transfer/export.js +++ b/packages/core/strapi/lib/commands/transfer/export.js @@ -24,6 +24,7 @@ const { loadersFactory, exitMessageText, abortTransfer, + getTransferTelemetryPayload, } = require('./utils'); const { exitWith } = require('../utils/helpers'); /** @@ -103,19 +104,10 @@ module.exports = async (opts) => { updateLoader(stage, data); }); - const getTelemetryPayload = (/* payload */) => { - return { - eventProperties: { - source: engine.sourceProvider.name, - destination: engine.destinationProvider.name, - }, - }; - }; - progress.on('transfer::start', async () => { console.log(`Starting export...`); - await strapi.telemetry.send('didDEITSProcessStart', getTelemetryPayload()); + await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine)); }); let results; @@ -134,11 +126,13 @@ module.exports = async (opts) => { throw new TransferEngineTransferError(`Export file not created "${outFile}"`); } } catch { - await strapi.telemetry.send('didDEITSProcessFail', getTelemetryPayload()); + await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine)); exitWith(1, exitMessageText('export', true)); } - await strapi.telemetry.send('didDEITSProcessFinish', getTelemetryPayload()); + // Note: we need to await telemetry or else the process ends before it is sent + await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine)); + try { const table = buildTransferTable(results.engine); console.log(table.toString()); diff --git a/packages/core/strapi/lib/commands/transfer/import.js b/packages/core/strapi/lib/commands/transfer/import.js index 5a649cf4ed..173dd734fe 100644 --- a/packages/core/strapi/lib/commands/transfer/import.js +++ b/packages/core/strapi/lib/commands/transfer/import.js @@ -20,6 +20,7 @@ const { loadersFactory, exitMessageText, abortTransfer, + getTransferTelemetryPayload, } = require('./utils'); const { exitWith } = require('../utils/helpers'); @@ -122,18 +123,12 @@ module.exports = async (opts) => { updateLoader(stage, data); }); - const getTelemetryPayload = () => { - return { - eventProperties: { - source: engine.sourceProvider.name, - destination: engine.destinationProvider.name, - }, - }; - }; - progress.on('transfer::start', async () => { console.log('Starting import...'); - await strapiInstance.telemetry.send('didDEITSProcessStart', getTelemetryPayload()); + await strapiInstance.telemetry.send( + 'didDEITSProcessStart', + getTransferTelemetryPayload(engine) + ); }); let results; @@ -146,7 +141,7 @@ module.exports = async (opts) => { results = await engine.transfer(); } catch (e) { - await strapiInstance.telemetry.send('didDEITSProcessFail', getTelemetryPayload()); + await strapiInstance.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine)); exitWith(1, exitMessageText('import', true)); } @@ -157,7 +152,8 @@ module.exports = async (opts) => { console.error('There was an error displaying the results of the transfer.'); } - await strapiInstance.telemetry.send('didDEITSProcessFinish', getTelemetryPayload()); + // Note: we need to await telemetry or else the process ends before it is sent + await strapiInstance.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine)); await strapiInstance.destroy(); exitWith(0, exitMessageText('import')); diff --git a/packages/core/strapi/lib/commands/transfer/transfer.js b/packages/core/strapi/lib/commands/transfer/transfer.js index 128d2d5401..a59b5a7bcf 100644 --- a/packages/core/strapi/lib/commands/transfer/transfer.js +++ b/packages/core/strapi/lib/commands/transfer/transfer.js @@ -21,6 +21,7 @@ const { loadersFactory, exitMessageText, abortTransfer, + getTransferTelemetryPayload, } = require('./utils'); const { exitWith } = require('../utils/helpers'); @@ -161,19 +162,10 @@ module.exports = async (opts) => { updateLoader(stage, data).fail(); }); - const getTelemetryPayload = (/* payload */) => { - return { - eventProperties: { - source: engine.sourceProvider.name, - destination: engine.destinationProvider.name, - }, - }; - }; - progress.on('transfer::start', async () => { console.log(`Starting transfer...`); - await strapi.telemetry.send('didDEITSProcessStart', getTelemetryPayload()); + await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine)); }); let results; @@ -186,11 +178,12 @@ module.exports = async (opts) => { results = await engine.transfer(); } catch (e) { - await strapi.telemetry.send('didDEITSProcessFail', getTelemetryPayload()); + await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine)); exitWith(1, exitMessageText('transfer', true)); } - await strapi.telemetry.send('didDEITSProcessFinish', getTelemetryPayload()); + // Note: we need to await telemetry or else the process ends before it is sent + await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine)); try { const table = buildTransferTable(results.engine); diff --git a/packages/core/strapi/lib/commands/transfer/utils.js b/packages/core/strapi/lib/commands/transfer/utils.js index b42f1b3022..a968d4aa95 100644 --- a/packages/core/strapi/lib/commands/transfer/utils.js +++ b/packages/core/strapi/lib/commands/transfer/utils.js @@ -242,10 +242,25 @@ const loadersFactory = (defaultLoaders = {}) => { }; }; +/** + * + * @param {import('@strapi/data-transfer/types').ITransferEngine} engine + * @returns {object} Telemetry properties object + */ +const getTransferTelemetryPayload = (engine) => { + return { + eventProperties: { + source: engine?.sourceProvider?.name, + destination: engine?.destinationProvider?.name, + }, + }; +}; + module.exports = { loadersFactory, buildTransferTable, getDefaultExportName, + getTransferTelemetryPayload, DEFAULT_IGNORED_CONTENT_TYPES, createStrapiInstance, excludeOption, From 5c50a3ee3c7fcd454f43dc985aa54242af9d31e3 Mon Sep 17 00:00:00 2001 From: Ben Irvin Date: Fri, 14 Apr 2023 09:01:40 +0200 Subject: [PATCH 3/4] add comment --- packages/core/strapi/lib/commands/transfer/utils.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/commands/transfer/utils.js b/packages/core/strapi/lib/commands/transfer/utils.js index a968d4aa95..54acf1dad7 100644 --- a/packages/core/strapi/lib/commands/transfer/utils.js +++ b/packages/core/strapi/lib/commands/transfer/utils.js @@ -243,8 +243,9 @@ const loadersFactory = (defaultLoaders = {}) => { }; /** + * Get the telemetry data to be sent for a didDEITSProcess* event from an initialized transfer engine object * - * @param {import('@strapi/data-transfer/types').ITransferEngine} engine + * @param {import('@strapi/data-transfer/types').ITransferEngine} engine Initialized transfer engine * @returns {object} Telemetry properties object */ const getTransferTelemetryPayload = (engine) => { From 9c0b132b6633378165b4f1e8c8626d5f5de4de5b Mon Sep 17 00:00:00 2001 From: Ben Irvin Date: Fri, 14 Apr 2023 11:14:00 +0200 Subject: [PATCH 4/4] fix tests --- .../strapi/lib/commands/__tests__/data-transfer/export.test.js | 1 + .../strapi/lib/commands/__tests__/data-transfer/import.test.js | 1 + .../strapi/lib/commands/__tests__/data-transfer/transfer.test.js | 1 + 3 files changed, 3 insertions(+) diff --git a/packages/core/strapi/lib/commands/__tests__/data-transfer/export.test.js b/packages/core/strapi/lib/commands/__tests__/data-transfer/export.test.js index 56e1e7fec7..43f4a8292c 100644 --- a/packages/core/strapi/lib/commands/__tests__/data-transfer/export.test.js +++ b/packages/core/strapi/lib/commands/__tests__/data-transfer/export.test.js @@ -55,6 +55,7 @@ describe('Export', () => { // mock utils const mockUtils = { + getTransferTelemetryPayload: jest.fn().mockReturnValue({}), loadersFactory: jest.fn().mockReturnValue({ updateLoader: jest.fn() }), formatDiagnostic: jest.fn(), createStrapiInstance() { diff --git a/packages/core/strapi/lib/commands/__tests__/data-transfer/import.test.js b/packages/core/strapi/lib/commands/__tests__/data-transfer/import.test.js index 58668c64f4..6b2a726233 100644 --- a/packages/core/strapi/lib/commands/__tests__/data-transfer/import.test.js +++ b/packages/core/strapi/lib/commands/__tests__/data-transfer/import.test.js @@ -63,6 +63,7 @@ describe('Import', () => { // mock utils const mockUtils = { + getTransferTelemetryPayload: jest.fn().mockReturnValue({}), loadersFactory: jest.fn().mockReturnValue({ updateLoader: jest.fn() }), formatDiagnostic: jest.fn(), createStrapiInstance: jest.fn().mockReturnValue({ diff --git a/packages/core/strapi/lib/commands/__tests__/data-transfer/transfer.test.js b/packages/core/strapi/lib/commands/__tests__/data-transfer/transfer.test.js index 33fd7880dd..c05c60f947 100644 --- a/packages/core/strapi/lib/commands/__tests__/data-transfer/transfer.test.js +++ b/packages/core/strapi/lib/commands/__tests__/data-transfer/transfer.test.js @@ -5,6 +5,7 @@ const { expectExit } = require('./shared/transfer.test.utils'); describe('Transfer', () => { // mock utils const mockUtils = { + getTransferTelemetryPayload: jest.fn().mockReturnValue({}), loadersFactory: jest.fn().mockReturnValue({ updateLoader: jest.fn() }), formatDiagnostic: jest.fn(), createStrapiInstance() {