Skip to content

Commit 6f96fc5

Browse files
committed
GH-1306 Preserve AWS X-Ray Context In Spring Cloud Function Custom Runtime
1 parent ec3a436 commit 6f96fc5

1 file changed

Lines changed: 32 additions & 0 deletions

File tree

  • spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws

spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/CustomRuntimeEventLoop.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.springframework.http.RequestEntity;
4949
import org.springframework.http.ResponseEntity;
5050
import org.springframework.messaging.Message;
51+
import org.springframework.messaging.support.MessageBuilder;
5152
import org.springframework.util.Assert;
5253
import 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

Comments
 (0)