Exemple #1
0
        /// <inheritdoc/>
        public ISpan StartSpan()
        {
            SpanContext         parentContext     = FindParent(this.parentType, this.parent, this.parentSpanContext);
            var                 activeTraceParams = this.options.TraceConfig.ActiveTraceParams;
            var                 random            = this.options.RandomHandler;
            TraceId             traceId;
            var                 spanId       = SpanId.GenerateRandomId(random);
            SpanId              parentSpanId = null;
            TraceOptionsBuilder traceOptionsBuilder;

            if (parentContext == null || !parentContext.IsValid)
            {
                // New root span.
                traceId             = TraceId.GenerateRandomId(random);
                traceOptionsBuilder = TraceOptions.Builder();
            }
            else
            {
                // New child span.
                traceId             = parentContext.TraceId;
                parentSpanId        = parentContext.SpanId;
                traceOptionsBuilder = TraceOptions.Builder(parentContext.TraceOptions);
            }

            traceOptionsBuilder.SetIsSampled(
                MakeSamplingDecision(
                    parentContext,
                    this.name,
                    this.sampler,
                    this.links,
                    traceId,
                    spanId,
                    activeTraceParams));
            var traceOptions = traceOptionsBuilder.Build();
            var spanOptions  = SpanOptions.None;

            if (traceOptions.IsSampled || this.recordEvents)
            {
                spanOptions = SpanOptions.RecordEvents;
            }

            var span = Span.StartSpan(
                SpanContext.Create(traceId, spanId, traceOptions, parentContext?.Tracestate ?? Tracestate.Empty),
                spanOptions,
                this.name,
                this.kind,
                parentSpanId,
                activeTraceParams,
                this.options.StartEndHandler,
                this.timestampConverter);

            LinkSpans(span, this.links);
            return(span);
        }
        /// <summary>
        /// Creates a <see cref="ILink"/> from Activity.
        /// </summary>
        /// <param name="activity">Activity to create link from.</param>
        /// <returns>New <see cref="ILink"/> instance.</returns>
        public static ILink FromActivity(Activity activity)
        {
            var tracestate        = Tracestate.Empty;
            var tracestateBuilder = Tracestate.Builder;

            if (TracestateUtils.TryExtractTracestate(activity.TraceStateString, tracestateBuilder))
            {
                tracestate = tracestateBuilder.Build();
            }

            return(new Link(
                       SpanContext.Create(activity.TraceId, activity.SpanId, activity.ActivityTraceFlags, tracestate),
                       EmptyAttributes));
        }
Exemple #3
0
        private static SpanContext ParentContextFromActivity(Activity activity)
        {
            var tracestate        = Tracestate.Empty;
            var tracestateBuilder = Tracestate.Builder;

            if (TracestateUtils.TryExtractTracestate(activity.TraceStateString, tracestateBuilder))
            {
                tracestate = tracestateBuilder.Build();
            }

            return(SpanContext.Create(
                       activity.TraceId,
                       activity.ParentSpanId,
                       ActivityTraceFlags.Recorded,
                       tracestate));
        }
 private Span(
     Activity activity,
     Tracestate tracestate,
     SpanKind spanKind,
     ITraceParams traceParams,
     IStartEndHandler startEndHandler,
     bool ownsActivity)
 {
     this.Activity    = activity;
     this.spanContext = new Lazy <SpanContext>(() => SpanContext.Create(
                                                   this.Activity.TraceId,
                                                   this.Activity.SpanId,
                                                   this.Activity.ActivityTraceFlags,
                                                   tracestate));
     this.Name              = this.Activity.OperationName;
     this.traceParams       = traceParams ?? throw new ArgumentNullException(nameof(traceParams));
     this.startEndHandler   = startEndHandler;
     this.Kind              = spanKind;
     this.OwnsActivity      = ownsActivity;
     this.IsRecordingEvents = this.Activity.Recorded;
 }
Exemple #5
0
        /// <summary>
        /// Creates a <see cref="ILink"/> from Activity.
        /// </summary>
        /// <param name="activity">Activity to create link from.</param>
        /// <returns>New <see cref="ILink"/> instance.</returns>
        public static ILink FromActivity(Activity activity)
        {
            if (activity == null)
            {
                throw new ArgumentNullException(nameof(activity));
            }

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

            var tracestate        = Tracestate.Empty;
            var tracestateBuilder = Tracestate.Builder;

            if (TracestateUtils.TryExtractTracestate(activity.TraceStateString, tracestateBuilder))
            {
                tracestate = tracestateBuilder.Build();
            }

            return(new Link(
                       SpanContext.Create(activity.TraceId, activity.SpanId, activity.ActivityTraceFlags, tracestate),
                       EmptyAttributes));
        }
Exemple #6
0
        private ISpan StartSpanInternal(
            ISpanContext parent,
            bool hasRemoteParent,
            string name,
            ISampler sampler,
            IEnumerable <ISpan> parentLinks,
            bool recordEvents,
            Timer timestampConverter)
        {
            ITraceParams        activeTraceParams = this.Options.TraceConfig.ActiveTraceParams;
            IRandomGenerator    random            = this.Options.RandomHandler;
            ITraceId            traceId;
            ISpanId             spanId       = SpanId.GenerateRandomId(random);
            ISpanId             parentSpanId = null;
            TraceOptionsBuilder traceOptionsBuilder;

            if (parent == null || !parent.IsValid)
            {
                // New root span.
                traceId             = TraceId.GenerateRandomId(random);
                traceOptionsBuilder = TraceOptions.Builder();

                // This is a root span so no remote or local parent.
                // hasRemoteParent = null;
                hasRemoteParent = false;
            }
            else
            {
                // New child span.
                traceId             = parent.TraceId;
                parentSpanId        = parent.SpanId;
                traceOptionsBuilder = TraceOptions.Builder(parent.TraceOptions);
            }

            traceOptionsBuilder.SetIsSampled(
                MakeSamplingDecision(
                    parent,
                    hasRemoteParent,
                    name,
                    sampler,
                    parentLinks,
                    traceId,
                    spanId,
                    activeTraceParams));
            TraceOptions traceOptions = traceOptionsBuilder.Build();
            SpanOptions  spanOptions  = SpanOptions.None;

            if (traceOptions.IsSampled || recordEvents)
            {
                spanOptions = SpanOptions.RecordEvents;
            }

            ISpan span = Span.StartSpan(
                SpanContext.Create(traceId, spanId, traceOptions, parent?.Tracestate ?? Tracestate.Empty),
                spanOptions,
                name,
                parentSpanId,
                hasRemoteParent,
                activeTraceParams,
                this.Options.StartEndHandler,
                timestampConverter);

            LinkSpans(span, parentLinks);
            span.Kind = this.Kind;
            return(span);
        }