Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 16 additions & 4 deletions src/Datadog.Tracer.IntegrationTests/SendTracesToAgent.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using Xunit;

namespace Datadog.Tracer.IntegrationTests
Expand All @@ -10,7 +10,7 @@ public void MinimalSpan()
{
var tracer = new Tracer(new Api(new Uri("http://localhost:8126")));
tracer.BuildSpan("Operation")
.WithTag(Tags.Resource, "This is a resource")
.WithTag(Tags.ResourceName, "This is a resource")
.Start()
.Finish();
}
Expand All @@ -20,8 +20,20 @@ public void CustomServiceName()
{
var tracer = new Tracer(new Api(new Uri("http://localhost:8126")));
tracer.BuildSpan("Operation")
.WithTag(Tags.Resource, "This is a resource")
.WithTag(Tags.Service, "Service1")
.WithTag(Tags.ResourceName, "This is a resource")
.WithTag(Tags.ServiceName, "Service1")
.Start()
.Finish();
}

[Fact]
public void Utf8Everywhere()
{
var tracer = new Tracer(new Api(new Uri("http://localhost:8126")));
tracer.BuildSpan("Aᛗᚪᚾᚾᚪ")
.WithTag(Tags.ResourceName, "η γλώσσα μου έδωσαν ελληνική")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 thanks for testing that.

.WithTag(Tags.ServiceName, "На берегу пустынных волн")
.WithTag("யாமறிந்த", "ნუთუ კვლა")
.Start()
.Finish();
}
Expand Down
48 changes: 24 additions & 24 deletions src/Datadog.Tracer.Tests/SpanBuilderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,44 +48,44 @@ public void Start_AsChildOfSpan_ChildReferencesParent()
.AsChildOf(root)
.Start();

Assert.Null(root.DatadogContext.ParentId);
Assert.NotEqual<ulong>(0, root.DatadogContext.SpanId);
Assert.NotEqual<ulong>(0, root.DatadogContext.TraceId);
Assert.Equal(root.DatadogContext.SpanId, child.DatadogContext.ParentId);
Assert.Equal(root.DatadogContext.TraceId, child.DatadogContext.TraceId);
Assert.NotEqual<ulong>(0, child.DatadogContext.SpanId);
Assert.Null(root.Context.ParentId);
Assert.NotEqual<ulong>(0, root.Context.SpanId);
Assert.NotEqual<ulong>(0, root.Context.TraceId);
Assert.Equal(root.Context.SpanId, child.Context.ParentId);
Assert.Equal(root.Context.TraceId, child.Context.TraceId);
Assert.NotEqual<ulong>(0, child.Context.SpanId);
}

[Fact]
public void Start_AsChildOfSpanContext_ChildReferencesParent()
{
var root = (Span)CreateSpanBuilder().Start();
var child = (Span)CreateSpanBuilder()
.AsChildOf(root.DatadogContext)
.AsChildOf(root.Context)
.Start();

Assert.Null(root.DatadogContext.ParentId);
Assert.NotEqual<ulong>(0, root.DatadogContext.SpanId);
Assert.NotEqual<ulong>(0, root.DatadogContext.TraceId);
Assert.Equal(root.DatadogContext.SpanId, child.DatadogContext.ParentId);
Assert.Equal(root.DatadogContext.TraceId, child.DatadogContext.TraceId);
Assert.NotEqual<ulong>(0, child.DatadogContext.SpanId);
Assert.Null(root.Context.ParentId);
Assert.NotEqual<ulong>(0, root.Context.SpanId);
Assert.NotEqual<ulong>(0, root.Context.TraceId);
Assert.Equal(root.Context.SpanId, child.Context.ParentId);
Assert.Equal(root.Context.TraceId, child.Context.TraceId);
Assert.NotEqual<ulong>(0, child.Context.SpanId);
}

[Fact]
public void Start_ReferenceAsChildOf_ChildReferencesParent()
{
var root = (Span)CreateSpanBuilder().Start();
var child = (Span)CreateSpanBuilder()
.AddReference(References.ChildOf, root.DatadogContext)
.AddReference(References.ChildOf, root.Context)
.Start();

Assert.Null(root.DatadogContext.ParentId);
Assert.NotEqual<ulong>(0, root.DatadogContext.SpanId);
Assert.NotEqual<ulong>(0, root.DatadogContext.TraceId);
Assert.Equal(root.DatadogContext.SpanId, child.DatadogContext.ParentId);
Assert.Equal(root.DatadogContext.TraceId, child.DatadogContext.TraceId);
Assert.NotEqual<ulong>(0, child.DatadogContext.SpanId);
Assert.Null(root.Context.ParentId);
Assert.NotEqual<ulong>(0, root.Context.SpanId);
Assert.NotEqual<ulong>(0, root.Context.TraceId);
Assert.Equal(root.Context.SpanId, child.Context.ParentId);
Assert.Equal(root.Context.TraceId, child.Context.TraceId);
Assert.NotEqual<ulong>(0, child.Context.SpanId);
}

[Fact]
Expand All @@ -108,7 +108,7 @@ public void Start_WithTags_TagsAreProperlySet()
public void Start_SettingService_ServiceIsSet()
{
var span = (Span)CreateSpanBuilder()
.WithTag(Tags.Service, "MyService")
.WithTag("service.name", "MyService")
.Start();

Assert.Equal("MyService", span.ServiceName);
Expand All @@ -118,7 +118,7 @@ public void Start_SettingService_ServiceIsSet()
public void Start_SettingResource_ResourceIsSet()
{
var span = (Span)CreateSpanBuilder()
.WithTag(Tags.Resource, "MyResource")
.WithTag("resource.name", "MyResource")
.Start();

Assert.Equal("MyResource", span.ResourceName);
Expand All @@ -128,7 +128,7 @@ public void Start_SettingResource_ResourceIsSet()
public void Start_SettingType_TypeIsSet()
{
var span = (Span)CreateSpanBuilder()
.WithTag(Tags.Type, "web")
.WithTag("span.type", "web")
.Start();

Assert.Equal("web", span.Type);
Expand All @@ -138,7 +138,7 @@ public void Start_SettingType_TypeIsSet()
public void Start_SettingError_ErrorIsSet()
{
var span = (Span)CreateSpanBuilder()
.WithTag(Tags.Error, true)
.WithTag(OpenTracing.Tags.Error, true)
.Start();

Assert.Equal(true, span.Error);
Expand Down
14 changes: 7 additions & 7 deletions src/Datadog.Tracer.Tests/SpanTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public SpanTests()
[Fact]
public void SetTag_Tags_TagsAreProperlySet()
{
var span = new Span(_tracerMock.Object, null, null, null);
var span = new Span(_tracerMock.Object, null, null, null, null);

span.SetTag("StringKey", "What's tracing");
span.SetTag("IntKey", 42);
Expand All @@ -40,7 +40,7 @@ public void SetTag_Tags_TagsAreProperlySet()
[Fact]
public void SetOperationName_ValidOperationName_OperationNameIsProperlySet()
{
var span = new Span(_tracerMock.Object, null, null, null);
var span = new Span(_tracerMock.Object, null, null, null, null);

span.SetOperationName("Op1");

Expand All @@ -52,7 +52,7 @@ public void SetOperationName_ValidOperationName_OperationNameIsProperlySet()
public void Finish_StartTimeInThePastWithNoEndTime_DurationProperlyComputed()
{
var startTime = DateTimeOffset.UtcNow.AddMinutes(-1);
var span = new Span(_tracerMock.Object, null, null, startTime);
var span = new Span(_tracerMock.Object, null, null, null, startTime);

span.Finish();

Expand All @@ -63,7 +63,7 @@ public void Finish_StartTimeInThePastWithNoEndTime_DurationProperlyComputed()
[Fact]
public async Task Finish_NoEndTimeProvided_SpanWriten()
{
var span = new Span(_tracerMock.Object, null, null, null);
var span = new Span(_tracerMock.Object, null, null, null, null);
await Task.Delay(TimeSpan.FromMilliseconds(1));
span.Finish();

Expand All @@ -76,7 +76,7 @@ public void Finish_EndTimeProvided_SpanWritenWithCorrectDuration()
{
var startTime = DateTimeOffset.UtcNow;
var endTime = DateTime.UtcNow.AddMilliseconds(10);
var span = new Span(_tracerMock.Object, null, null, startTime);
var span = new Span(_tracerMock.Object, null, null, null, startTime);

span.Finish(endTime);

Expand All @@ -89,7 +89,7 @@ public void Finish_EndTimeInThePast_DurationIs0()
{
var startTime = DateTimeOffset.UtcNow;
var endTime = DateTime.UtcNow.AddMilliseconds(-10);
var span = new Span(_tracerMock.Object, null, null, startTime);
var span = new Span(_tracerMock.Object, null, null, null, startTime);

span.Finish(endTime);

Expand All @@ -101,7 +101,7 @@ public void Finish_EndTimeInThePast_DurationIs0()
public void Dispose_ExitUsing_SpanWriten()
{
Span span;
using (span = new Span(_tracerMock.Object, null, null, null))
using (span = new Span(_tracerMock.Object, null, null, null, null))
{
}

Expand Down
50 changes: 19 additions & 31 deletions src/Datadog.Tracer.Tests/TracerTests.cs
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
using Moq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Xunit;

namespace Datadog.Tracer.Tests
{
public class TracerTests
{
private Mock<IApi> _apiMock = new Mock<IApi>(MockBehavior.Strict);
private Mock<IApi> _apiMock = new Mock<IApi>();

[Fact]
public void BuildSpan_NoParameterAutomaticContextPropagation_DefaultParameters()
public void BuildSpan_NoParameter_DefaultParameters()
{
var tracer = new Tracer(_apiMock.Object, automaticContextPropagation: true);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

exactly; that field will be part of another API when we're using a kind of Tracer.startManual() that checks if context propagation is used or not (part of the SpanBuilder)

var tracer = new Tracer(_apiMock.Object);

var builder = tracer.BuildSpan("Op1");
var span = (Span)builder.Start();
Expand All @@ -24,21 +24,9 @@ public void BuildSpan_NoParameterAutomaticContextPropagation_DefaultParameters()
}

[Fact]
public void BuildSpan_NoParameterNoAutomaticContextPropagation_DefaultParameters()
public void BuildSpan_OneChild_ChildParentProperlySet()
{
var tracer = new Tracer(_apiMock.Object, automaticContextPropagation: false);

var builder = tracer.BuildSpan("Op1");
var span = (Span)builder.Start();

Assert.Equal(Constants.UnkownService, span.ServiceName);
Assert.Equal("Op1", span.OperationName);
}

[Fact]
public void BuildSpan_OneChildAutomaticContextPropagation_ChildParentProperlySet()
{
var tracer = new Tracer(_apiMock.Object, automaticContextPropagation: true);
var tracer = new Tracer(_apiMock.Object);

var root = (Span)tracer
.BuildSpan("Root")
Expand All @@ -48,13 +36,13 @@ public void BuildSpan_OneChildAutomaticContextPropagation_ChildParentProperlySet
.Start();

Assert.Equal(root.TraceContext, child.TraceContext);
Assert.Equal(root.DatadogContext.SpanId, child.DatadogContext.ParentId);
Assert.Equal(root.Context.SpanId, child.Context.ParentId);
}

[Fact]
public void BuildSpan_2ChildrenOfRootAutomaticContextPropagation_ChildrenParentProperlySet()
public void BuildSpan_2ChildrenOfRoot_ChildrenParentProperlySet()
{
var tracer = new Tracer(_apiMock.Object, automaticContextPropagation: true);
var tracer = new Tracer(_apiMock.Object);

var root = (Span)tracer
.BuildSpan("Root")
Expand All @@ -68,15 +56,15 @@ public void BuildSpan_2ChildrenOfRootAutomaticContextPropagation_ChildrenParentP
.Start();

Assert.Equal(root.TraceContext, child1.TraceContext);
Assert.Equal(root.DatadogContext.SpanId, child1.DatadogContext.ParentId);
Assert.Equal(root.Context.SpanId, child1.Context.ParentId);
Assert.Equal(root.TraceContext, child2.TraceContext);
Assert.Equal(root.DatadogContext.SpanId, child2.DatadogContext.ParentId);
Assert.Equal(root.Context.SpanId, child2.Context.ParentId);
}

[Fact]
public void BuildSpan_2LevelChildrenAutomaticContextPropagation_ChildrenParentProperlySet()
public void BuildSpan_2LevelChildren_ChildrenParentProperlySet()
{
var tracer = new Tracer(_apiMock.Object, automaticContextPropagation: true);
var tracer = new Tracer(_apiMock.Object);

var root = (Span)tracer
.BuildSpan("Root")
Expand All @@ -89,15 +77,15 @@ public void BuildSpan_2LevelChildrenAutomaticContextPropagation_ChildrenParentPr
.Start();

Assert.Equal(root.TraceContext, child1.TraceContext);
Assert.Equal(root.DatadogContext.SpanId, child1.DatadogContext.ParentId);
Assert.Equal(root.Context.SpanId, child1.Context.ParentId);
Assert.Equal(root.TraceContext, child2.TraceContext);
Assert.Equal(child1.DatadogContext.SpanId, child2.DatadogContext.ParentId);
Assert.Equal(child1.Context.SpanId, child2.Context.ParentId);
}

[Fact]
public async Task BuildSpan_AsyncChildrenCreationAutomaticContextPropagation_ChildrenParentProperlySet()
public async Task BuildSpan_AsyncChildrenCreation_ChildrenParentProperlySet()
{
var tracer = new Tracer(_apiMock.Object, automaticContextPropagation: true);
var tracer = new Tracer(_apiMock.Object);
var tcs = new TaskCompletionSource<bool>();

var root = (Span)tracer
Expand All @@ -111,12 +99,12 @@ public async Task BuildSpan_AsyncChildrenCreationAutomaticContextPropagation_Chi
tcs.SetResult(true);

Assert.Equal(root.TraceContext, syncChild.TraceContext);
Assert.Equal(root.DatadogContext.SpanId, syncChild.DatadogContext.ParentId);
Assert.Equal(root.Context.SpanId, syncChild.Context.ParentId);
foreach(var task in tasks)
{
var span = await task;
Assert.Equal(root.TraceContext, span.TraceContext);
Assert.Equal(root.DatadogContext.SpanId, span.DatadogContext.ParentId);
Assert.Equal(root.Context.SpanId, span.Context.ParentId);
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/Datadog.Tracer/Api.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public Api(Uri baseEndpoint)
_servicesEndpoint = new Uri(baseEndpoint, ServicesPath);
// TODO:bertrand add header for os version
_client.DefaultRequestHeaders.Add("Datadog-Meta-Lang", ".NET");
_client.DefaultRequestHeaders.Add("Datadog-Meta-Lang-Version", RuntimeInformation.FrameworkDescription);
_client.DefaultRequestHeaders.Add("Datadog-Meta-Lang-Interpreter", RuntimeInformation.FrameworkDescription);
_client.DefaultRequestHeaders.Add("Datadog-Meta-Tracer-Version", Assembly.GetEntryAssembly().GetName().Version.ToString());
}

Expand Down
4 changes: 2 additions & 2 deletions src/Datadog.Tracer/RandomUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ namespace Datadog.Tracer
{
public static class RandomUtils
{
public static UInt64 NextUInt64(this Random rnd)
public static UInt64 NextUInt63(this Random rnd)
{
// From https://stackoverflow.com/a/677390
var buffer = new byte[sizeof(UInt64)];
rnd.NextBytes(buffer);
return BitConverter.ToUInt64(buffer, 0);
return BitConverter.ToUInt64(buffer, 0) & (~(1 << 63));
}
}
}
Loading