in sdk/src/Core/Internal/Entities/TraceHeader.cs [69:128]
public static bool TryParse(string rawHeader, out TraceHeader header)
{
header = null;
try
{
if (string.IsNullOrEmpty(rawHeader))
{
return false;
}
var result = new TraceHeader();
Dictionary<string, string> keyValuePairs = rawHeader.Split(_validSeparators, StringSplitOptions.RemoveEmptyEntries)
.Select(value => value.Trim().Split('='))
.ToDictionary(pair => pair[0], pair => pair[1]);
// Root trace id is required
if (!keyValuePairs.TryGetValue(RootKey, out string tmpValue))
{
return false;
}
if (!TraceId.IsIdValid(tmpValue))
{
return false;
}
result.RootTraceId = tmpValue;
// Parent id is optional
if (keyValuePairs.TryGetValue(ParentKey, out tmpValue))
{
if (!Entity.IsIdValid(tmpValue))
{
return false;
}
result.ParentId = tmpValue;
}
// Sample decision is optional
if (keyValuePairs.TryGetValue(SampledKey, out tmpValue) && char.TryParse(tmpValue, out char tmpChar))
{
if (Enum.IsDefined(typeof(SampleDecision), (int)tmpChar))
{
result.Sampled = (SampleDecision)tmpChar;
}
}
header = result;
return true;
}
catch (IndexOutOfRangeException e)
{
_logger.Error(e, "Invalid trace header from string: {0}", rawHeader);
return false;
}
}