From 6c79408b0f823896f7097ac8f0de31d32b8c509c Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 1 Jul 2020 08:58:40 -0700 Subject: [PATCH] Move plugin stats to their own file Summary: Really nothing interesting to see here , just moved pluginStats out of messageQueue, as it started there and kept growing Reviewed By: nikoant Differential Revision: D22257318 fbshipit-source-id: 26be7efb4629fcef1b14de96a2b60f17f7d76785 --- desktop/app/src/dispatcher/tracking.tsx | 2 +- desktop/app/src/utils/messageQueue.tsx | 116 +--------------------- desktop/app/src/utils/pluginStats.tsx | 123 ++++++++++++++++++++++++ 3 files changed, 125 insertions(+), 116 deletions(-) create mode 100644 desktop/app/src/utils/pluginStats.tsx diff --git a/desktop/app/src/dispatcher/tracking.tsx b/desktop/app/src/dispatcher/tracking.tsx index 4668e2f4d..c05a27279 100644 --- a/desktop/app/src/dispatcher/tracking.tsx +++ b/desktop/app/src/dispatcher/tracking.tsx @@ -17,7 +17,7 @@ import Client from '../Client'; import { getPluginBackgroundStats, resetPluginBackgroundStatsDelta, -} from '../utils/messageQueue'; +} from '../utils/pluginStats'; import { clearTimeline, TrackingEvent, diff --git a/desktop/app/src/utils/messageQueue.tsx b/desktop/app/src/utils/messageQueue.tsx index d853c0817..fa9f6a52a 100644 --- a/desktop/app/src/utils/messageQueue.tsx +++ b/desktop/app/src/utils/messageQueue.tsx @@ -23,123 +23,9 @@ import { import {Idler, BaseIdler} from './Idler'; import {pluginIsStarred, getSelectedPluginKey} from '../reducers/connections'; import {deconstructPluginKey} from './clientUtils'; -import {onBytesReceived} from '../dispatcher/tracking'; import {defaultEnabledBackgroundPlugins} from './pluginUtils'; import {SandyPluginDefinition} from 'flipper-plugin'; - -const MAX_BACKGROUND_TASK_TIME = 25; - -type StatEntry = { - cpuTimeTotal: number; // Total time spend in persisted Reducer - cpuTimeDelta: number; // Time spend since previous tracking tick - messageCountTotal: number; // amount of message received for this plugin - messageCountDelta: number; // amout of messages received since previous tracking tick - maxTime: number; // maximum time spend in a single reducer call - bytesReceivedTotal: number; // Bytes received - bytesReceivedDelta: number; // Bytes received since last tick -}; - -const pluginBackgroundStats = new Map(); - -export function resetPluginBackgroundStatsDelta() { - pluginBackgroundStats.forEach((stat) => { - stat.cpuTimeDelta = 0; - stat.messageCountDelta = 0; - stat.bytesReceivedDelta = 0; - }); -} - -onBytesReceived((plugin: string, bytes: number) => { - if (!pluginBackgroundStats.has(plugin)) { - pluginBackgroundStats.set(plugin, createEmptyStat()); - } - const stat = pluginBackgroundStats.get(plugin)!; - stat.bytesReceivedTotal += bytes; - stat.bytesReceivedDelta += bytes; -}); - -export function getPluginBackgroundStats(): { - cpuTime: number; // amount of ms cpu used since the last stats (typically every minute) - bytesReceived: number; - byPlugin: {[plugin: string]: StatEntry}; -} { - let cpuTime: number = 0; - let bytesReceived: number = 0; - const byPlugin = Array.from(pluginBackgroundStats.entries()).reduce( - (aggregated, [pluginName, data]) => { - cpuTime += data.cpuTimeDelta; - bytesReceived += data.bytesReceivedDelta; - aggregated[pluginName] = data; - return aggregated; - }, - {} as {[plugin: string]: StatEntry}, - ); - return { - cpuTime, - bytesReceived, - byPlugin, - }; -} - -if (window) { - // @ts-ignore - window.flipperPrintPluginBackgroundStats = () => { - console.table( - Array.from(pluginBackgroundStats.entries()).map( - ([ - plugin, - { - cpuTimeDelta, - cpuTimeTotal, - messageCountDelta, - messageCountTotal, - maxTime, - bytesReceivedTotal, - bytesReceivedDelta, - }, - ]) => ({ - plugin, - cpuTimeTotal, - messageCountTotal, - cpuTimeDelta, - messageCountDelta, - maxTime, - bytesReceivedTotal, - bytesReceivedDelta, - }), - ), - ); - }; -} - -function createEmptyStat(): StatEntry { - return { - cpuTimeDelta: 0, - cpuTimeTotal: 0, - messageCountDelta: 0, - messageCountTotal: 0, - maxTime: 0, - bytesReceivedTotal: 0, - bytesReceivedDelta: 0, - }; -} - -function addBackgroundStat(plugin: string, cpuTime: number) { - if (!pluginBackgroundStats.has(plugin)) { - pluginBackgroundStats.set(plugin, createEmptyStat()); - } - const stat = pluginBackgroundStats.get(plugin)!; - stat.cpuTimeDelta += cpuTime; - stat.cpuTimeTotal += cpuTime; - stat.messageCountDelta += 1; - stat.messageCountTotal += 1; - stat.maxTime = Math.max(stat.maxTime, cpuTime); - if (cpuTime > MAX_BACKGROUND_TASK_TIME) { - console.warn( - `Plugin ${plugin} took too much time while doing background: ${cpuTime}ms. Handling background messages should take less than ${MAX_BACKGROUND_TASK_TIME}ms.`, - ); - } -} +import {addBackgroundStat} from './pluginStats'; function processMessage( state: State, diff --git a/desktop/app/src/utils/pluginStats.tsx b/desktop/app/src/utils/pluginStats.tsx new file mode 100644 index 000000000..bbeb38e71 --- /dev/null +++ b/desktop/app/src/utils/pluginStats.tsx @@ -0,0 +1,123 @@ +/** + * 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 {onBytesReceived} from '../dispatcher/tracking'; + +type StatEntry = { + cpuTimeTotal: number; // Total time spend in persisted Reducer + cpuTimeDelta: number; // Time spend since previous tracking tick + messageCountTotal: number; // amount of message received for this plugin + messageCountDelta: number; // amout of messages received since previous tracking tick + maxTime: number; // maximum time spend in a single reducer call + bytesReceivedTotal: number; // Bytes received + bytesReceivedDelta: number; // Bytes received since last tick +}; + +const MAX_BACKGROUND_TASK_TIME = 25; +const pluginBackgroundStats = new Map(); + +export function resetPluginBackgroundStatsDelta() { + pluginBackgroundStats.forEach((stat) => { + stat.cpuTimeDelta = 0; + stat.messageCountDelta = 0; + stat.bytesReceivedDelta = 0; + }); +} + +onBytesReceived((plugin: string, bytes: number) => { + if (!pluginBackgroundStats.has(plugin)) { + pluginBackgroundStats.set(plugin, createEmptyStat()); + } + const stat = pluginBackgroundStats.get(plugin)!; + stat.bytesReceivedTotal += bytes; + stat.bytesReceivedDelta += bytes; +}); + +export function getPluginBackgroundStats(): { + cpuTime: number; // amount of ms cpu used since the last stats (typically every minute) + bytesReceived: number; + byPlugin: {[plugin: string]: StatEntry}; +} { + let cpuTime: number = 0; + let bytesReceived: number = 0; + const byPlugin = Array.from(pluginBackgroundStats.entries()).reduce( + (aggregated, [pluginName, data]) => { + cpuTime += data.cpuTimeDelta; + bytesReceived += data.bytesReceivedDelta; + aggregated[pluginName] = data; + return aggregated; + }, + {} as {[plugin: string]: StatEntry}, + ); + return { + cpuTime, + bytesReceived, + byPlugin, + }; +} + +if (window) { + // @ts-ignore + window.flipperPrintPluginBackgroundStats = () => { + console.table( + Array.from(pluginBackgroundStats.entries()).map( + ([ + plugin, + { + cpuTimeDelta, + cpuTimeTotal, + messageCountDelta, + messageCountTotal, + maxTime, + bytesReceivedTotal, + bytesReceivedDelta, + }, + ]) => ({ + plugin, + cpuTimeTotal, + messageCountTotal, + cpuTimeDelta, + messageCountDelta, + maxTime, + bytesReceivedTotal, + bytesReceivedDelta, + }), + ), + ); + }; +} + +function createEmptyStat(): StatEntry { + return { + cpuTimeDelta: 0, + cpuTimeTotal: 0, + messageCountDelta: 0, + messageCountTotal: 0, + maxTime: 0, + bytesReceivedTotal: 0, + bytesReceivedDelta: 0, + }; +} + +export function addBackgroundStat(plugin: string, cpuTime: number) { + if (!pluginBackgroundStats.has(plugin)) { + pluginBackgroundStats.set(plugin, createEmptyStat()); + } + const stat = pluginBackgroundStats.get(plugin)!; + stat.cpuTimeDelta += cpuTime; + stat.cpuTimeTotal += cpuTime; + stat.messageCountDelta += 1; + stat.messageCountTotal += 1; + stat.maxTime = Math.max(stat.maxTime, cpuTime); + if (cpuTime > MAX_BACKGROUND_TASK_TIME) { + console.warn( + `Plugin ${plugin} took too much time while doing background: ${cpuTime}ms. Handling background messages should take less than ${MAX_BACKGROUND_TASK_TIME}ms.`, + ); + } +}