public void TestNegativeChildSampling() { // Create tracer that samples all spans var tracer = new WavefrontTracer .Builder(new ConsoleReporter("source"), BuildApplicationTags()) .WithSampler(new ConstantSampler(true)) .Build(); // Create parentContext with sampled set to false var parentContext = new WavefrontSpanContext(Guid.NewGuid(), Guid.NewGuid(), null, false); // Verify span created AsChildOf parentContext inherits parent sampling decision var span = (WavefrontSpan)tracer.BuildSpan("testOp").AsChildOf(parentContext).Start(); var spanContext = (WavefrontSpanContext)span.Context; long traceId = TraceIdToLong(spanContext.GetTraceId()); Assert.True(tracer.Sample(span.GetOperationName(), traceId, 0)); Assert.NotNull(span); Assert.Equal(parentContext.TraceId, spanContext.TraceId); Assert.True(spanContext.IsSampled()); bool?samplingDecision = spanContext.GetSamplingDecision(); Assert.True(samplingDecision.HasValue); Assert.False(samplingDecision.Value); }
public void TestInvalidTraceIdExtract() { string val = ":7499dd16d98ab60e:3771de7e09c55ae8:1"; var dictionary = new Dictionary <string, string>(); dictionary.Add(JaegerHeader, val); var textMapExtractAdapter = new TextMapExtractAdapter(dictionary); WavefrontSpanContext ctx = wfJaegerPropagator.Extract(textMapExtractAdapter); Assert.Null(ctx); }
/// <summary> /// Extracts traceId and spanId from a WavefrontSpanContext and constructs a Jaeger /// client compatible header of the form traceId:spanId:parentId:samplingDecision. /// </summary> private string ContextToTraceIdHeader(WavefrontSpanContext context) { string traceId = GuidToHex(context.GetTraceId()); string spanId = GuidToHex(context.GetSpanId()); bool samplingDecision = context.GetSamplingDecision() ?? false; string decision = samplingDecision ? "1" : "0"; string parentId = Guid.TryParse(context.GetBaggageItem(ParentIdKey), out Guid guid) ? GuidToHex(guid) : "0"; return($"{traceId}:{spanId}:{parentId}:{decision}"); }
public void TestTraceIdExtractEncoded() { string val = "3871de7e09c53ae8%3A7499dd16d98ab60e%3A3771de7e09c55ae8%3A1"; var dictionary = new Dictionary <string, string>(); dictionary.Add(JaegerHeader, val); var textMapExtractAdapter = new TextMapExtractAdapter(dictionary); WavefrontSpanContext ctx = wfJaegerPropagator.Extract(textMapExtractAdapter); Assert.NotNull(ctx); Assert.Equal("00000000-0000-0000-3871-de7e09c53ae8", ctx.TraceId); Assert.Equal("00000000-0000-0000-7499-dd16d98ab60e", ctx.SpanId); Assert.Equal("00000000-0000-0000-7499-dd16d98ab60e", ctx.GetBaggageItem(ParentIdKey)); Assert.True(ctx.GetSamplingDecision() ?? false); }
/// <inheritdoc /> public void Inject <TCarrier>(WavefrontSpanContext spanContext, TCarrier carrier) { if (carrier is ITextMap textMap) { textMap.Set(TraceId, spanContext.TraceId); textMap.Set(SpanId, spanContext.SpanId); foreach (var entry in spanContext.GetBaggageItems()) { textMap.Set(BaggagePrefix + entry.Key, entry.Value); } } else { throw new ArgumentException("Invalid carrier " + carrier.GetType()); } }
public void TestBaggageItems() { var tracer = new WavefrontTracer .Builder(new ConsoleReporter("source"), BuildApplicationTags()) .Build(); // Create parentContext with baggage items var bag = new Dictionary <string, string> { { "foo", "bar" }, { "user", "name" } }; var parentContext = new WavefrontSpanContext(Guid.NewGuid(), Guid.NewGuid(), bag, true); var span = (WavefrontSpan)tracer.BuildSpan("testOp").AsChildOf(parentContext).Start(); Assert.Equal("bar", span.GetBaggageItem("foo")); Assert.Equal("name", span.GetBaggageItem("user")); // Create follows var items = new Dictionary <string, string> { { "tracker", "id" }, { "db.name", "name" } }; var follows = new WavefrontSpanContext(Guid.NewGuid(), Guid.NewGuid(), items, true); span = (WavefrontSpan)tracer.BuildSpan("testOp") .AsChildOf(parentContext) .AsChildOf(follows) .Start(); Assert.Equal("bar", span.GetBaggageItem("foo")); Assert.Equal("name", span.GetBaggageItem("user")); Assert.Equal("id", span.GetBaggageItem("tracker")); Assert.Equal("name", span.GetBaggageItem("db.name")); // Validate root span span = (WavefrontSpan)tracer.BuildSpan("testOp").Start(); IDictionary <string, string> baggage = ((WavefrontSpanContext)span.Context).GetBaggage(); Assert.NotNull(baggage); Assert.Empty(baggage); }
/// <inheritdoc /> public void Inject <TCarrier>(WavefrontSpanContext spanContext, TCarrier carrier) { if (carrier is ITextMap textMap) { textMap.Set(traceIdHeader, ContextToTraceIdHeader(spanContext)); foreach (var entry in spanContext.GetBaggageItems()) { textMap.Set(baggagePrefix + entry.Key, entry.Value); } if (spanContext.IsSampled()) { textMap.Set(SamplingDecisionKey, spanContext.GetSamplingDecision().ToString()); } } else { throw new ArgumentException("Invalid carrier " + carrier.GetType()); } }
/// <summary> /// Initializes a new instance of the <see cref="Reference"/> class for a given /// span context and a given reference type. /// </summary> /// <param name="spanContext">The <see cref="WavefrontSpanContext"/>.</param> /// <param name="type">The reference type.</param> public Reference(WavefrontSpanContext spanContext, string type) { SpanContext = spanContext; Type = type; }