@@ -394,4 +394,69 @@ describe('getAutomaticRequestLogger', () => {
394394 }
395395 } )
396396 } )
397+
398+ describe ( 'pod identity fields in production logs' , ( ) => {
399+ // Helper to build a minimal mock res/req and trigger res.end
400+ async function runMiddlewareAndCapture (
401+ middleware : ReturnType <
402+ typeof import ( '@/observability/logger/middleware/get-automatic-request-logger' ) . getAutomaticRequestLogger
403+ > ,
404+ ) : Promise < string [ ] > {
405+ const logs : string [ ] = [ ]
406+ const savedLog = console . log
407+ console . log = vi . fn ( ( msg : string ) => logs . push ( msg ) )
408+
409+ const req = { method : 'GET' , url : '/test' , originalUrl : '/test' }
410+ const originalEnd = vi . fn ( )
411+ const res = {
412+ statusCode : 200 ,
413+ getHeader : vi . fn ( ( ) => '0' ) ,
414+ end : originalEnd ,
415+ }
416+ const next = vi . fn ( )
417+
418+ middleware ( req as Request , res as unknown as Response , next )
419+ ; ( res as unknown as { end : ( ) => void } ) . end ( )
420+ await new Promise ( ( resolve ) => setTimeout ( resolve , 20 ) )
421+
422+ console . log = savedLog
423+ return logs
424+ }
425+
426+ it ( 'should include podName, podNamespace, nodeHostname in logfmt output when env vars are set' , async ( ) => {
427+ vi . stubEnv ( 'POD_NAME' , 'webapp-abc123' )
428+ vi . stubEnv ( 'POD_NAMESPACE' , 'docs-internal-staging-cedar' )
429+ vi . stubEnv ( 'KUBE_NODE_HOSTNAME' , 'ghe-k8s-node-42' )
430+ vi . stubEnv ( 'LOG_LIKE_PRODUCTION' , 'true' )
431+ vi . stubEnv ( 'NODE_ENV' , 'production' )
432+
433+ vi . resetModules ( )
434+ const { getAutomaticRequestLogger : freshGetMiddleware } =
435+ await import ( '@/observability/logger/middleware/get-automatic-request-logger' )
436+
437+ const logs = await runMiddlewareAndCapture ( freshGetMiddleware ( ) )
438+ expect ( logs ) . toHaveLength ( 1 )
439+ expect ( logs [ 0 ] ) . toContain ( 'podName=webapp-abc123' )
440+ expect ( logs [ 0 ] ) . toContain ( 'podNamespace=docs-internal-staging-cedar' )
441+ expect ( logs [ 0 ] ) . toContain ( 'nodeHostname=ghe-k8s-node-42' )
442+ } )
443+
444+ it ( 'should not include pod identity fields when env vars are absent' , async ( ) => {
445+ vi . stubEnv ( 'LOG_LIKE_PRODUCTION' , 'true' )
446+ vi . stubEnv ( 'NODE_ENV' , 'production' )
447+ delete process . env . POD_NAME
448+ delete process . env . POD_NAMESPACE
449+ delete process . env . KUBE_NODE_HOSTNAME
450+
451+ vi . resetModules ( )
452+ const { getAutomaticRequestLogger : freshGetMiddleware } =
453+ await import ( '@/observability/logger/middleware/get-automatic-request-logger' )
454+
455+ const logs = await runMiddlewareAndCapture ( freshGetMiddleware ( ) )
456+ expect ( logs ) . toHaveLength ( 1 )
457+ expect ( logs [ 0 ] ) . not . toContain ( 'podName=' )
458+ expect ( logs [ 0 ] ) . not . toContain ( 'podNamespace=' )
459+ expect ( logs [ 0 ] ) . not . toContain ( 'nodeHostname=' )
460+ } )
461+ } )
397462} )
0 commit comments