in aws-xray-agent/src/main/java/com/amazonaws/xray/agent/runtime/handlers/upstream/ServletHandler.java [34:70]
public void handleRequest(Event event) {
HttpServletNetworkRequestEvent requestEvent = (HttpServletNetworkRequestEvent) event;
// For Spring Boot apps, the trace ID injection libraries will not be visible on classpath until after startup,
// so we must try to lazy load them as early as possible
XRaySDKConfiguration.getInstance().lazyLoadTraceIdInjection(getGlobalRecorder());
// HttpEvents are seen as servlet invocations, so in every request, we mark that we are serving an Http request
// In X-Ray's context, this means that if we receive a activity event, to start generating a segment.
XRayTransactionState transactionState = getTransactionState();
addRequestDataToTransactionState(requestEvent, transactionState);
boolean ipForwarded = addClientIPToTransactionState(requestEvent, transactionState);
// TODO Fix request event bug so that getHeaderData is lower cased. This needs to be case insensitive
// See: https://github.com/awslabs/disco/issues/14
String headerData = requestEvent.getHeaderData(HEADER_KEY.toLowerCase());
if (headerData == null) {
headerData = requestEvent.getHeaderData(HEADER_KEY);
}
transactionState.withTraceheaderString(headerData);
TraceHeader traceHeader = TraceHeader.fromString(transactionState.getTraceHeader());
Segment segment = beginSegment(XRayTransactionState.getServiceName(), traceHeader);
// Obtain sampling decision
boolean shouldSample = getSamplingDecision(transactionState);
segment.setSampled(shouldSample);
// Add HTTP Information
Map<String, Object> requestAttributes = new HashMap<>();
requestAttributes.put(URL_KEY, transactionState.getURL());
requestAttributes.put(USER_AGENT_KEY, transactionState.getUserAgent());
requestAttributes.put(METHOD_KEY, transactionState.getMethod());
requestAttributes.put(CLIENT_IP_KEY, transactionState.getClientIP());
if (ipForwarded) requestAttributes.put(FORWARDED_FOR_ATTRIB, true);
segment.putHttp(HTTP_REQUEST_KEY, requestAttributes);
}