示例#1
0
 /// <summary>
 /// Construct a new object of ActivityContext.
 /// </summary>
 /// <param name="traceId"> A trace identifier.</param>
 /// <param name="spanId"> A span identifier </param>
 /// <param name="traceFlags">Contain details about the trace.</param>
 /// <param name="traceState"> Carries system-specific configuration data.</param>
 public ActivityContext(ActivityTraceId traceId, ActivitySpanId spanId, ActivityTraceFlags traceFlags, string?traceState = null)
 {
     TraceId    = traceId;
     SpanId     = spanId;
     TraceFlags = traceFlags;
     TraceState = traceState;
 }
示例#2
0
 private SpanContext(ActivityTraceId traceId, ActivitySpanId spanId, ActivityTraceFlags traceOptions, Tracestate tracestate)
 {
     this.TraceId      = traceId;
     this.SpanId       = spanId;
     this.TraceOptions = traceOptions;
     this.Tracestate   = tracestate;
 }
 public ActivityContext(ActivityTraceId traceId, ActivitySpanId spanId, ActivityTraceFlags flags, ActivityTraceState traceState)
 {
     TraceId    = traceId;
     SpanId     = spanId;
     Flags      = flags;
     TraceState = traceState;
 }
示例#4
0
 /// <summary>
 /// Construct a new object of ActivityContext.
 /// </summary>
 /// <param name="traceId">A trace identifier.</param>
 /// <param name="spanId">A span identifier.</param>
 /// <param name="traceFlags">Contain details about the trace.</param>
 /// <param name="traceState">Carries system-specific configuration data.</param>
 /// <param name="isRemote">Indicate the context is propagated from remote parent.</param>
 /// <remarks>
 /// isRemote is not a part of W3C specification. It is needed for the OpenTelemetry scenarios.
 /// </remarks>
 public ActivityContext(ActivityTraceId traceId, ActivitySpanId spanId, ActivityTraceFlags traceFlags, string?traceState = null, bool isRemote = false)
 {
     TraceId    = traceId;
     SpanId     = spanId;
     TraceFlags = traceFlags;
     TraceState = traceState;
     IsRemote   = isRemote;
 }
        public void AlwaysOffSampler_AlwaysReturnFalse(ActivityTraceFlags flags)
        {
            var parentContext = new ActivityContext(this.traceId, this.parentSpanId, flags);
            var link          = new ActivityLink(parentContext);

            Assert.Equal(
                SamplingDecision.Drop,
                new AlwaysOffSampler().ShouldSample(new SamplingParameters(parentContext, this.traceId, "Another name", ActivityKindServer, null, new List <ActivityLink> {
                link
            })).Decision);
        }
示例#6
0
        public TraceParent(ActivityTraceId traceId, ActivitySpanId spanId, ActivityTraceFlags flags = ActivityTraceFlags.None, string version = DefaultVersion)
        {
            if (string.IsNullOrWhiteSpace(version))
            {
                throw new ArgumentException("message", nameof(version));
            }

            TraceId = traceId;
            SpanId  = spanId;
            Flags   = flags;
            Version = version;
        }
示例#7
0
        /// <summary>
        /// Construct a new object of ActivityContext.
        /// </summary>
        /// <param name="traceId"> A trace identifier.</param>
        /// <param name="spanId"> A span identifier </param>
        /// <param name="traceFlags">Contain details about the trace.</param>
        /// <param name="traceState"> Carries system-specific configuration data.</param>
        public ActivityContext(ActivityTraceId traceId, ActivitySpanId spanId, ActivityTraceFlags traceFlags, string?traceState = null)
        {
            // We don't allow creating context with invalid span or trace Ids.
            if (traceId == default || spanId == default)
            {
                throw new ArgumentException(SR.SpanIdOrTraceIdInvalid, traceId == default ? nameof(traceId) : nameof(spanId));
            }

            TraceId    = traceId;
            SpanId     = spanId;
            TraceFlags = traceFlags;
            TraceState = traceState;
        }
示例#8
0
        public void AlwaysOnSampler_AlwaysReturnTrue(ActivityTraceFlags flags)
        {
            var parentContext = new ActivityContext(this.traceId, this.parentSpanId, flags);
            var link          = new ActivityLink(parentContext);

            Assert.True(
                new AlwaysOnSampler()
                .ShouldSample(new SamplingParameters(
                                  parentContext,
                                  this.traceId,
                                  "Another name",
                                  ActivityKindServer,
                                  null,
                                  new List <ActivityLink> {
                link
            })).IsSampled);
        }
        public static TraceParent CreateFromString(string traceparent)
        {
            if (string.IsNullOrWhiteSpace(traceparent))
            {
                throw new ArgumentException("Invalid traceparent", nameof(traceparent));
            }

            var vals = traceparent.Split('-', StringSplitOptions.RemoveEmptyEntries);

            if (vals.Length != 4)
            {
                throw new ArgumentException("Invalid traceparent format: {traceparent}", traceparent);
            }

            // TODO: validate each item
            ActivityTraceFlags flags = vals[3] == "01" ? ActivityTraceFlags.Recorded : ActivityTraceFlags.None;

            return(new TraceParent(vals[1], vals[2], flags, vals[0]));
        }
        public void AlwaysOffSampler_AlwaysReturnFalse(ActivityTraceFlags flags)
        {
            var parentContext = new ActivityContext(traceId, parentSpanId, flags);
            var link          = new ActivityLink(parentContext);

            Assert.False(
                new AlwaysOffActivitySampler()
                .ShouldSample(
                    parentContext,
                    traceId,
                    spanId,
                    "Another name",
                    ActivityKindServer,
                    null,
                    new List <ActivityLink>()
            {
                link
            }).IsSampled);
        }
示例#11
0
        internal static bool TryExtractTraceparent(string traceparent, out ActivityTraceId traceId, out ActivitySpanId spanId, out ActivityTraceFlags traceOptions)
        {
            // from https://github.com/w3c/distributed-tracing/blob/master/trace_context/HTTP_HEADER_FORMAT.md
            // traceparent: 00-0af7651916cd43dd8448eb211c80319c-00f067aa0ba902b7-01

            traceId      = default;
            spanId       = default;
            traceOptions = default;
            var bestAttempt = false;

            if (string.IsNullOrWhiteSpace(traceparent) || traceparent.Length < TraceparentLengthV0)
            {
                return(false);
            }

            // if version does not end with delimiter
            if (traceparent[VersionPrefixIdLength - 1] != '-')
            {
                return(false);
            }

            // or version is not a hex (will throw)
            var version0 = HexCharToByte(traceparent[0]);
            var version1 = HexCharToByte(traceparent[1]);

            if (version0 == 0xf && version1 == 0xf)
            {
                return(false);
            }

            if (version0 > 0)
            {
                // expected version is 00
                // for higher versions - best attempt parsing of trace id, span id, etc.
                bestAttempt = true;
            }

            if (traceparent[VersionAndTraceIdLength - 1] != '-')
            {
                return(false);
            }

            try
            {
                traceId = ActivityTraceId.CreateFromString(traceparent.AsSpan().Slice(VersionPrefixIdLength, TraceIdLength));
            }
            catch (ArgumentOutOfRangeException)
            {
                // it's ok to still parse tracestate
                return(false);
            }

            if (traceparent[VersionAndTraceIdAndSpanIdLength - 1] != '-')
            {
                return(false);
            }

            byte options1;

            try
            {
                spanId   = ActivitySpanId.CreateFromString(traceparent.AsSpan().Slice(VersionAndTraceIdLength, SpanIdLength));
                options1 = HexCharToByte(traceparent[VersionAndTraceIdAndSpanIdLength + 1]);
            }
            catch (ArgumentOutOfRangeException)
            {
                // it's ok to still parse tracestate
                return(false);
            }

            if ((options1 & 1) == 1)
            {
                traceOptions |= ActivityTraceFlags.Recorded;
            }

            if ((!bestAttempt) && (traceparent.Length != VersionAndTraceIdAndSpanIdLength + OptionsLength))
            {
                return(false);
            }

            if (bestAttempt)
            {
                if ((traceparent.Length > TraceparentLengthV0) && (traceparent[TraceparentLengthV0] != '-'))
                {
                    return(false);
                }
            }

            return(true);
        }
示例#12
0
 /// <summary>
 /// Creates a new <see cref="SpanContext"/> with the given identifiers and options.
 /// </summary>
 /// <param name="traceId">The <see cref="ActivityTraceId"/> to associate with the <see cref="SpanContext"/>.</param>
 /// <param name="spanId">The <see cref="ActivitySpanId"/> to associate with the <see cref="SpanContext"/>.</param>
 /// <param name="traceOptions">The <see cref="TraceOptions"/> to associate with the <see cref="SpanContext"/>.</param>
 /// <param name="tracestate">The <see cref="Tracestate"/> to associate with the <see cref="SpanContext"/>.</param>
 /// <returns>A new <see cref="SpanContext"/> with the given identifiers and options.</returns>
 public static SpanContext Create(ActivityTraceId traceId, ActivitySpanId spanId, ActivityTraceFlags traceOptions, Tracestate tracestate)
 {
     return(new SpanContext(traceId, spanId, traceOptions, tracestate));
 }
 public System.Diagnostics.Activity SetParentId(System.Diagnostics.ActivityTraceId traceId, System.Diagnostics.ActivitySpanId spanId, ActivityTraceFlags activityTraceFlags = ActivityTraceFlags.None)
 {
     throw null;
 }
示例#14
0
 public static bool IsSampled(this ActivityTraceFlags activityTraceFlags)
 {
     return((activityTraceFlags & ActivityTraceFlags.Recorded) != 0);
 }