Add more telemetry events

Summary:
Added more telemetry events for the following events

- Time taken for each plugin to fetch meta data
- Overall time taken for fetching all meta data
- Overall time taken for serializing plugins
- Time taken to serialize individual plugins with overridden serializer and deserializer methods

Reviewed By: passy

Differential Revision: D18349588

fbshipit-source-id: 2b3a6b663a9df4da45580fc0be5651a27ca4093d
This commit is contained in:
Pritesh Nandgaonkar
2019-11-08 05:03:36 -08:00
committed by Facebook Github Bot
parent 2f5096ddc8
commit f4a42cc4ea
3 changed files with 35 additions and 7 deletions

View File

@@ -38,6 +38,7 @@ import {reportPlatformFailures} from '../utils/metrics';
import CancellableExportStatus from './CancellableExportStatus'; import CancellableExportStatus from './CancellableExportStatus';
import {performance} from 'perf_hooks'; import {performance} from 'perf_hooks';
import ShareSheetPendingDialog from './ShareSheetPendingDialog'; import ShareSheetPendingDialog from './ShareSheetPendingDialog';
import {getInstance as getLogger} from '../fb-stubs/Logger';
export const SHARE_FLIPPER_TRACE_EVENT = 'share-flipper-link'; export const SHARE_FLIPPER_TRACE_EVENT = 'share-flipper-link';
const Container = styled(FlexColumn)({ const Container = styled(FlexColumn)({
@@ -119,7 +120,8 @@ export default class ShareSheetExportUrl extends Component<Props, State> {
exportStore(store, this.idler, statusUpdate), exportStore(store, this.idler, statusUpdate),
`${EXPORT_FLIPPER_TRACE_EVENT}:UI_LINK`, `${EXPORT_FLIPPER_TRACE_EVENT}:UI_LINK`,
); );
const uploadMarker = `${EXPORT_FLIPPER_TRACE_EVENT}:upload`;
performance.mark(uploadMarker);
statusUpdate('Uploading Flipper Trace...'); statusUpdate('Uploading Flipper Trace...');
// TODO(T55169042): Implement error handling. Result is not tested // TODO(T55169042): Implement error handling. Result is not tested
// its result type right now, causing the upload indicator to stall forever. // its result type right now, causing the upload indicator to stall forever.
@@ -127,7 +129,9 @@ export default class ShareSheetExportUrl extends Component<Props, State> {
shareFlipperData(serializedString), shareFlipperData(serializedString),
`${SHARE_FLIPPER_TRACE_EVENT}`, `${SHARE_FLIPPER_TRACE_EVENT}`,
); );
getLogger().trackTimeSince(uploadMarker, uploadMarker, {
plugins: store.getState().plugins.selectedPlugins,
});
this.setState({errorArray, result}); this.setState({errorArray, result});
const flipperUrl = (result as DataExportResult).flipperUrl; const flipperUrl = (result as DataExportResult).flipperUrl;
if (flipperUrl) { if (flipperUrl) {

View File

@@ -7,6 +7,12 @@
* @format * @format
*/ */
try {
jest.mock('../../fb/Logger');
} catch (e) {
jest.mock('../../fb-stubs/Logger');
}
import {default as BaseDevice} from '../../devices/BaseDevice'; import {default as BaseDevice} from '../../devices/BaseDevice';
import {default as ArchivedDevice} from '../../devices/ArchivedDevice'; import {default as ArchivedDevice} from '../../devices/ArchivedDevice';
import {processStore} from '../exportData'; import {processStore} from '../exportData';

View File

@@ -34,7 +34,7 @@ import promiseTimeout from './promiseTimeout';
import {Idler} from './Idler'; import {Idler} from './Idler';
export const IMPORT_FLIPPER_TRACE_EVENT = 'import-flipper-trace'; export const IMPORT_FLIPPER_TRACE_EVENT = 'import-flipper-trace';
export const EXPORT_FLIPPER_TRACE_EVENT = 'export-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 = { export type PluginStatesExportState = {
[pluginKey: string]: string; [pluginKey: string]: string;
@@ -193,7 +193,8 @@ const serializePluginStates = async (
const keyArray = key.split('#'); const keyArray = key.split('#');
const pluginName = keyArray.pop(); const pluginName = keyArray.pop();
statusUpdate && statusUpdate(`Serialising ${pluginName}...`); statusUpdate && statusUpdate(`Serialising ${pluginName}...`);
const serializationMarker = `${EXPORT_FLIPPER_TRACE_EVENT}:serialization-per-plugin`;
performance.mark(serializationMarker);
const pluginClass = pluginName ? pluginsMap.get(pluginName) : null; const pluginClass = pluginName ? pluginsMap.get(pluginName) : null;
if (pluginClass) { if (pluginClass) {
pluginExportState[key] = await pluginClass.serializePersistedState( pluginExportState[key] = await pluginClass.serializePersistedState(
@@ -202,6 +203,9 @@ const serializePluginStates = async (
idler, idler,
pluginName, pluginName,
); );
getLogger().trackTimeSince(serializationMarker, serializationMarker, {
plugin: pluginName,
});
} }
} }
return pluginExportState; return pluginExportState;
@@ -411,6 +415,8 @@ export async function fetchMetadata(
const exportState = pluginClass ? pluginClass.exportPersistedState : null; const exportState = pluginClass ? pluginClass.exportPersistedState : null;
if (exportState) { if (exportState) {
const key = pluginKey(client.id, plugin); const key = pluginKey(client.id, plugin);
const fetchMetaDataMarker = `${EXPORT_FLIPPER_TRACE_EVENT}:fetch-meta-data-per-plugin`;
performance.mark(fetchMetaDataMarker);
try { try {
statusUpdate && statusUpdate &&
statusUpdate(`Fetching metadata for plugin ${plugin}...`); statusUpdate(`Fetching metadata for plugin ${plugin}...`);
@@ -426,9 +432,16 @@ export async function fetchMetadata(
`Timed out while collecting data for ${plugin}`, `Timed out while collecting data for ${plugin}`,
); );
getLogger().trackTimeSince(fetchMetaDataMarker, fetchMetaDataMarker, {
plugin,
});
newPluginState[key] = data; newPluginState[key] = data;
} catch (e) { } catch (e) {
errorArray.push(e); errorArray.push(e);
getLogger().trackTimeSince(fetchMetaDataMarker, fetchMetaDataMarker, {
plugin,
error: e,
});
continue; continue;
} }
} }
@@ -464,6 +477,8 @@ export async function getStoreExport(
pluginsMap.set(key, val); pluginsMap.set(key, val);
}); });
statusUpdate && statusUpdate('Preparing to fetch metadata from client...'); statusUpdate && statusUpdate('Preparing to fetch metadata from client...');
const fetchMetaDataMarker = `${EXPORT_FLIPPER_TRACE_EVENT}:fetch-meta-data`;
performance.mark(fetchMetaDataMarker);
const metadata = await fetchMetadata( const metadata = await fetchMetadata(
pluginStates, pluginStates,
pluginsMap, pluginsMap,
@@ -471,6 +486,9 @@ export async function getStoreExport(
statusUpdate, statusUpdate,
idler, idler,
); );
getLogger().trackTimeSince(fetchMetaDataMarker, fetchMetaDataMarker, {
plugins: store.getState().plugins.selectedPlugins,
});
const {errorArray} = metadata; const {errorArray} = metadata;
const newPluginState = metadata.pluginStates; const newPluginState = metadata.pluginStates;
@@ -500,7 +518,7 @@ export function exportStore(
): Promise<{serializedString: string; errorArray: Array<Error>}> { ): Promise<{serializedString: string; errorArray: Array<Error>}> {
getLogger().track('usage', EXPORT_FLIPPER_TRACE_EVENT); getLogger().track('usage', EXPORT_FLIPPER_TRACE_EVENT);
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
performance.mark(EXPORT_FLIPPER_TRACE_TIME_EVENT); performance.mark(EXPORT_FLIPPER_TRACE_TIME_SERIALIZATION_EVENT);
try { try {
statusUpdate && statusUpdate('Preparing to export Flipper data...'); statusUpdate && statusUpdate('Preparing to export Flipper data...');
const {exportData, errorArray} = await getStoreExport( const {exportData, errorArray} = await getStoreExport(
@@ -515,8 +533,8 @@ export function exportStore(
reject(new Error('Serialize function returned empty string')); reject(new Error('Serialize function returned empty string'));
} }
getLogger().trackTimeSince( getLogger().trackTimeSince(
EXPORT_FLIPPER_TRACE_TIME_EVENT, EXPORT_FLIPPER_TRACE_TIME_SERIALIZATION_EVENT,
EXPORT_FLIPPER_TRACE_TIME_EVENT, EXPORT_FLIPPER_TRACE_TIME_SERIALIZATION_EVENT,
{ {
plugins: store.getState().plugins.selectedPlugins, plugins: store.getState().plugins.selectedPlugins,
}, },