@@ -272,6 +272,56 @@ describe('init.js', () => {
272272
273273 testInjectionScenarios ( 'require' , 'init.js' , false )
274274 testRuntimeVersionChecks ( 'require' , 'init.js' )
275+
276+ describe ( 'PM2 cluster mode' , ( ) => {
277+ useEnv ( { NODE_OPTIONS : '--require dd-trace/init' } )
278+
279+ afterEach ( ( ) => {
280+ delete process . env . pm2_env
281+ } )
282+
283+ function checkEnv ( expectedValues ) {
284+ return testFile ( 'init/pm2-env.js' , out => {
285+ const env = JSON . parse ( out . trim ( ) )
286+ for ( const [ key , value ] of Object . entries ( expectedValues ) ) {
287+ assert . strictEqual ( env [ key ] , value , `expected env.${ key } to equal ${ value } ` )
288+ }
289+ } , [ ] , '' )
290+ }
291+
292+ it ( 'applies all env vars from pm2_env blob to process.env' , ( ) => {
293+ process . env . pm2_env = JSON . stringify ( { DD_SERVICE : 'pm2-svc' , DD_ENV : 'pm2-env' , MY_APP_VAR : 'hello' } )
294+ return checkEnv ( { DD_SERVICE : 'pm2-svc' , DD_ENV : 'pm2-env' , MY_APP_VAR : 'hello' } )
295+ } )
296+
297+ it ( 'coerces non-string values to strings' , ( ) => {
298+ process . env . pm2_env = JSON . stringify ( { DD_TRACE_SAMPLE_RATE : 0.5 } )
299+ return checkEnv ( { DD_TRACE_SAMPLE_RATE : '0.5' } )
300+ } )
301+
302+ it ( 'skips keys with null values' , ( ) => {
303+ process . env . pm2_env = JSON . stringify ( { DD_SERVICE : null } )
304+ return checkEnv ( { DD_SERVICE : undefined } )
305+ } )
306+
307+ it ( 'does not crash on malformed pm2_env JSON' , ( ) => {
308+ process . env . pm2_env = 'not-valid-json'
309+ return checkEnv ( { DD_SERVICE : undefined } )
310+ } )
311+
312+ it ( 'does nothing when pm2_env is absent' , ( ) => {
313+ return checkEnv ( { DD_SERVICE : undefined } )
314+ } )
315+
316+ describe ( 'when env vars are already set' , ( ) => {
317+ useEnv ( { DD_SERVICE : 'original-service' , MY_APP_VAR : 'original' } )
318+
319+ it ( 'overwrites existing env vars with pm2_env values' , ( ) => {
320+ process . env . pm2_env = JSON . stringify ( { DD_SERVICE : 'pm2-service' , MY_APP_VAR : 'pm2-value' } )
321+ return checkEnv ( { DD_SERVICE : 'pm2-service' , MY_APP_VAR : 'pm2-value' } )
322+ } )
323+ } )
324+ } )
275325} )
276326
277327// ESM is not supportable prior to Node.js 14.13.1 on the 14.x line,
0 commit comments