Skip to content

Commit d07c156

Browse files
Juanzhengjitf
authored andcommitted
[DevTools] Log basic usage events (facebook#22478)
1 parent 2b5adba commit d07c156

File tree

4 files changed

+47
-15
lines changed

4 files changed

+47
-15
lines changed

packages/react-devtools-extensions/src/main.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
import DevTools from 'react-devtools-shared/src/devtools/views/DevTools';
2222
import {__DEBUG__} from 'react-devtools-shared/src/constants';
2323
import {registerExtensionsEventLogger} from './registerExtensionsEventLogger';
24+
import {logEvent} from 'react-devtools-shared/src/Logger';
2425

2526
const LOCAL_STORAGE_SUPPORTS_PROFILING_KEY =
2627
'React::DevTools::supportsProfiling';
@@ -449,6 +450,7 @@ function createPanelIfReactLoaded() {
449450
ensureInitialHTMLIsCleared(componentsPortalContainer);
450451
render('components');
451452
panel.injectStyles(cloneStyleTags);
453+
logEvent({event_name: 'selected-components-tab'});
452454
}
453455
});
454456
extensionPanel.onHidden.addListener(panel => {
@@ -474,6 +476,7 @@ function createPanelIfReactLoaded() {
474476
ensureInitialHTMLIsCleared(profilerPortalContainer);
475477
render('profiler');
476478
panel.injectStyles(cloneStyleTags);
479+
logEvent({event_name: 'selected-profiler-tab'});
477480
}
478481
});
479482
},

packages/react-devtools-shared/src/Logger.js

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,23 @@
99

1010
import {enableLogger} from 'react-devtools-feature-flags';
1111

12-
type LoadHookNamesEvent = {|
13-
+event_name: 'loadHookNames',
14-
+event_status: 'success' | 'error' | 'timeout' | 'unknown',
15-
+duration_ms: number,
16-
+inspected_element_display_name: string | null,
17-
+inspected_element_number_of_hooks: number | null,
18-
|};
19-
20-
// prettier-ignore
2112
export type LogEvent =
22-
| LoadHookNamesEvent;
13+
| {|
14+
+event_name: 'loaded-dev-tools',
15+
|}
16+
| {|
17+
+event_name: 'selected-components-tab',
18+
|}
19+
| {|
20+
+event_name: 'selected-profiler-tab',
21+
|}
22+
| {|
23+
+event_name: 'load-hook-names',
24+
+event_status: 'success' | 'error' | 'timeout' | 'unknown',
25+
+duration_ms: number,
26+
+inspected_element_display_name: string | null,
27+
+inspected_element_number_of_hooks: number | null,
28+
|};
2329

2430
export type LogFunction = LogEvent => void;
2531

packages/react-devtools-shared/src/devtools/views/DevTools.js

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import '@reach/menu-button/styles.css';
1313
import '@reach/tooltip/styles.css';
1414

1515
import * as React from 'react';
16-
import {useEffect, useLayoutEffect, useMemo, useRef} from 'react';
16+
import {useCallback, useEffect, useLayoutEffect, useMemo, useRef} from 'react';
1717
import Store from '../store';
1818
import {
1919
BridgeContext,
@@ -47,6 +47,7 @@ import type {InspectedElement} from 'react-devtools-shared/src/devtools/views/Co
4747
import type {FetchFileWithCaching} from './Components/FetchFileWithCachingContext';
4848
import type {HookNamesModuleLoaderFunction} from 'react-devtools-shared/src/devtools/views/Components/HookNamesModuleLoaderContext';
4949
import type {FrontendBridge} from 'react-devtools-shared/src/bridge';
50+
import {logEvent} from '../../Logger';
5051

5152
export type BrowserTheme = 'dark' | 'light';
5253
export type TabID = 'components' | 'profiler';
@@ -152,6 +153,24 @@ export default function DevTools({
152153
tab = overrideTab;
153154
}
154155

156+
const selectTab = useCallback(
157+
(tabId: TabID) => {
158+
// We show the TabBar when DevTools is NOT rendered as a browser extension.
159+
// In this case, we want to capture when people select tabs with the TabBar.
160+
// When DevTools is rendered as an extension, we capture this event when
161+
// the browser devtools panel changes.
162+
if (showTabBar === true) {
163+
if (tabId === 'components') {
164+
logEvent({event_name: 'selected-components-tab'});
165+
} else {
166+
logEvent({event_name: 'selected-profiler-tab'});
167+
}
168+
}
169+
setTab(tabId);
170+
},
171+
[setTab, showTabBar],
172+
);
173+
155174
const options = useMemo(
156175
() => ({
157176
readOnly: readOnly || false,
@@ -204,12 +223,12 @@ export default function DevTools({
204223
if (event.ctrlKey || event.metaKey) {
205224
switch (event.key) {
206225
case '1':
207-
setTab(tabs[0].id);
226+
selectTab(tabs[0].id);
208227
event.preventDefault();
209228
event.stopPropagation();
210229
break;
211230
case '2':
212-
setTab(tabs[1].id);
231+
selectTab(tabs[1].id);
213232
event.preventDefault();
214233
event.stopPropagation();
215234
break;
@@ -232,6 +251,10 @@ export default function DevTools({
232251
}
233252
};
234253
}, [bridge]);
254+
255+
useEffect(() => {
256+
logEvent({event_name: 'loaded-dev-tools'});
257+
}, []);
235258
return (
236259
<BridgeContext.Provider value={bridge}>
237260
<StoreContext.Provider value={store}>
@@ -265,7 +288,7 @@ export default function DevTools({
265288
<TabBar
266289
currentTab={tab}
267290
id="DevTools"
268-
selectTab={setTab}
291+
selectTab={selectTab}
269292
tabs={tabs}
270293
type="navigation"
271294
/>

packages/react-devtools-shared/src/hookNamesCache.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ export function loadHookNames(
116116
const handleLoadComplete = (durationMs: number): void => {
117117
// Log duration for parsing hook names
118118
logEvent({
119-
event_name: 'loadHookNames',
119+
event_name: 'load-hook-names',
120120
event_status: status,
121121
duration_ms: durationMs,
122122
inspected_element_display_name: element.displayName,

0 commit comments

Comments
 (0)