Skip to content

Commit 1ea261a

Browse files
committed
chore: reinstate telemetry/docker change after revert (MCP-49)
1 parent d7d4aa9 commit 1ea261a

File tree

4 files changed

+34
-8
lines changed

4 files changed

+34
-8
lines changed

src/telemetry/telemetry.ts

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { MACHINE_METADATA } from "./constants.js";
77
import { EventCache } from "./eventCache.js";
88
import nodeMachineId from "node-machine-id";
99
import { getDeviceId } from "@mongodb-js/device-id";
10+
import fs from "fs/promises";
1011

1112
type EventResult = {
1213
success: boolean;
@@ -18,7 +19,7 @@ export const DEVICE_ID_TIMEOUT = 3000;
1819
export class Telemetry {
1920
private isBufferingEvents: boolean = true;
2021
/** Resolves when the device ID is retrieved or timeout occurs */
21-
public deviceIdPromise: Promise<string> | undefined;
22+
public dataPromise: Promise<[string, boolean]> | undefined;
2223
private deviceIdAbortController = new AbortController();
2324
private eventCache: EventCache;
2425
private getRawMachineId: () => Promise<string>;
@@ -52,11 +53,32 @@ export class Telemetry {
5253
return instance;
5354
}
5455

56+
private async isContainerEnv(): Promise<boolean> {
57+
if (process.platform !== "linux") {
58+
return false; // we only support linux containers for now
59+
}
60+
61+
if (process.env.container) {
62+
return true;
63+
}
64+
65+
const exists = await Promise.all(["/.dockerenv", "/run/.containerenv", "/var/run/.containerenv"].map(async (file) => {
66+
try {
67+
await fs.access(file);
68+
return true;
69+
} catch {
70+
return false;
71+
}
72+
}));
73+
74+
return exists.includes(true);
75+
}
76+
5577
private async start(): Promise<void> {
5678
if (!this.isTelemetryEnabled()) {
5779
return;
5880
}
59-
this.deviceIdPromise = getDeviceId({
81+
this.dataPromise = Promise.all([getDeviceId({
6082
getMachineId: () => this.getRawMachineId(),
6183
onError: (reason, error) => {
6284
switch (reason) {
@@ -72,9 +94,12 @@ export class Telemetry {
7294
}
7395
},
7496
abortSignal: this.deviceIdAbortController.signal,
75-
});
97+
}), this.isContainerEnv()]);
98+
99+
const [deviceId, containerEnv] = await this.dataPromise;
76100

77-
this.commonProperties.device_id = await this.deviceIdPromise;
101+
this.commonProperties.device_id = deviceId;
102+
this.commonProperties.is_container_env = containerEnv;
78103

79104
this.isBufferingEvents = false;
80105
}

src/telemetry/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ export type CommonStaticProperties = {
6666
*/
6767
export type CommonProperties = {
6868
device_id?: string;
69+
is_container_env?: boolean;
6970
mcp_client_version?: string;
7071
mcp_client_name?: string;
7172
config_atlas_auth?: TelemetryBoolSet;

tests/integration/telemetry.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ describe("Telemetry", () => {
2020
expect(telemetry.getCommonProperties().device_id).toBe(undefined);
2121
expect(telemetry["isBufferingEvents"]).toBe(true);
2222

23-
await telemetry.deviceIdPromise;
23+
await telemetry.dataPromise;
2424

2525
expect(telemetry.getCommonProperties().device_id).toBe(actualHashedId);
2626
expect(telemetry["isBufferingEvents"]).toBe(false);

tests/unit/telemetry.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ describe("Telemetry", () => {
219219
expect(telemetry["isBufferingEvents"]).toBe(true);
220220
expect(telemetry.getCommonProperties().device_id).toBe(undefined);
221221

222-
await telemetry.deviceIdPromise;
222+
await telemetry.dataPromise;
223223

224224
expect(telemetry["isBufferingEvents"]).toBe(false);
225225
expect(telemetry.getCommonProperties().device_id).toBe(hashedMachineId);
@@ -235,7 +235,7 @@ describe("Telemetry", () => {
235235
expect(telemetry["isBufferingEvents"]).toBe(true);
236236
expect(telemetry.getCommonProperties().device_id).toBe(undefined);
237237

238-
await telemetry.deviceIdPromise;
238+
await telemetry.dataPromise;
239239

240240
expect(telemetry["isBufferingEvents"]).toBe(false);
241241
expect(telemetry.getCommonProperties().device_id).toBe("unknown");
@@ -263,7 +263,7 @@ describe("Telemetry", () => {
263263

264264
jest.advanceTimersByTime(DEVICE_ID_TIMEOUT);
265265

266-
await telemetry.deviceIdPromise;
266+
await telemetry.dataPromise;
267267

268268
expect(telemetry.getCommonProperties().device_id).toBe("unknown");
269269
expect(telemetry["isBufferingEvents"]).toBe(false);

0 commit comments

Comments
 (0)