internal static bool ShouldSample(SpanContext parentContext, string name, ISampler sampler, out SpanContext context, out SpanId parentSpanId) { var traceId = TraceId.Invalid; var tracestate = Tracestate.Empty; parentSpanId = SpanId.Invalid; var parentOptions = TraceOptions.Default; if (parentContext.IsValid) { traceId = parentContext.TraceId; parentSpanId = parentContext.SpanId; parentOptions = parentContext.TraceOptions; } else { traceId = TraceId.FromBytes(Guid.NewGuid().ToByteArray()); } var result = parentOptions.IsSampled; var spanId = SpanId.FromBytes(Guid.NewGuid().ToByteArray(), 8); var traceOptions = TraceOptions.Default; if (sampler != null) { var builder = TraceOptions.Builder(parentContext.TraceOptions); result = sampler.ShouldSample(parentContext, traceId, spanId, name, null); builder = builder.SetIsSampled(result); traceOptions = builder.Build(); } context = SpanContext.Create(traceId, spanId, traceOptions, parentContext.Tracestate); return(result); }
public void Builder_FromOptions() { Assert.Equal(6 | 1, TraceOptions.Builder(TraceOptions.FromBytes(thirdBytes)) .SetIsSampled(true) .Build() .Options); }
public void SpanContext_ToString() { Assert.Contains(TraceId.FromBytes(firstTraceIdBytes).ToString(), first.ToString()); Assert.Contains(SpanId.FromBytes(firstSpanIdBytes).ToString(), first.ToString()); Assert.Contains(TraceOptions.DEFAULT.ToString(), first.ToString()); Assert.Contains(TraceId.FromBytes(secondTraceIdBytes).ToString(), second.ToString()); Assert.Contains(SpanId.FromBytes(secondSpanIdBytes).ToString(), second.ToString()); Assert.Contains(TraceOptions.Builder().SetIsSampled(true).Build().ToString(), second.ToString()); }
public SamplersTest() { traceId = TraceId.GenerateRandomId(random); parentSpanId = SpanId.GenerateRandomId(random); spanId = SpanId.GenerateRandomId(random); sampledSpanContext = SpanContext.Create(traceId, parentSpanId, TraceOptions.Builder().SetIsSampled(true).Build(), Tracestate.Empty); notSampledSpanContext = SpanContext.Create(traceId, parentSpanId, TraceOptions.Default, Tracestate.Empty); sampledSpan = new TestSpan(sampledSpanContext, SpanOptions.RecordEvents); }
public SamplersTest() { traceId = TraceId.GenerateRandomId(random); parentSpanId = SpanId.GenerateRandomId(random); spanId = SpanId.GenerateRandomId(random); sampledSpanContext = SpanContext.Create(traceId, parentSpanId, TraceOptions.Builder().SetIsSampled(true).Build()); notSampledSpanContext = SpanContext.Create(traceId, parentSpanId, TraceOptions.DEFAULT); sampledSpan = new NoopSpan(sampledSpanContext, SpanOptions.RECORD_EVENTS); }
public SamplersTest() { traceId = TraceId.GenerateRandomId(random); parentSpanId = SpanId.GenerateRandomId(random); spanId = SpanId.GenerateRandomId(random); sampledSpanContext = SpanContext.Create(traceId, parentSpanId, TraceOptions.Builder().SetIsSampled(true).Build(), Tracestate.Empty); notSampledSpanContext = SpanContext.Create(traceId, parentSpanId, TraceOptions.Default, Tracestate.Empty); sampledLink = Link.FromSpanContext(sampledSpanContext); }
/// <inheritdoc/> public SpanContext Extract <T>(T carrier, Func <T, string, IEnumerable <string> > getter) { if (carrier == null) { throw new ArgumentNullException(nameof(carrier)); } if (getter == null) { throw new ArgumentNullException(nameof(getter)); } try { TraceId traceId; var traceIdStr = getter(carrier, XB3TraceId)?.FirstOrDefault(); if (traceIdStr != null) { if (traceIdStr.Length == TraceId.Size) { // This is an 8-byte traceID. traceIdStr = UpperTraceId + traceIdStr; } traceId = TraceId.FromLowerBase16(traceIdStr); } else { throw new SpanContextParseException("Missing X_B3_TRACE_ID."); } SpanId spanId; var spanIdStr = getter(carrier, XB3SpanId)?.FirstOrDefault(); if (spanIdStr != null) { spanId = SpanId.FromLowerBase16(spanIdStr); } else { throw new SpanContextParseException("Missing X_B3_SPAN_ID."); } var traceOptions = TraceOptions.Default; if (SampledValue.Equals(getter(carrier, XB3Sampled)?.FirstOrDefault()) || FlagsValue.Equals(getter(carrier, XB3Flags)?.FirstOrDefault())) { traceOptions = TraceOptions.Builder().SetIsSampled(true).Build(); } return(SpanContext.Create(traceId, spanId, traceOptions, Tracestate.Empty)); } catch (Exception e) { throw new SpanContextParseException("Invalid input.", e); } }
public override ISpanContext Extract <C>(C carrier, IGetter <C> getter) { if (carrier == null) { throw new ArgumentNullException(nameof(carrier)); } if (getter == null) { throw new ArgumentNullException(nameof(getter)); } try { ITraceId traceId; string traceIdStr = getter.Get(carrier, X_B3_TRACE_ID); if (traceIdStr != null) { if (traceIdStr.Length == TraceId.SIZE) { // This is an 8-byte traceID. traceIdStr = UPPER_TRACE_ID + traceIdStr; } traceId = TraceId.FromLowerBase16(traceIdStr); } else { throw new SpanContextParseException("Missing X_B3_TRACE_ID."); } ISpanId spanId; string spanIdStr = getter.Get(carrier, X_B3_SPAN_ID); if (spanIdStr != null) { spanId = SpanId.FromLowerBase16(spanIdStr); } else { throw new SpanContextParseException("Missing X_B3_SPAN_ID."); } TraceOptions traceOptions = TraceOptions.DEFAULT; if (SAMPLED_VALUE.Equals(getter.Get(carrier, X_B3_SAMPLED)) || FLAGS_VALUE.Equals(getter.Get(carrier, X_B3_FLAGS))) { traceOptions = TraceOptions.Builder().SetIsSampled(true).Build(); } return(SpanContext.Create(traceId, spanId, traceOptions)); } catch (Exception e) { throw new SpanContextParseException("Invalid input.", e); } }
public void GetOptions() { Assert.Equal(0, TraceOptions.DEFAULT.Options); Assert.Equal(0, TraceOptions.Builder().SetIsSampled(false).Build().Options); Assert.Equal(1, TraceOptions.Builder().SetIsSampled(true).Build().Options); Assert.Equal(0, TraceOptions.Builder().SetIsSampled(true).SetIsSampled(false).Build().Options); Assert.Equal(-1, TraceOptions.FromBytes(FirstBytes).Options); Assert.Equal(1, TraceOptions.FromBytes(SecondBytes).Options); Assert.Equal(6, TraceOptions.FromBytes(ThirdBytes).Options); }
public void getOptions() { Assert.Equal(0, TraceOptions.Default.Options); Assert.Equal(0, TraceOptions.Builder().SetIsSampled(false).Build().Options); Assert.Equal(1, TraceOptions.Builder().SetIsSampled(true).Build().Options); Assert.Equal(0, TraceOptions.Builder().SetIsSampled(true).SetIsSampled(false).Build().Options); Assert.Equal(-1, TraceOptions.FromBytes(firstBytes).Options); Assert.Equal(1, TraceOptions.FromBytes(secondBytes).Options); Assert.Equal(6, TraceOptions.FromBytes(thirdBytes).Options); }
public SpanBaseTest() { random = new RandomGenerator(1234); spanContext = SpanContext.Create( TraceId.GenerateRandomId(random), SpanId.GenerateRandomId(random), TraceOptions.Builder().SetIsSampled(true).Build()); notSampledSpanContext = SpanContext.Create( TraceId.GenerateRandomId(random), SpanId.GenerateRandomId(random), TraceOptions.DEFAULT); spanOptions = SpanOptions.RECORD_EVENTS; }
public SpanBaseTest() { random = new RandomGenerator(1234); spanContext = SpanContext.Create( TraceId.GenerateRandomId(random), SpanId.GenerateRandomId(random), TraceOptions.Builder().SetIsSampled(true).Build(), Tracestate.Empty); notSampledSpanContext = SpanContext.Create( TraceId.GenerateRandomId(random), SpanId.GenerateRandomId(random), TraceOptions.Default, Tracestate.Empty); spanOptions = SpanOptions.RecordEvents; }
public CurrentSpanUtilsTest() { random = new RandomGenerator(1234); spanContext = SpanContext.Create( TraceId.GenerateRandomId(random), SpanId.GenerateRandomId(random), TraceOptions.Builder().SetIsSampled(true).Build()); spanOptions = SpanOptions.RECORD_EVENTS; var mockSpan = new Mock <NoopSpan>(spanContext, spanOptions) { CallBase = true }; span = mockSpan.Object; }
public CurrentSpanUtilsTest() { random = new RandomGenerator(1234); spanContext = SpanContext.Create( TraceId.GenerateRandomId(random), SpanId.GenerateRandomId(random), TraceOptions.Builder().SetIsSampled(true).Build(), Tracestate.Empty); spanOptions = SpanOptions.RecordEvents; var mockSpan = new Mock <TestSpan>() { CallBase = true }; span = mockSpan.Object; }
public void traceOptions_ToString() { Assert.Contains("sampled=False", TraceOptions.Default.ToString()); Assert.Contains("sampled=True", TraceOptions.Builder().SetIsSampled(true).Build().ToString()); }
public void Propagate_SpanContextTracingEnabled() { TestSpanContextConversion( SpanContext.Create(TRACE_ID, SPAN_ID, TraceOptions.Builder().SetIsSampled(true).Build(), Tracestate.Empty)); }
public void IsSampled() { Assert.False(TraceOptions.Default.IsSampled); Assert.True(TraceOptions.Builder().SetIsSampled(true).Build().IsSampled); }
private bool TryExtractTraceparent(string traceparent, out TraceId traceId, out SpanId spanId, out TraceOptions traceoptions) { // from https://github.com/w3c/distributed-tracing/blob/master/trace_context/HTTP_HEADER_FORMAT.md // traceparent: 00-0af7651916cd43dd8448eb211c80319c-00f067aa0ba902b7-01 traceId = TraceId.Invalid; spanId = SpanId.Invalid; traceoptions = TraceOptions.Default; var bestAttempt = false; if (string.IsNullOrWhiteSpace(traceparent)) { return(false); } // if version does not end with delimeter if (traceparent.Length < VersionPrefixIdLength || traceparent[VersionPrefixIdLength - 1] != '-') { return(false); } // or version is not a hex (will throw) var versionArray = Arrays.StringToByteArray(traceparent, 0, VersionLength); if (versionArray[0] == 255) { return(false); } if (versionArray[0] > 0) { // expected version is 00 // for higher versions - best attempt parsing of trace id, span id, etc. bestAttempt = true; } if (traceparent.Length < VersionAndTraceIdLength || traceparent[VersionAndTraceIdLength - 1] != '-') { return(false); } try { traceId = TraceId.FromBytes(Arrays.StringToByteArray(traceparent, VersionPrefixIdLength, TraceIdLength)); } catch (ArgumentOutOfRangeException) { // it's ok to still parse tracestate return(false); } if (traceparent.Length < VersionAndTraceIdAndSpanIdLength || traceparent[VersionAndTraceIdAndSpanIdLength - 1] != '-') { return(false); } try { spanId = SpanId.FromBytes(Arrays.StringToByteArray(traceparent, VersionAndTraceIdLength, SpanIdLength)); } catch (ArgumentOutOfRangeException) { // it's ok to still parse tracestate return(false); } if (traceparent.Length < VersionAndTraceIdAndSpanIdLength + OptionsLength) { return(false); } byte[] optionsArray; try { optionsArray = Arrays.StringToByteArray(traceparent, VersionAndTraceIdAndSpanIdLength, OptionsLength); } catch (ArgumentOutOfRangeException) { // it's ok to still parse tracestate return(false); } if ((optionsArray[0] | 1) == 1) { traceoptions = TraceOptions.Builder().SetIsSampled(true).Build(); } if ((!bestAttempt) && (traceparent.Length != VersionAndTraceIdAndSpanIdLength + OptionsLength)) { return(false); } if (bestAttempt) { if ((traceparent.Length > VersionAndTraceIdAndSpanIdLength + OptionsLength) && (traceparent[VersionAndTraceIdAndSpanIdLength + OptionsLength] != '-')) { return(false); } } return(true); }
public void StartRemoteChildSpan_WithProbabilitySamplerDefaultSampler() { var configMock = Mock.Get <ITraceConfig>(traceConfig); configMock.Setup((c) => c.ActiveTraceParams).Returns(TraceParams.Default); // This traceId will not be sampled by the ProbabilitySampler because the first 8 bytes as long // is not less than probability * Long.MAX_VALUE; var traceId = TraceId.FromBytes( new byte[] { 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, }); // If parent is sampled then the remote child must be sampled. var childSpan = new SpanBuilder(SpanName, spanBuilderOptions) .SetSpanKind(SpanKind.Internal) .SetParent(SpanContext.Create( traceId, SpanId.GenerateRandomId(randomHandler), TraceOptions.Builder().SetIsSampled(true).Build(), Tracestate.Empty)) .StartSpan(); Assert.True(childSpan.Context.IsValid); Assert.Equal(traceId, childSpan.Context.TraceId); Assert.True(childSpan.Context.TraceOptions.IsSampled); childSpan.End(); Assert.Equal(TraceParams.Default, traceConfig.ActiveTraceParams); // If parent is not sampled then the remote child must be not sampled. childSpan = new SpanBuilder(SpanName, spanBuilderOptions) .SetSpanKind(SpanKind.Internal) .SetParent(SpanContext.Create( traceId, SpanId.GenerateRandomId(randomHandler), TraceOptions.Default, Tracestate.Empty)) .StartSpan(); Assert.True(childSpan.Context.IsValid); Assert.Equal(traceId, childSpan.Context.TraceId); Assert.False(childSpan.Context.TraceOptions.IsSampled); childSpan.End(); }
public SpanExporterTest() { sampledSpanContext = SpanContext.Create(TraceId.GenerateRandomId(random), SpanId.GenerateRandomId(random), TraceOptions.Builder().SetIsSampled(true).Build(), Tracestate.Empty); notSampledSpanContext = SpanContext.Create(TraceId.GenerateRandomId(random), SpanId.GenerateRandomId(random), TraceOptions.Default, Tracestate.Empty); startEndHandler = new StartEndHandler(spanExporter, runningSpanStore, null, new SimpleEventQueue()); spanExporter.RegisterHandler("test.service", serviceHandler); }
public void StartRemoteChildSpan_WithProbabilitySamplerDefaultSampler() { var configMock = Mock.Get <ITraceConfig>(traceConfig); configMock.Setup((c) => c.ActiveTraceParams).Returns(TraceParams.DEFAULT); // This traceId will not be sampled by the ProbabilitySampler because the first 8 bytes as long // is not less than probability * Long.MAX_VALUE; ITraceId traceId = TraceId.FromBytes( new byte[] { (byte)0x8F, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, 0, 0, 0, 0, 0, 0, 0, 0 }); // If parent is sampled then the remote child must be sampled. ISpan childSpan = SpanBuilder.CreateWithRemoteParent( SPAN_NAME, SpanContext.Create( traceId, SpanId.GenerateRandomId(randomHandler), TraceOptions.Builder().SetIsSampled(true).Build()), spanBuilderOptions) .StartSpan(); Assert.True(childSpan.Context.IsValid); Assert.Equal(traceId, childSpan.Context.TraceId); Assert.True(childSpan.Context.TraceOptions.IsSampled); childSpan.End(); Assert.Equal(TraceParams.DEFAULT, traceConfig.ActiveTraceParams); // If parent is not sampled then the remote child must be not sampled. childSpan = SpanBuilder.CreateWithRemoteParent( SPAN_NAME, SpanContext.Create( traceId, SpanId.GenerateRandomId(randomHandler), TraceOptions.DEFAULT), spanBuilderOptions) .StartSpan(); Assert.True(childSpan.Context.IsValid); Assert.Equal(traceId, childSpan.Context.TraceId); Assert.False(childSpan.Context.TraceOptions.IsSampled); childSpan.End(); }
public InProcessSampledSpanStoreTest() { timestamp = Timestamp.FromDateTimeOffset(startTime); timestampConverter = Timer.StartNew(startTime, () => interval); sampledSpanContext = SpanContext.Create(TraceId.GenerateRandomId(random), SpanId.GenerateRandomId(random), TraceOptions.Builder().SetIsSampled(true).Build(), Tracestate.Empty); notSampledSpanContext = SpanContext.Create(TraceId.GenerateRandomId(random), SpanId.GenerateRandomId(random), TraceOptions.Default, Tracestate.Empty); parentSpanId = SpanId.GenerateRandomId(random); startEndHandler = new TestStartEndHandler(sampleStore); sampleStore.RegisterSpanNamesForCollection(new List <string>() { REGISTERED_SPAN_NAME }); }
public void GetTraceOptions() { Assert.Equal(TraceOptions.DEFAULT, first.TraceOptions); Assert.Equal(TraceOptions.Builder().SetIsSampled(true).Build(), second.TraceOptions); }
#pragma warning disable SA1202 // Elements must be ordered by access public void Propagate_SpanContextTracingEnabled() #pragma warning restore SA1202 // Elements must be ordered by access { TestSpanContextConversion( SpanContext.Create(TRACE_ID, SPAN_ID, TraceOptions.Builder().SetIsSampled(true).Build())); }
public InProcessSampledSpanStoreTest() { sampledSpanContext = SpanContext.Create(TraceId.GenerateRandomId(random), SpanId.GenerateRandomId(random), TraceOptions.Builder().SetIsSampled(true).Build(), Tracestate.Empty); notSampledSpanContext = SpanContext.Create(TraceId.GenerateRandomId(random), SpanId.GenerateRandomId(random), TraceOptions.Default, Tracestate.Empty); parentSpanId = SpanId.GenerateRandomId(random); startEndHandler = new TestStartEndHandler(sampleStore); sampleStore.RegisterSpanNamesForCollection(new List <string>() { REGISTERED_SPAN_NAME }); }