in src/sdk/Utils/AspNetCoreRequestUtil.cs [64:125]
internal static void ProcessRequest(HttpContext httpContext)
{
HttpRequest request = httpContext.Request;
string headerString = null;
if (request.Headers.TryGetValue(TraceHeader.HeaderKey, out StringValues headerValue))
{
if (headerValue.Count >= 1)
headerString = headerValue[0];
}
if (!TraceHeader.TryParse(headerString, out TraceHeader traceHeader))
{
_logger.DebugFormat("Trace header doesn't exist or not valid : ({0}). Injecting a new one.", headerString);
traceHeader = new TraceHeader
{
RootTraceId = TraceId.NewId(),
ParentId = null,
Sampled = SampleDecision.Unknown
};
}
var segmentName = SegmentNamingStrategy.GetSegmentName(request);
bool isSampleDecisionRequested = traceHeader.Sampled == SampleDecision.Requested;
string ruleName = null;
// Make sample decision
if (traceHeader.Sampled == SampleDecision.Unknown || traceHeader.Sampled == SampleDecision.Requested)
{
string host = request.Host.Host;
string url = request.Path;
string method = request.Method;
SamplingInput samplingInput = new SamplingInput(host, url, method, segmentName, _recorder.Origin);
SamplingResponse sampleResponse = _recorder.SamplingStrategy.ShouldTrace(samplingInput);
traceHeader.Sampled = sampleResponse.SampleDecision;
ruleName = sampleResponse.RuleName;
}
if (AWSXRayRecorder.IsLambda())
{
_recorder.BeginSubsegment(segmentName);
}
else
{
SamplingResponse samplingResponse = new SamplingResponse(ruleName, traceHeader.Sampled); // get final ruleName and SampleDecision
_recorder.BeginSegment(SegmentNamingStrategy.GetSegmentName(request), traceHeader.RootTraceId, traceHeader.ParentId, samplingResponse);
}
if (!AWSXRayRecorder.Instance.IsTracingDisabled())
{
var requestAttributes = PopulateRequestAttributes(request);
_recorder.AddHttpInformation("request", requestAttributes);
}
// Mark the segment as auto-instrumented
AgentUtil.AddAutoInstrumentationMark();
if (isSampleDecisionRequested)
{
httpContext.Response.Headers.Add(TraceHeader.HeaderKey, traceHeader.ToString()); // Its recommended not to modify response header after _next.Invoke() call
}
}