/// <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; }
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; }
/// <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); }
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; }
/// <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; }
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); }
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); }
/// <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; }
public static bool IsSampled(this ActivityTraceFlags activityTraceFlags) { return((activityTraceFlags & ActivityTraceFlags.Recorded) != 0); }