public static void SetTraceparent(this Activity activity, string value) { if (activity.IsW3CActivity()) { return; } // we only support 00 version and ignore caller version activity.SetVersion(W3CConstants.DefaultVersion); string traceId = null, parentSpanId = null, sampledStr = null; bool isValid = false; var parts = value?.Split('-'); if (parts != null && parts.Length == 4) { traceId = parts[1]; parentSpanId = parts[2]; sampledStr = parts[3]; isValid = TraceIdRegex.IsMatch(traceId) && SpanIdRegex.IsMatch(parentSpanId); } if (isValid) { byte.TryParse(sampledStr, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var sampled); // we always defer sampling if ((sampled & W3CConstants.RequestedTraceFlag) == W3CConstants.RequestedTraceFlag) { activity.SetSampled(W3CConstants.TraceFlagRecordedAndRequested); } else { activity.SetSampled(W3CConstants.TraceFlagRecordedAndNotRequested); } activity.SetParentSpanId(parentSpanId); activity.SetSpanId(W3CUtilities.GenerateSpanId()); activity.SetTraceId(traceId); } else { activity.SetSampled(W3CConstants.TraceFlagRecordedAndNotRequested); activity.SetSpanId(W3CUtilities.GenerateSpanId()); activity.SetTraceId(W3CUtilities.GenerateTraceId()); } if (activity.Id == null) { // activity is not started yet activity.SetParentId(string.Concat("|", activity.GetTraceId(), ".", activity.GetParentSpanId(), ".")); } }
public static Activity GenerateW3CContext(this Activity activity) { activity.SetVersion(W3CConstants.DefaultVersion); activity.SetSampled(W3CConstants.TraceFlagRecordedAndNotRequested); activity.SetSpanId(W3CUtilities.GenerateSpanId()); activity.SetTraceId(activity.RootId != null && TraceIdRegex.IsMatch(activity.RootId) ? activity.RootId : W3CUtilities.GenerateTraceId()); return(activity); }