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);
        }
Пример #2
0
 public void Builder_FromOptions()
 {
     Assert.Equal(6 | 1,
                  TraceOptions.Builder(TraceOptions.FromBytes(thirdBytes))
                  .SetIsSampled(true)
                  .Build()
                  .Options);
 }
Пример #3
0
 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());
 }
Пример #4
0
 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);
 }
Пример #5
0
 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);
 }
Пример #6
0
 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);
 }
Пример #7
0
        /// <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);
            }
        }
Пример #8
0
        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);
            }
        }
Пример #9
0
 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);
 }
Пример #10
0
 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);
 }
Пример #11
0
 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;
 }
Пример #12
0
 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;
 }
Пример #13
0
        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;
        }
Пример #15
0
 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));
 }
Пример #17
0
 public void IsSampled()
 {
     Assert.False(TraceOptions.Default.IsSampled);
     Assert.True(TraceOptions.Builder().SetIsSampled(true).Build().IsSampled);
 }
Пример #18
0
        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);
        }
Пример #21
0
        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();
        }
Пример #22
0
 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
     });
 }
Пример #23
0
 public void GetTraceOptions()
 {
     Assert.Equal(TraceOptions.DEFAULT, first.TraceOptions);
     Assert.Equal(TraceOptions.Builder().SetIsSampled(true).Build(), second.TraceOptions);
 }
Пример #24
0
#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()));
        }
Пример #25
0
 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
     });
 }