4848import org .springframework .http .RequestEntity ;
4949import org .springframework .http .ResponseEntity ;
5050import org .springframework .messaging .Message ;
51+ import org .springframework .messaging .support .MessageBuilder ;
5152import org .springframework .util .Assert ;
5253import org .springframework .web .client .RestTemplate ;
5354
@@ -147,6 +148,8 @@ private void eventLoop(ConfigurableApplicationContext context) {
147148
148149 ByteArrayInputStream is = new ByteArrayInputStream (response .getBody ().getBytes (StandardCharsets .UTF_8 ));
149150 Message <?> requestMessage = AWSLambdaUtils .generateMessage (is , function .getInputType (), function .isSupplier (), mapper , clientContext );
151+ requestMessage = enrichTraceHeaders (response .getHeaders (), requestMessage );
152+
150153 Object functionResponse = function .apply (requestMessage );
151154
152155 byte [] responseBytes = AWSLambdaUtils .generateOutputFromObject (requestMessage , functionResponse , mapper , function .getOutputType ());
@@ -170,6 +173,35 @@ private void eventLoop(ConfigurableApplicationContext context) {
170173 }
171174 }
172175
176+ private Message <?> enrichTraceHeaders (HttpHeaders headers , Message <?> message ) {
177+ String runtimeTrace = trim (headers .getFirst ("Lambda-Runtime-Trace-Id" ));
178+ String envTrace = trim (System .getenv ("_X_AMZN_TRACE_ID" ));
179+ String headerTrace = trim (headers .getFirst ("X-Amzn-Trace-Id" ));
180+
181+ // prefer Lambda runtime header, then environment, then inbound header
182+ String resolved = runtimeTrace != null ? runtimeTrace
183+ : envTrace != null ? envTrace
184+ : headerTrace ;
185+
186+ if (resolved != null ) {
187+ System .setProperty ("com.amazonaws.xray.traceHeader" , resolved );
188+ }
189+ else {
190+ System .clearProperty ("com.amazonaws.xray.traceHeader" );
191+ return message ;
192+ }
193+
194+ return MessageBuilder .fromMessage (message )
195+ .setHeader ("Lambda-Runtime-Trace-Id" , runtimeTrace != null ? runtimeTrace : resolved )
196+ .setHeader ("X-Amzn-Trace-Id" , resolved )
197+ .setHeader ("_X_AMZN_TRACE_ID" , envTrace != null ? envTrace : resolved )
198+ .build ();
199+ }
200+
201+ private String trim (String value ) {
202+ return (value == null || value .isBlank ()) ? null : value .trim ();
203+ }
204+
173205 private Context generateClientContext (HttpHeaders headers ) {
174206
175207 Map <String , String > environment = System .getenv ();
0 commit comments