in sdk/src/Handlers/AwsSdk/Internal/XRayPipelineHandler.cs [338:412]
private void ProcessEndRequest(IExecutionContext executionContext)
{
Entity subsegment;
try
{
subsegment = _recorder.GetEntity();
}
catch(EntityNotAvailableException e)
{
_recorder.TraceContext.HandleEntityMissing(_recorder,e,"Cannot get entity from the trace context while processing response of AWS SDK request.");
return;
}
var responseContext = executionContext.ResponseContext;
var requestContext = executionContext.RequestContext;
if (responseContext == null)
{
_logger.DebugFormat("Failed to handle AfterResponseEvent, because response is null.");
return;
}
var client = executionContext.RequestContext.ClientConfig;
if (client == null)
{
_logger.DebugFormat("Failed to handle AfterResponseEvent, because client from the Response Context is null");
return;
}
var serviceName = RemoveAmazonPrefixFromServiceName(requestContext.Request.ServiceName);
var operation = RemoveSuffix(requestContext.OriginalRequest.GetType().Name, "Request");
subsegment.Aws["region"] = client.RegionEndpoint?.SystemName;
subsegment.Aws["operation"] = operation;
if (responseContext.Response == null)
{
if (requestContext.Request.Headers.TryGetValue("x-amzn-RequestId", out string requestId))
{
subsegment.Aws["request_id"] = requestId;
}
// s3 doesn't follow request header id convention
else
{
if (requestContext.Request.Headers.TryGetValue("x-amz-request-id", out requestId))
{
subsegment.Aws["request_id"] = requestId;
}
if (requestContext.Request.Headers.TryGetValue("x-amz-id-2", out requestId))
{
subsegment.Aws["id_2"] = requestId;
}
}
}
else
{
subsegment.Aws["request_id"] = responseContext.Response.ResponseMetadata.RequestId;
// try getting x-amz-id-2 if dealing with s3 request
if (responseContext.Response.ResponseMetadata.Metadata.TryGetValue("x-amz-id-2", out string extendedRequestId))
{
subsegment.Aws["id_2"] = extendedRequestId;
}
AddResponseSpecificInformation(serviceName, operation, responseContext.Response, subsegment.Aws);
}
if (responseContext.HttpResponse != null)
{
AddHttpInformation(responseContext.HttpResponse);
}
AddRequestSpecificInformation(serviceName, operation, requestContext.OriginalRequest, subsegment.Aws);
_recorder.EndSubsegment();
}