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);
        }