Skip to content

Commit 8ce42a3

Browse files
author
ariesclark
committed
fix(telemetry): make DO_NOT_TRACK actually disable metrics
1 parent 0611ea9 commit 8ce42a3

6 files changed

Lines changed: 94 additions & 6 deletions

File tree

.changeset/nine-taxis-shave.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
"create-cloudflare": patch
3+
"@cloudflare/workers-utils": patch
4+
"wrangler": patch
5+
---
6+
7+
Support the `DO_NOT_TRACK` environment variable as a telemetry opt-out
8+
9+
Setting `DO_NOT_TRACK=1` (see https://donottrack.sh/) disables telemetry in both Wrangler and `create-cloudflare`. The tool-specific variables `WRANGLER_SEND_METRICS` and `CREATE_CLOUDFLARE_TELEMETRY_DISABLED` still take precedence.

packages/create-cloudflare/src/__tests__/metrics.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,33 @@ describe("createReporter", () => {
259259
expect(sendEvent).toHaveBeenCalledTimes(0);
260260
});
261261

262+
test("sends no event if the DO_NOT_TRACK env is set to '1'", async ({
263+
expect,
264+
}) => {
265+
vi.stubEnv("DO_NOT_TRACK", "1");
266+
267+
const deferred = promiseWithResolvers<string>();
268+
const reporter = createReporter();
269+
const operation = reporter.collectAsyncMetrics({
270+
eventPrefix: "c3 session",
271+
props: {
272+
args: {
273+
projectName: "app",
274+
},
275+
},
276+
promise: () => deferred.promise,
277+
});
278+
279+
expect(reporter.isEnabled).toBe(false);
280+
281+
expect(sendEvent).toHaveBeenCalledTimes(0);
282+
283+
deferred.resolve("test result");
284+
285+
await expect(operation).resolves.toBe("test result");
286+
expect(sendEvent).toHaveBeenCalledTimes(0);
287+
});
288+
262289
test("sends started and cancelled event to sparrow if the promise reject with a CancelError", async ({
263290
expect,
264291
}) => {

packages/create-cloudflare/src/metrics.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { AsyncLocalStorage } from "node:async_hooks";
22
import { setTimeout } from "node:timers/promises";
33
import { logRaw } from "@cloudflare/cli-shared-helpers";
44
import { CancelError } from "@cloudflare/cli-shared-helpers/error";
5+
import { isDoNotTrackEnabled } from "@cloudflare/workers-utils";
56
import {
67
getDeviceId,
78
readMetricsConfig,
@@ -110,7 +111,10 @@ export function createReporter() {
110111
}
111112

112113
function isTelemetryEnabled() {
113-
if (process.env.CREATE_CLOUDFLARE_TELEMETRY_DISABLED === "1" || process.env.DO_NOT_TRACK === "1") {
114+
if (
115+
process.env.CREATE_CLOUDFLARE_TELEMETRY_DISABLED === "1" ||
116+
isDoNotTrackEnabled()
117+
) {
114118
return false;
115119
}
116120

packages/workers-utils/src/environment-variables/misc-variables.ts

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,35 @@ export const getC3CommandFromEnv = getEnvironmentVariableFactory({
3737
defaultValue: () => "create cloudflare",
3838
});
3939

40+
const getDoNotTrackFromEnv = getEnvironmentVariableFactory({
41+
variableName: "DO_NOT_TRACK",
42+
});
43+
4044
/**
41-
* `WRANGLER_SEND_METRICS` and `DO_NOT_TRACK` can override whether we attempt to send
42-
* metrics information to Sparrow.
45+
* `DO_NOT_TRACK` is a shared telemetry opt-out convention: https://donottrack.sh/
4346
*/
44-
export const getWranglerSendMetricsFromEnv =
47+
export function isDoNotTrackEnabled(): boolean {
48+
const value = getDoNotTrackFromEnv()?.toLowerCase();
49+
return value === "1" || value === "true";
50+
}
51+
52+
const getWranglerSendMetricsVariableFromEnv =
4553
getBooleanEnvironmentVariableFactory({
4654
variableName: "WRANGLER_SEND_METRICS",
47-
}) || getBooleanEnvironmentVariableFactory({
48-
variableName: "DO_NOT_TRACK",
4955
});
5056

57+
/**
58+
* `WRANGLER_SEND_METRICS` can override whether we attempt to send metrics information to Sparrow.
59+
*
60+
* When it is unset, `DO_NOT_TRACK` opts out of sending metrics.
61+
*/
62+
export function getWranglerSendMetricsFromEnv(): boolean | undefined {
63+
return (
64+
getWranglerSendMetricsVariableFromEnv() ??
65+
(isDoNotTrackEnabled() ? false : undefined)
66+
);
67+
}
68+
5169
/**
5270
* `WRANGLER_SEND_ERROR_REPORTS` controls whether we attempt to send error reports to Sentry.
5371
*

packages/wrangler/src/__tests__/metrics.test.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,34 @@ describe("metrics", () => {
679679
});
680680
});
681681

682+
it("should return enabled false if the DO_NOT_TRACK environment variable is set", async ({
683+
expect,
684+
}) => {
685+
vi.stubEnv("DO_NOT_TRACK", "1");
686+
expect(await getMetricsConfig({ sendMetrics: true })).toMatchObject({
687+
enabled: false,
688+
});
689+
});
690+
691+
it("should let the WRANGLER_SEND_METRICS environment variable override DO_NOT_TRACK", async ({
692+
expect,
693+
}) => {
694+
vi.stubEnv("DO_NOT_TRACK", "1");
695+
vi.stubEnv("WRANGLER_SEND_METRICS", "true");
696+
expect(await getMetricsConfig({})).toMatchObject({
697+
enabled: true,
698+
});
699+
});
700+
701+
it("should ignore DO_NOT_TRACK if it is not set to an opt-out value", async ({
702+
expect,
703+
}) => {
704+
vi.stubEnv("DO_NOT_TRACK", "0");
705+
expect(await getMetricsConfig({ sendMetrics: true })).toMatchObject({
706+
enabled: true,
707+
});
708+
});
709+
682710
it("should return the sendMetrics argument for enabled if it is defined", async ({
683711
expect,
684712
}) => {

packages/wrangler/telemetry.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ Wrangler also honors [`DO_NOT_TRACK`](https://donottrack.sh/), a shared opt-out
8181
export DO_NOT_TRACK=1
8282
```
8383

84+
Setting `WRANGLER_SEND_METRICS` takes precedence, so `WRANGLER_SEND_METRICS=true` re-enables Wrangler telemetry even when `DO_NOT_TRACK` is set.
85+
8486
If you would like to re-enable telemetry globally, you can run:
8587

8688
```sh

0 commit comments

Comments
 (0)