Skip to content

Commit 3697464

Browse files
authored
[x-license] Introduce usage telemetry (#13530)
Signed-off-by: Vadym Raksha <[email protected]>
1 parent 0ab893a commit 3697464

39 files changed

+1149
-1
lines changed

.codesandbox/ci.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"node": "20",
55
"packages": [
66
"packages/x-license",
7+
"packages/x-telemetry",
78
"packages/x-data-grid",
89
"packages/x-data-grid-pro",
910
"packages/x-data-grid-premium",
@@ -19,6 +20,7 @@
1920
],
2021
"publishDirectory": {
2122
"@mui/x-license": "packages/x-license/build",
23+
"@mui/x-telemetry": "packages/x-telemetry/build",
2224
"@mui/x-data-grid": "packages/x-data-grid/build",
2325
"@mui/x-data-grid-pro": "packages/x-data-grid-pro/build",
2426
"@mui/x-data-grid-premium": "packages/x-data-grid-premium/build",

.eslintrc.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,12 @@ module.exports = {
299299
],
300300
},
301301
},
302+
{
303+
files: ['packages/x-telemetry/**/*{.tsx,.ts,.js}'],
304+
rules: {
305+
'no-console': 'off',
306+
},
307+
},
302308
...buildPackageRestrictedImports('@mui/x-charts', 'x-charts', false),
303309
...buildPackageRestrictedImports('@mui/x-charts-pro', 'x-charts-pro', false),
304310
...buildPackageRestrictedImports('@mui/x-codemod', 'x-codemod', false),
@@ -311,6 +317,7 @@ module.exports = {
311317
...buildPackageRestrictedImports('@mui/x-tree-view', 'x-tree-view', false),
312318
...buildPackageRestrictedImports('@mui/x-tree-view-pro', 'x-tree-view-pro', false),
313319
...buildPackageRestrictedImports('@mui/x-license', 'x-license'),
320+
...buildPackageRestrictedImports('@mui/x-telemetry', 'x-telemetry'),
314321

315322
...addReactCompilerRule(chartsPackages, ENABLE_REACT_COMPILER_PLUGIN_CHARTS),
316323
...addReactCompilerRule(dataGridPackages, ENABLE_REACT_COMPILER_PLUGIN_DATA_GRID),

babel.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const defaultAlias = {
2222
'@mui/x-data-grid-pro': resolveAliasPath('./packages/x-data-grid-pro/src'),
2323
'@mui/x-data-grid-premium': resolveAliasPath('./packages/x-data-grid-premium/src'),
2424
'@mui/x-license': resolveAliasPath('./packages/x-license/src'),
25+
'@mui/x-telemetry': resolveAliasPath('./packages/x-telemetry/src'),
2526
'@mui/x-date-pickers': resolveAliasPath('./packages/x-date-pickers/src'),
2627
'@mui/x-date-pickers-pro': resolveAliasPath('./packages/x-date-pickers-pro/src'),
2728
'@mui/x-charts': resolveAliasPath('./packages/x-charts/src'),
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
---
2+
packageName: '@mui/x-telemetry'
3+
---
4+
5+
# MUI X Telemetry guide
6+
7+
<p class="description">MUI X Telemetry collects anonymous usage data to help improve the library. This guide walk you through how to opt-in, opt-out, and configure telemetry.</p>
8+
9+
## Opting In
10+
11+
Currently, **Telemetry is disabled by default**. To opt-in, you can use one of the following methods:
12+
13+
### Setting the Environment Variable
14+
15+
You can set the `MUI_X_TELEMETRY_DISABLED` environment variable to `false` to enable telemetry:
16+
17+
```bash
18+
MUI_X_TELEMETRY_DISABLED=false
19+
```
20+
21+
> Note that some frameworks may require you to prefix the environment variable with `REACT_APP_`, `NEXT_PUBLIC_`, etc.
22+
23+
### Import telemetry settings from `@mui/x-license` package
24+
25+
You can use `muiXTelemetrySettings` to enable telemetry:
26+
27+
```js
28+
import { muiXTelemetrySettings } from '@mui/x-license';
29+
30+
muiXTelemetrySettings.enableTelemetry();
31+
```
32+
33+
### Setting the Flag in Your Application
34+
35+
You can set the `__MUI_X_TELEMETRY_DISABLED__` flag in your application to `false` to enable telemetry:
36+
37+
```js
38+
import { ponyfillGlobal } from '@mui/utils';
39+
40+
ponyfillGlobal.__MUI_X_TELEMETRY_DISABLED__ = false;
41+
```
42+
43+
## Opting Out
44+
45+
To opt-out of telemetry, you can use one of the following methods:
46+
47+
### Setting the Environment Variable
48+
49+
You can set the `MUI_X_TELEMETRY_DISABLED` environment variable to `true` to disable telemetry:
50+
51+
```bash
52+
MUI_X_TELEMETRY_DISABLED=true
53+
```
54+
55+
> Note that some frameworks may require you to prefix the environment variable with `REACT_APP_`, `NEXT_PUBLIC_`, etc.
56+
57+
### Import telemetry settings from `@mui/x-license` package
58+
59+
You can use `muiXTelemetrySettings` to disable telemetry:
60+
61+
```js
62+
import { muiXTelemetrySettings } from '@mui/x-license';
63+
64+
muiXTelemetrySettings.disableTelemetry();
65+
```
66+
67+
### Setting the Flag in Your Application
68+
69+
You can set the `__MUI_X_TELEMETRY_DISABLED__` flag in your application to `true` to disable telemetry:
70+
71+
```js
72+
import { ponyfillGlobal } from '@mui/utils';
73+
74+
ponyfillGlobal.__MUI_X_TELEMETRY_DISABLED__ = true;
75+
```

docs/pages/_app.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import NextHead from 'next/head';
88
import PropTypes from 'prop-types';
99
import { useRouter } from 'next/router';
1010
import { LicenseInfo } from '@mui/x-license';
11+
import { muiXTelemetrySettings } from '@mui/x-telemetry';
1112
import { ponyfillGlobal } from '@mui/utils';
1213
import PageContext from 'docs/src/modules/components/PageContext';
1314
import GoogleAnalytics from 'docs/src/modules/components/GoogleAnalytics';
@@ -24,6 +25,8 @@ import { DocsProvider } from '@mui/docs/DocsProvider';
2425
import { mapTranslations } from '@mui/docs/i18n';
2526
import * as config from '../config';
2627

28+
// Enable telemetry for internal purposes
29+
muiXTelemetrySettings.enableTelemetry();
2730
// Remove the license warning from demonstration purposes
2831
LicenseInfo.setLicenseKey(process.env.NEXT_PUBLIC_MUI_LICENSE);
2932

docs/pages/x/guides/telemetry.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import * as React from 'react';
2+
import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs';
3+
import * as pageProps from 'docsx/data/guides/telemetry/telemetry.md?muiMarkdown';
4+
5+
export default function Page() {
6+
return <MarkdownDocs {...pageProps} disableAd />;
7+
}

docs/public/_redirects

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
/r/x-pro-svg-link https://mui.com/x/introduction/licensing/#pro-plan 302
2020
/r/x-premium-svg https://mui.com/static/x/premium.svg 302
2121
/r/x-premium-svg-link https://mui.com/x/introduction/licensing/#premium-plan 302
22+
/r/x-telemetry-postinstall-troubleshoot https://github.com/mui/mui-x/issues/new?assignees=&labels=status%3A+waiting+for+maintainer%2Cbug+%F0%9F%90%9B&projects=&template=1.bug.yml&title=MUI+X+Telemetry+failed+to+make+initialization 302
2223

2324
# Legacy redirection
2425
# Added in chronological order (the last line is the most recent one)

packages/x-license/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"dependencies": {
3737
"@babel/runtime": "^7.26.9",
3838
"@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0-alpha",
39+
"@mui/x-telemetry": "workspace:*",
3940
"@mui/x-internals": "workspace:*"
4041
},
4142
"peerDependencies": {

packages/x-license/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ export * from './verifyLicense';
44
export * from './useLicenseVerifier';
55
export * from './Watermark';
66
export * from './Unstable_LicenseInfoProvider';
7+
export { muiXTelemetrySettings } from '@mui/x-telemetry';

packages/x-license/src/useLicenseVerifier/useLicenseVerifier.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import * as React from 'react';
2+
import { sendMuiXTelemetryEvent, muiXTelemetryEvents } from '@mui/x-telemetry';
23
import { verifyLicense } from '../verifyLicense/verifyLicense';
34
import { LicenseInfo } from '../utils/licenseInfo';
45
import {
@@ -50,6 +51,17 @@ export function useLicenseVerifier(
5051

5152
const fullPackageName = `@mui/${packageName}`;
5253

54+
sendMuiXTelemetryEvent(
55+
muiXTelemetryEvents.licenseVerification(
56+
{ licenseKey },
57+
{
58+
packageName,
59+
packageReleaseInfo: releaseInfo,
60+
licenseStatus: licenseStatus?.status,
61+
},
62+
),
63+
);
64+
5365
if (licenseStatus.status === LICENSE_STATUS.Valid) {
5466
// Skip
5567
} else if (licenseStatus.status === LICENSE_STATUS.Invalid) {

0 commit comments

Comments
 (0)