Kill metrics reducer
Reviewed By: nikoant Differential Revision: D24332440 fbshipit-source-id: 0a48b25f98d93b181b622e8477a74c7ef0094816
This commit is contained in:
committed by
Facebook GitHub Bot
parent
707b8a922e
commit
41a1af33cb
@@ -33,7 +33,6 @@ export {
|
||||
} from './plugin';
|
||||
export {PluginClient, Props} from './plugin';
|
||||
export {default as Client} from './Client';
|
||||
export {MetricType} from './utils/exportMetrics';
|
||||
export {reportUsage} from './utils/metrics';
|
||||
export {default as promiseTimeout} from './utils/promiseTimeout';
|
||||
export {clipboard, remote, OpenDialogOptions} from 'electron';
|
||||
|
||||
@@ -11,7 +11,6 @@ import {KeyboardActions} from './MenuBar';
|
||||
import {Logger} from './fb-interfaces/Logger';
|
||||
import Client from './Client';
|
||||
import {Store} from './reducers/index';
|
||||
import {MetricType} from './utils/exportMetrics';
|
||||
import {ReactNode, Component} from 'react';
|
||||
import BaseDevice from './devices/BaseDevice';
|
||||
import {serialize, deserialize} from './utils/serialization';
|
||||
@@ -131,9 +130,6 @@ export abstract class FlipperBasePlugin<
|
||||
static defaultPersistedState: any;
|
||||
static persistedStateReducer: PersistedStateReducer | null;
|
||||
static maxQueueSize: number = DEFAULT_MAX_QUEUE_SIZE;
|
||||
static metricsReducer:
|
||||
| ((persistedState: StaticPersistedState) => Promise<MetricType>)
|
||||
| undefined;
|
||||
static exportPersistedState:
|
||||
| ((
|
||||
callClient: (method: string, params?: any) => Promise<any>,
|
||||
|
||||
@@ -1,139 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
*/
|
||||
|
||||
import {serialize} from './serialization';
|
||||
import {State as PluginStatesState} from '../reducers/pluginStates';
|
||||
import {Store} from '../reducers';
|
||||
import fs from 'fs';
|
||||
import {
|
||||
ExportType,
|
||||
fetchMetadata,
|
||||
determinePluginsToProcess,
|
||||
} from './exportData';
|
||||
import {deserializeObject} from './serialization';
|
||||
import {deconstructPluginKey} from './clientUtils';
|
||||
import {pluginsClassMap} from './pluginUtils';
|
||||
import {PluginDefinition, isSandyPlugin} from '../plugin';
|
||||
|
||||
export type MetricType = {[metricName: string]: number};
|
||||
type MetricPluginType = {[pluginID: string]: MetricType};
|
||||
export type ExportMetricType = {[clientID: string]: MetricPluginType};
|
||||
|
||||
async function exportMetrics(
|
||||
pluginStates: PluginStatesState,
|
||||
pluginsMap: Map<string, PluginDefinition>,
|
||||
selectedPlugins: Array<string>,
|
||||
): Promise<string> {
|
||||
const metrics: ExportMetricType = {};
|
||||
for (const key in pluginStates) {
|
||||
const pluginStateData = pluginStates[key];
|
||||
|
||||
const plugin = deconstructPluginKey(key);
|
||||
const pluginName = plugin.pluginName;
|
||||
if (
|
||||
pluginName === undefined ||
|
||||
(selectedPlugins.length > 0 && !selectedPlugins.includes(pluginName))
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
const client = plugin.client;
|
||||
const pluginClass = pluginsMap.get(pluginName);
|
||||
const metricsReducer:
|
||||
| (<U>(persistedState: U) => Promise<MetricType>)
|
||||
| undefined =
|
||||
pluginClass && !isSandyPlugin(pluginClass) // This feature doesn't seem to be used at all, so let's add it when needed for Sandy
|
||||
? pluginClass.metricsReducer
|
||||
: undefined;
|
||||
if (pluginsMap.has(pluginName) && metricsReducer) {
|
||||
const metricsObject = await metricsReducer(pluginStateData);
|
||||
const pluginObject: MetricPluginType = {};
|
||||
pluginObject[pluginName] = metricsObject;
|
||||
if (!metrics[client]) {
|
||||
metrics[client] = pluginObject;
|
||||
continue;
|
||||
}
|
||||
const mergedMetrics = {...metrics[client], ...pluginObject};
|
||||
metrics[client] = mergedMetrics;
|
||||
}
|
||||
}
|
||||
return Promise.resolve(await serialize(metrics));
|
||||
}
|
||||
|
||||
export async function exportMetricsWithoutTrace(
|
||||
store: Store,
|
||||
pluginStates: PluginStatesState,
|
||||
): Promise<string | null> {
|
||||
const pluginsMap = pluginsClassMap(store.getState().plugins);
|
||||
const {clients, selectedDevice} = store.getState().connections;
|
||||
const pluginsToProcess = determinePluginsToProcess(
|
||||
clients,
|
||||
selectedDevice,
|
||||
store.getState().plugins,
|
||||
);
|
||||
const metadata = await fetchMetadata(
|
||||
pluginsToProcess,
|
||||
pluginStates,
|
||||
store.getState(),
|
||||
);
|
||||
const newPluginStates = metadata.pluginStates;
|
||||
const {errors} = metadata;
|
||||
if (errors) {
|
||||
console.error(errors);
|
||||
}
|
||||
|
||||
const metrics = await exportMetrics(
|
||||
newPluginStates,
|
||||
pluginsMap,
|
||||
store.getState().plugins.selectedPlugins,
|
||||
);
|
||||
return metrics;
|
||||
}
|
||||
|
||||
function parseJSON(str: string): any {
|
||||
try {
|
||||
return JSON.parse(str);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
export async function exportMetricsFromTrace(
|
||||
trace: string,
|
||||
pluginsMap: Map<string, PluginDefinition>,
|
||||
selectedPlugins: Array<string>,
|
||||
): Promise<string> {
|
||||
const data = fs.readFileSync(trace, 'utf8');
|
||||
const parsedJSONData = parseJSON(data);
|
||||
if (!parsedJSONData) {
|
||||
return Promise.reject(
|
||||
new Error('Please pass the file which has a valid JSON'),
|
||||
);
|
||||
}
|
||||
const importedData: ExportType = deserializeObject(parsedJSONData);
|
||||
const importedStore = importedData.store;
|
||||
if (!importedStore) {
|
||||
return Promise.reject(
|
||||
new Error(
|
||||
'No store in the imported file, thus exiting without exporting metrics.',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
const {pluginStates} = importedStore;
|
||||
|
||||
if (!pluginStates) {
|
||||
return Promise.reject(
|
||||
new Error(
|
||||
'No pluginStates in the imported file, thus exiting without exporting metrics.',
|
||||
),
|
||||
);
|
||||
}
|
||||
return await exportMetrics(pluginStates, pluginsMap, selectedPlugins);
|
||||
}
|
||||
Reference in New Issue
Block a user