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); }
private static Activity UpdateContextFromParent(this Activity activity) { if (activity != null && activity.Tags.All(t => t.Key != W3CConstants.TraceIdTag)) { if (activity.Parent == null) { activity.GenerateW3CContext(); } else { foreach (var tag in activity.Parent.Tags) { switch (tag.Key) { case W3CConstants.TraceIdTag: activity.SetTraceId(tag.Value); break; case W3CConstants.SpanIdTag: activity.SetParentSpanId(tag.Value); activity.SetSpanId(W3CUtilities.GenerateSpanId()); break; case W3CConstants.VersionTag: activity.SetVersion(tag.Value); break; case W3CConstants.SampledTag: activity.SetSampled(tag.Value); break; case W3CConstants.TracestateTag: activity.SetTracestate(tag.Value); break; } } } } return(activity); }