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