Analytics events for plugin management

Summary: Send some analytics events related to plugin management: auto-update, install, uninstall, load.

Reviewed By: passy

Differential Revision: D25557788

fbshipit-source-id: 14dc9ae5793e9b18be13f2d483069d8d00c8b863
This commit is contained in:
Anton Nikolaev
2020-12-15 09:28:58 -08:00
committed by Facebook GitHub Bot
parent 31ace3bd09
commit 3a65f86c68
5 changed files with 46 additions and 2 deletions

View File

@@ -55,6 +55,7 @@ import {InstalledPluginDetails} from 'plugin-lib';
import semver from 'semver'; import semver from 'semver';
import {activatePlugin} from './reducers/pluginManager'; import {activatePlugin} from './reducers/pluginManager';
import {produce} from 'immer'; import {produce} from 'immer';
import {reportUsage} from './utils/metrics';
const {Text, Link} = Typography; const {Text, Link} = Typography;
@@ -382,6 +383,13 @@ class PluginContainer extends PureComponent<Props, State> {
reloadPlugin() { reloadPlugin() {
const {activatePlugin, latestInstalledVersion} = this.props; const {activatePlugin, latestInstalledVersion} = this.props;
if (latestInstalledVersion) { if (latestInstalledVersion) {
reportUsage(
'plugin-auto-update:alert:reloadClicked',
{
version: latestInstalledVersion.version,
},
latestInstalledVersion.id,
);
activatePlugin({ activatePlugin({
plugin: latestInstalledVersion, plugin: latestInstalledVersion,
enable: false, enable: false,

View File

@@ -30,7 +30,7 @@ import {requirePlugin} from './plugins';
import {registerPluginUpdate, selectPlugin} from '../reducers/connections'; import {registerPluginUpdate, selectPlugin} from '../reducers/connections';
import {Button} from 'antd'; import {Button} from 'antd';
import React from 'react'; import React from 'react';
import {reportUsage} from '../utils/metrics'; import {reportPlatformFailures, reportUsage} from '../utils/metrics';
import {addNotification, removeNotification} from '../reducers/notifications'; import {addNotification, removeNotification} from '../reducers/notifications';
import reloadFlipper from '../utils/reloadFlipper'; import reloadFlipper from '../utils/reloadFlipper';
import {activatePlugin, pluginInstalled} from '../reducers/pluginManager'; import {activatePlugin, pluginInstalled} from '../reducers/pluginManager';
@@ -55,7 +55,22 @@ export default (store: Store) => {
(state, store) => { (state, store) => {
for (const download of Object.values(state)) { for (const download of Object.values(state)) {
if (download.status === PluginDownloadStatus.QUEUED) { if (download.status === PluginDownloadStatus.QUEUED) {
handlePluginDownload(download.plugin, download.startedByUser, store); reportUsage(
'plugin-auto-update:download',
{
version: download.plugin.version,
startedByUser: download.startedByUser ? '1' : '0',
},
download.plugin.id,
);
reportPlatformFailures(
handlePluginDownload(
download.plugin,
download.startedByUser,
store,
),
'plugin-auto-update:download',
).catch(() => {});
} }
} }
}, },
@@ -145,6 +160,7 @@ async function handlePluginDownload(
`Failed to download plugin "${title}" v${version}.`, `Failed to download plugin "${title}" v${version}.`,
); );
} }
throw error;
} finally { } finally {
dispatch(pluginDownloadFinished({plugin})); dispatch(pluginDownloadFinished({plugin}));
await fs.remove(tmpDir); await fs.remove(tmpDir);

View File

@@ -22,6 +22,7 @@ import {sideEffect} from '../utils/sideEffect';
import {requirePlugin} from './plugins'; import {requirePlugin} from './plugins';
import {registerPluginUpdate} from '../reducers/connections'; import {registerPluginUpdate} from '../reducers/connections';
import {showErrorNotification} from '../utils/notifications'; import {showErrorNotification} from '../utils/notifications';
import {reportUsage} from '../utils/metrics';
const maxInstalledPluginVersionsToKeep = 2; const maxInstalledPluginVersionsToKeep = 2;
@@ -47,6 +48,15 @@ export default (store: Store, _logger: Logger) => {
(queue, store) => { (queue, store) => {
for (const request of queue) { for (const request of queue) {
try { try {
reportUsage(
'plugin:activate',
{
version: request.plugin.version,
enable: request.enable ? '1' : '0',
notifyIfFailed: request.notifyIfFailed ? '1' : '0',
},
request.plugin.id,
);
const plugin = requirePlugin(request.plugin); const plugin = requirePlugin(request.plugin);
const enablePlugin = request.enable; const enablePlugin = request.enable;
store.dispatch( store.dispatch(

View File

@@ -223,6 +223,13 @@ export const requirePlugin = (
pluginDetails: ActivatablePluginDetails, pluginDetails: ActivatablePluginDetails,
reqFn: Function = global.electronRequire, reqFn: Function = global.electronRequire,
): PluginDefinition => { ): PluginDefinition => {
reportUsage(
'plugin:load',
{
version: pluginDetails.version,
},
pluginDetails.id,
);
return tryCatchReportPluginFailures( return tryCatchReportPluginFailures(
() => requirePluginInternal(pluginDetails, reqFn), () => requirePluginInternal(pluginDetails, reqFn),
'plugin:load', 'plugin:load',

View File

@@ -38,6 +38,7 @@ import {
import {activatePlugin, uninstallPlugin} from '../../reducers/pluginManager'; import {activatePlugin, uninstallPlugin} from '../../reducers/pluginManager';
import {BundledPluginDetails} from 'plugin-lib/lib'; import {BundledPluginDetails} from 'plugin-lib/lib';
import {filterNewestVersionOfEachPlugin} from '../../dispatcher/plugins'; import {filterNewestVersionOfEachPlugin} from '../../dispatcher/plugins';
import {reportUsage} from '../../utils/metrics';
const {SubMenu} = Menu; const {SubMenu} = Menu;
const {Text} = Typography; const {Text} = Typography;
@@ -134,6 +135,7 @@ export const PluginList = memo(function PluginList({
const handleInstallPlugin = useCallback( const handleInstallPlugin = useCallback(
(id: string) => { (id: string) => {
const plugin = downloadablePlugins.find((p) => p.id === id)!; const plugin = downloadablePlugins.find((p) => p.id === id)!;
reportUsage('plugin:install', {version: plugin.version}, plugin.id);
if (plugin.isBundled) { if (plugin.isBundled) {
dispatch(activatePlugin({plugin, enable: true, notifyIfFailed: true})); dispatch(activatePlugin({plugin, enable: true, notifyIfFailed: true}));
} else { } else {
@@ -145,6 +147,7 @@ export const PluginList = memo(function PluginList({
const handleUninstallPlugin = useCallback( const handleUninstallPlugin = useCallback(
(id: string) => { (id: string) => {
const plugin = disabledPlugins.find((p) => p.id === id)!; const plugin = disabledPlugins.find((p) => p.id === id)!;
reportUsage('plugin:uninstall', {version: plugin.version}, plugin.id);
dispatch(uninstallPlugin(plugin)); dispatch(uninstallPlugin(plugin));
}, },
[disabledPlugins, dispatch], [disabledPlugins, dispatch],