in WEB/Src/DependencyCollector/DependencyCollector/HttpCoreDiagnosticSourceListener.cs [535:637]
private void InjectRequestHeaders(HttpRequestMessage request, string instrumentationKey)
{
try
{
HttpRequestHeaders requestHeaders = request.Headers;
if (requestHeaders != null && this.setComponentCorrelationHttpHeaders && !this.correlationDomainExclusionList.Contains(request.RequestUri.Host))
{
string sourceApplicationId = null;
try
{
if (!string.IsNullOrEmpty(instrumentationKey)
&& !HttpHeadersUtilities.ContainsRequestContextKeyValue(requestHeaders, RequestResponseHeaders.RequestContextCorrelationSourceKey)
&& (this.configuration.ApplicationIdProvider?.TryGetApplicationId(instrumentationKey, out sourceApplicationId) ?? false))
{
HttpHeadersUtilities.SetRequestContextKeyValue(requestHeaders, RequestResponseHeaders.RequestContextCorrelationSourceKey, sourceApplicationId);
}
}
catch (Exception e)
{
AppMapCorrelationEventSource.Log.UnknownError(ExceptionUtilities.GetExceptionDetailString(e));
}
var currentActivity = Activity.Current;
switch (this.httpInstrumentationVersion)
{
case HttpInstrumentationVersion.V1:
// HttpClient does not add any headers
// add W3C or Request-Id depending on Activity format
// add correlation-context anyway
if (currentActivity.IdFormat == ActivityIdFormat.W3C)
{
InjectW3CHeaders(currentActivity, requestHeaders);
if (this.injectRequestIdInW3CMode)
{
InjectBackCompatibleRequestId(currentActivity, requestHeaders);
}
}
else
{
if (!requestHeaders.Contains(RequestResponseHeaders.RequestIdHeader))
{
requestHeaders.Add(RequestResponseHeaders.RequestIdHeader, currentActivity.Id);
}
}
InjectCorrelationContext(requestHeaders, currentActivity);
break;
case HttpInstrumentationVersion.V2:
// On V2, HttpClient adds Request-Id and Correlation-Context
// but not W3C
if (currentActivity.IdFormat == ActivityIdFormat.W3C)
{
// we are going to add W3C and Request-Id (in W3C-compatible format)
// as a result HttpClient will not add Request-Id AND Correlation-Context
InjectW3CHeaders(currentActivity, requestHeaders);
if (this.injectRequestIdInW3CMode)
{
InjectBackCompatibleRequestId(currentActivity, requestHeaders);
}
InjectCorrelationContext(requestHeaders, currentActivity);
}
break;
case HttpInstrumentationVersion.V3:
// on V3, HttpClient adds either W3C or Request-Id depending on Activity format
// and adds Correlation-Context
if (currentActivity.IdFormat == ActivityIdFormat.W3C && this.injectRequestIdInW3CMode)
{
// we are going to override Request-Id to be in W3C compatible mode
InjectBackCompatibleRequestId(currentActivity, requestHeaders);
}
break;
}
if (this.injectLegacyHeaders)
{
// Add the root ID (Activity.RootId works with W3C and Hierarchical format)
string rootId = currentActivity.RootId;
if (!string.IsNullOrEmpty(rootId) && !requestHeaders.Contains(RequestResponseHeaders.StandardRootIdHeader))
{
requestHeaders.Add(RequestResponseHeaders.StandardRootIdHeader, rootId);
}
// Add the parent ID
string parentId = currentActivity.IdFormat == ActivityIdFormat.W3C ?
currentActivity.SpanId.ToHexString() :
currentActivity.Id;
if (!string.IsNullOrEmpty(parentId) && !requestHeaders.Contains(RequestResponseHeaders.StandardParentIdHeader))
{
requestHeaders.Add(RequestResponseHeaders.StandardParentIdHeader, parentId);
}
}
}
}
catch (Exception e)
{
AppMapCorrelationEventSource.Log.UnknownError(ExceptionUtilities.GetExceptionDetailString(e));
}
}