@@ -15,6 +15,7 @@ import {
1515 TextMapSetter ,
1616 INVALID_SPAN_CONTEXT ,
1717 SpanStatusCode ,
18+ ROOT_CONTEXT ,
1819} from '@opentelemetry/api' ;
1920import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node' ;
2021import { Instrumentation } from '@opentelemetry/instrumentation' ;
@@ -695,6 +696,50 @@ describe('InstrumentationPatchTest', () => {
695696 ) . toBeTruthy ( ) ;
696697 expect ( mockSpan . setAttribute . calledWith ( AWS_ATTRIBUTE_KEYS . AWS_AUTH_REGION , 'us-west-2' ) ) . toBeTruthy ( ) ;
697698 } ) ;
699+
700+ it ( 'Skips credential extraction with non-injectable NoOp context' , async ( ) => {
701+ let credentialsProviderCallCount = 0 ;
702+ const NoOpContext = Object . create ( ROOT_CONTEXT ) ;
703+ NoOpContext . setValue = function ( ) {
704+ return this ;
705+ } ;
706+ NoOpContext . deleteValue = function ( ) {
707+ return this ;
708+ } ;
709+
710+ const mockSpan = sinon . createStubInstance ( SDKSpan ) ;
711+ const ctx = trace . setSpan ( NoOpContext , mockSpan as unknown as Span ) ;
712+
713+ sinon . stub ( otelContext , 'active' ) . returns ( ctx ) ;
714+ sinon . stub ( trace , 'getSpan' ) . returns ( mockSpan as unknown as Span ) ;
715+
716+ const middlewareStack : any [ ] = [ ] ;
717+ const recursiveSdkSend = extractAwsSdkInstrumentation ( PATCHED_INSTRUMENTATIONS )
718+ [ '_getV3SmithyClientSendPatch' ] ( ( ) => Promise . resolve ( ) )
719+ . bind ( {
720+ middlewareStack : { add : ( middleware : any , config : any ) => middlewareStack . push ( [ middleware , config ] ) } ,
721+ config : {
722+ // Credentials provider that recursively calls SDK (simulates STS)
723+ credentials : async ( ) => {
724+ credentialsProviderCallCount ++ ;
725+ await middlewareStack [ 1 ] [ 0 ] ( ( ) => Promise . resolve ( ) , null ) ( { } ) ;
726+ return { accessKeyId : 'test-access-key' } ;
727+ } ,
728+ region : ( ) => Promise . resolve ( 'us-west-2' ) ,
729+ } ,
730+ } ) ;
731+
732+ // Initial SDK call triggers middleware setup
733+ await recursiveSdkSend ( { } , null ) ;
734+
735+ // Execute credentials extraction middleware
736+ await middlewareStack [ 1 ] [ 0 ] ( ( ) => Promise . resolve ( ) , null ) ( { } ) ;
737+
738+ expect ( credentialsProviderCallCount ) . toBe ( 0 ) ;
739+ expect (
740+ mockSpan . setAttribute . calledWith ( AWS_ATTRIBUTE_KEYS . AWS_AUTH_ACCOUNT_ACCESS_KEY , 'test-access-key' )
741+ ) . toBeFalsy ( ) ;
742+ } ) ;
698743 } ) ;
699744
700745 it ( 'prevents recursion when credentials provider makes STS calls' , async ( ) => {
0 commit comments