diff --git a/src/chrome/ShareSheetExportUrl.tsx b/src/chrome/ShareSheetExportUrl.tsx index 906a08f79..cace9053f 100644 --- a/src/chrome/ShareSheetExportUrl.tsx +++ b/src/chrome/ShareSheetExportUrl.tsx @@ -38,6 +38,7 @@ import {reportPlatformFailures} from '../utils/metrics'; import CancellableExportStatus from './CancellableExportStatus'; import {performance} from 'perf_hooks'; import ShareSheetPendingDialog from './ShareSheetPendingDialog'; +import {getInstance as getLogger} from '../fb-stubs/Logger'; export const SHARE_FLIPPER_TRACE_EVENT = 'share-flipper-link'; const Container = styled(FlexColumn)({ @@ -119,7 +120,8 @@ export default class ShareSheetExportUrl extends Component { exportStore(store, this.idler, statusUpdate), `${EXPORT_FLIPPER_TRACE_EVENT}:UI_LINK`, ); - + const uploadMarker = `${EXPORT_FLIPPER_TRACE_EVENT}:upload`; + performance.mark(uploadMarker); statusUpdate('Uploading Flipper Trace...'); // TODO(T55169042): Implement error handling. Result is not tested // its result type right now, causing the upload indicator to stall forever. @@ -127,7 +129,9 @@ export default class ShareSheetExportUrl extends Component { shareFlipperData(serializedString), `${SHARE_FLIPPER_TRACE_EVENT}`, ); - + getLogger().trackTimeSince(uploadMarker, uploadMarker, { + plugins: store.getState().plugins.selectedPlugins, + }); this.setState({errorArray, result}); const flipperUrl = (result as DataExportResult).flipperUrl; if (flipperUrl) { diff --git a/src/utils/__tests__/exportData.electron.tsx b/src/utils/__tests__/exportData.electron.tsx index b9c94420d..11bbcc89c 100644 --- a/src/utils/__tests__/exportData.electron.tsx +++ b/src/utils/__tests__/exportData.electron.tsx @@ -7,6 +7,12 @@ * @format */ +try { + jest.mock('../../fb/Logger'); +} catch (e) { + jest.mock('../../fb-stubs/Logger'); +} + import {default as BaseDevice} from '../../devices/BaseDevice'; import {default as ArchivedDevice} from '../../devices/ArchivedDevice'; import {processStore} from '../exportData'; diff --git a/src/utils/exportData.tsx b/src/utils/exportData.tsx index 2e9991916..7237c7eaa 100644 --- a/src/utils/exportData.tsx +++ b/src/utils/exportData.tsx @@ -34,7 +34,7 @@ import promiseTimeout from './promiseTimeout'; import {Idler} from './Idler'; export const IMPORT_FLIPPER_TRACE_EVENT = 'import-flipper-trace'; export const EXPORT_FLIPPER_TRACE_EVENT = 'export-flipper-trace'; -export const EXPORT_FLIPPER_TRACE_TIME_EVENT = 'export-flipper-trace-time'; +export const EXPORT_FLIPPER_TRACE_TIME_SERIALIZATION_EVENT = `${EXPORT_FLIPPER_TRACE_EVENT}:serialization`; export type PluginStatesExportState = { [pluginKey: string]: string; @@ -193,7 +193,8 @@ const serializePluginStates = async ( const keyArray = key.split('#'); const pluginName = keyArray.pop(); statusUpdate && statusUpdate(`Serialising ${pluginName}...`); - + const serializationMarker = `${EXPORT_FLIPPER_TRACE_EVENT}:serialization-per-plugin`; + performance.mark(serializationMarker); const pluginClass = pluginName ? pluginsMap.get(pluginName) : null; if (pluginClass) { pluginExportState[key] = await pluginClass.serializePersistedState( @@ -202,6 +203,9 @@ const serializePluginStates = async ( idler, pluginName, ); + getLogger().trackTimeSince(serializationMarker, serializationMarker, { + plugin: pluginName, + }); } } return pluginExportState; @@ -411,6 +415,8 @@ export async function fetchMetadata( const exportState = pluginClass ? pluginClass.exportPersistedState : null; if (exportState) { const key = pluginKey(client.id, plugin); + const fetchMetaDataMarker = `${EXPORT_FLIPPER_TRACE_EVENT}:fetch-meta-data-per-plugin`; + performance.mark(fetchMetaDataMarker); try { statusUpdate && statusUpdate(`Fetching metadata for plugin ${plugin}...`); @@ -426,9 +432,16 @@ export async function fetchMetadata( `Timed out while collecting data for ${plugin}`, ); + getLogger().trackTimeSince(fetchMetaDataMarker, fetchMetaDataMarker, { + plugin, + }); newPluginState[key] = data; } catch (e) { errorArray.push(e); + getLogger().trackTimeSince(fetchMetaDataMarker, fetchMetaDataMarker, { + plugin, + error: e, + }); continue; } } @@ -464,6 +477,8 @@ export async function getStoreExport( pluginsMap.set(key, val); }); statusUpdate && statusUpdate('Preparing to fetch metadata from client...'); + const fetchMetaDataMarker = `${EXPORT_FLIPPER_TRACE_EVENT}:fetch-meta-data`; + performance.mark(fetchMetaDataMarker); const metadata = await fetchMetadata( pluginStates, pluginsMap, @@ -471,6 +486,9 @@ export async function getStoreExport( statusUpdate, idler, ); + getLogger().trackTimeSince(fetchMetaDataMarker, fetchMetaDataMarker, { + plugins: store.getState().plugins.selectedPlugins, + }); const {errorArray} = metadata; const newPluginState = metadata.pluginStates; @@ -500,7 +518,7 @@ export function exportStore( ): Promise<{serializedString: string; errorArray: Array}> { getLogger().track('usage', EXPORT_FLIPPER_TRACE_EVENT); return new Promise(async (resolve, reject) => { - performance.mark(EXPORT_FLIPPER_TRACE_TIME_EVENT); + performance.mark(EXPORT_FLIPPER_TRACE_TIME_SERIALIZATION_EVENT); try { statusUpdate && statusUpdate('Preparing to export Flipper data...'); const {exportData, errorArray} = await getStoreExport( @@ -515,8 +533,8 @@ export function exportStore( reject(new Error('Serialize function returned empty string')); } getLogger().trackTimeSince( - EXPORT_FLIPPER_TRACE_TIME_EVENT, - EXPORT_FLIPPER_TRACE_TIME_EVENT, + EXPORT_FLIPPER_TRACE_TIME_SERIALIZATION_EVENT, + EXPORT_FLIPPER_TRACE_TIME_SERIALIZATION_EVENT, { plugins: store.getState().plugins.selectedPlugins, },