public IDisposable SetContextSource(Func <TContext> access, Func <TContext, TContext> exchange)
        {
            var prior = _source;

            _source = new ContextSource(access, exchange);
            return(new Disposable(this, prior));
        }
Exemplo n.º 2
0
        /// <inheritdoc />
        public ISpanBuilder SetCreateChild(bool createChild)
        {
            if (!createChild)
            {
                var currentActivity = Activity.Current;

                if (currentActivity == null)
                {
                    throw new ArgumentException("Current Activity cannot be null");
                }

                if (currentActivity.IdFormat != ActivityIdFormat.W3C)
                {
                    throw new ArgumentException("Current Activity is not in W3C format");
                }

                if (currentActivity.StartTimeUtc == default || currentActivity.Duration != default)
                {
                    throw new ArgumentException(
                              "Current Activity is not running: it has not been started or has been stopped");
                }

                this.fromActivity  = currentActivity;
                this.contextSource = ContextSource.Activity;
            }
            else
            {
                this.contextSource = ContextSource.CurrentActivityParent;
            }

            this.parentSpanContext = null;
            this.parentSpanContext = null;
            this.parentActivity    = null;
            return(this);
        }
Exemplo n.º 3
0
        public void Execute(ContextSource src, out Token ret)
        {
            var ipt = _interpreterPool.GetObject();

            try
            {
                var current = CompileState.Body;
                for (int i = 0; i != src.count; i++)
                {
                    ipt.Execute(src.body[i + src.offset], ref current);
                    if (current == CompileState.Finish)
                    {
                        ipt.Commit();
                        current = CompileState.Body;
                    }
                }
            }
            catch (NotImplementedException e) { }
            catch (InvalidOperationException e) { }
            catch (Exception e) { }
            finally
            {
                ret = ipt.Result;
                _interpreterPool.PutObject(ipt);
            }
        }
Exemplo n.º 4
0
 /// <inheritdoc/>
 public ISpanBuilder SetNoParent()
 {
     this.contextSource     = ContextSource.NoParent;
     this.parentSpanContext = null;
     this.parentSpanContext = null;
     this.parentActivity    = null;
     return(this);
 }
Exemplo n.º 5
0
 /// <inheritdoc/>
 public ISpanBuilder SetParent(SpanContext remoteParent)
 {
     this.parentSpanContext = remoteParent ?? throw new ArgumentNullException(nameof(remoteParent));
     this.parentSpan        = null;
     this.parentActivity    = null;
     this.contextSource     = ContextSource.ExplicitRemoteParent;
     return(this);
 }
Exemplo n.º 6
0
 /// <inheritdoc/>
 public ISpanBuilder SetParent(Activity parentActivity)
 {
     this.parentActivity    = parentActivity ?? throw new ArgumentNullException(nameof(parentActivity));
     this.contextSource     = ContextSource.ExplicitActivityParent;
     this.parentSpanContext = null;
     this.parentSpan        = null;
     return(this);
 }
Exemplo n.º 7
0
 public MigContext(ContextSource source, object data)
 {
     Source = source;
     Data = data;
 }
 public Disposable(ContextAccessor <TContext> contextAccessor, ContextSource source)
 {
     _contextAccessor = contextAccessor;
     _source          = source;
 }
 public ContextAccessor()
 {
     _source = new ContextSource();
 }
Exemplo n.º 10
0
 public MigContext(ContextSource source, object data)
 {
     Source = source;
     Data   = data;
 }
Exemplo n.º 11
0
 /// <summary>
 /// Initializes new member context by providing all required properties.
 /// </summary>
 /// <param name="member">Inforation about member selected by builder.</param>
 /// <param name="context">Builder-specific context associated with selected member.</param>
 /// <param name="source">Indicates what has triggered context creation.</param>
 /// <exception cref="ArgumentNullException"><paramref name="member"/> or <paramref name="context"/> is null.</exception>
 public MemberContext(SelectedMember member, TContext context, ContextSource source)
 {
     Member  = member ?? throw new ArgumentNullException(nameof(member));
     Context = context;
     Source  = source;
 }
Exemplo n.º 12
0
        private Activity CreateActivityForSpan(ContextSource contextSource, ISpan explicitParent, SpanContext remoteParent, Activity explicitParentActivity, Activity fromActivity)
        {
            Activity spanActivity        = null;
            Activity originalActivity    = Activity.Current;
            bool     needRestoreOriginal = true;

            switch (contextSource)
            {
            case ContextSource.CurrentActivityParent:
            {
                // Activity will figure out its parent
                spanActivity = new Activity(this.name)
                               .SetIdFormat(ActivityIdFormat.W3C)
                               .Start();

                // chances are, Activity.Current has span attached
                if (CurrentSpanUtils.CurrentSpan is Span currentSpan)
                {
                    this.parentSpanContext = currentSpan.Context;
                }
                else
                {
                    this.parentSpanContext = ParentContextFromActivity(spanActivity);
                }

                break;
            }

            case ContextSource.ExplicitActivityParent:
            {
                spanActivity = new Activity(this.name)
                               .SetParentId(this.parentActivity.TraceId,
                                            this.parentActivity.SpanId,
                                            this.parentActivity.ActivityTraceFlags)
                               .Start();
                spanActivity.TraceStateString = this.parentActivity.TraceStateString;
                this.parentSpanContext        = ParentContextFromActivity(spanActivity);
                break;
            }

            case ContextSource.NoParent:
            {
                spanActivity = new Activity(this.name)
                               .SetIdFormat(ActivityIdFormat.W3C)
                               .SetParentId(" ")
                               .Start();
                this.parentSpanContext = null;
                break;
            }

            case ContextSource.Activity:
            {
                this.parentSpanContext = ParentContextFromActivity(this.fromActivity);
                spanActivity           = this.fromActivity;
                needRestoreOriginal    = false;
                break;
            }

            case ContextSource.ExplicitRemoteParent:
            {
                spanActivity = new Activity(this.name);
                if (this.parentSpanContext.IsValid)
                {
                    spanActivity.SetParentId(this.parentSpanContext.TraceId,
                                             this.parentSpanContext.SpanId,
                                             this.parentSpanContext.TraceOptions);
                }

                spanActivity.SetIdFormat(ActivityIdFormat.W3C);
                spanActivity.TraceStateString = this.parentSpanContext.Tracestate.ToString();
                spanActivity.Start();

                break;
            }

            case ContextSource.ExplicitSpanParent:
            {
                spanActivity = new Activity(this.name);
                if (this.parentSpan.Context.IsValid)
                {
                    spanActivity.SetParentId(this.parentSpan.Context.TraceId,
                                             this.parentSpan.Context.SpanId,
                                             this.parentSpan.Context.TraceOptions);
                }

                spanActivity.SetIdFormat(ActivityIdFormat.W3C);
                spanActivity.TraceStateString = this.parentSpan.Context.Tracestate.ToString();
                spanActivity.Start();

                this.parentSpanContext = this.parentSpan.Context;
                break;
            }

            default:
                throw new ArgumentException($"Unknown parentType {contextSource}");
            }

            if (needRestoreOriginal)
            {
                // Activity Start always puts Activity on top of Current stack
                // in OpenTelemetry we ask users to enable implicit propagation by calling WithSpan
                // it will set Current Activity and attach span to it.
                // we need to work with .NET team to allow starting Activities without updating Current
                // As a workaround here we are undoing updating Current
                Activity.Current = originalActivity;
            }

            return(spanActivity);
        }