@@ -7,6 +7,10 @@ import { MACHINE_METADATA } from "./constants.js";
7
7
import { EventCache } from "./eventCache.js" ;
8
8
import nodeMachineId from "node-machine-id" ;
9
9
import { getDeviceId } from "@mongodb-js/device-id" ;
10
+ import fs from "fs/promises" ;
11
+ import os from "os" ;
12
+ import path from "path" ;
13
+ import { randomUUID } from "crypto" ;
10
14
11
15
type EventResult = {
12
16
success : boolean ;
@@ -15,6 +19,26 @@ type EventResult = {
15
19
16
20
export const DEVICE_ID_TIMEOUT = 3000 ;
17
21
22
+ async function fileExists ( filepath : string ) : Promise < boolean > {
23
+ try {
24
+ await fs . stat ( filepath ) ;
25
+ return true ;
26
+ } catch {
27
+ return false ;
28
+ }
29
+ }
30
+
31
+ async function isContainerEnv ( ) : Promise < boolean > {
32
+ if ( await fileExists ( "/.dockerenv" ) ) {
33
+ return true ;
34
+ }
35
+ return process . env . container != "" ;
36
+ }
37
+
38
+ function containerIdFilePath ( ) : string {
39
+ return path . join ( os . homedir ( ) , ".mongodb" , "container" , ".containerId" ) ;
40
+ }
41
+
18
42
export class Telemetry {
19
43
private isBufferingEvents : boolean = true ;
20
44
/** Resolves when the device ID is retrieved or timeout occurs */
@@ -74,6 +98,22 @@ export class Telemetry {
74
98
abortSignal : this . deviceIdAbortController . signal ,
75
99
} ) ;
76
100
101
+ const containerEnv = await isContainerEnv ( ) ;
102
+
103
+ if ( containerEnv ) {
104
+ const filePath = containerIdFilePath ( ) ;
105
+ const exists = await fileExists ( filePath ) ;
106
+ let content : string ;
107
+ if ( exists ) {
108
+ content = await fs . readFile ( filePath , "utf8" ) ;
109
+ } else {
110
+ content = randomUUID ( ) . toString ( ) ;
111
+ await fs . mkdir ( path . dirname ( filePath ) , { recursive : true } ) ;
112
+ await fs . writeFile ( filePath , content , "utf8" ) ;
113
+ }
114
+ this . commonProperties . container_id = content ;
115
+ }
116
+
77
117
this . commonProperties . device_id = await this . deviceIdPromise ;
78
118
79
119
this . isBufferingEvents = false ;
0 commit comments