diff --git a/pom.xml b/pom.xml index 4ebda06d20..d8b90cf376 100644 --- a/pom.xml +++ b/pom.xml @@ -28,6 +28,11 @@ 3.6.2 test + + org.mockito + mockito-core + 2.7.22 + diff --git a/src/main/java/com/datadoghq/trace/impl/Tracer.java b/src/main/java/com/datadoghq/trace/impl/Tracer.java index 401bb953ef..2734041a72 100644 --- a/src/main/java/com/datadoghq/trace/impl/Tracer.java +++ b/src/main/java/com/datadoghq/trace/impl/Tracer.java @@ -7,6 +7,7 @@ import io.opentracing.propagation.Format; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import java.util.UUID; public class Tracer implements io.opentracing.Tracer { @@ -28,14 +29,15 @@ public class Tracer implements io.opentracing.Tracer { private final String operationName; private Map tags = new HashMap(); private Long timestamp; - private Optional parent; + private Optional parent = Optional.empty(); public SpanBuilder(String operationName) { this.operationName = operationName; } public io.opentracing.Tracer.SpanBuilder asChildOf(SpanContext spanContext) { - return null; + this.parent = Optional.ofNullable(spanContext); + return this; } public io.opentracing.Tracer.SpanBuilder asChildOf(Span span) { @@ -73,36 +75,57 @@ public class Tracer implements io.opentracing.Tracer { public Span start() { // build the context - SpanContext context = buildNewSpanContext(); + SpanContext context = buildTheSpanContext(); return new com.datadoghq.trace.impl.Span( + Tracer.this, this.operationName, this.tags, Optional.ofNullable(this.timestamp), context); } - private SpanContext buildNewSpanContext() { + private SpanContext buildTheSpanContext() { - Optional parentContext = Optional.ofNullable(this.parent); - SpanContext context = new com.datadoghq.trace.impl.SpanContext( - - ); - - - - if (this.parent == null) { - long traceId = 123L; + SpanContext context = null; + long generatedId = generateNewId(); + if (parent.isPresent()) { + com.datadoghq.trace.impl.SpanContext p = (com.datadoghq.trace.impl.SpanContext) parent.get(); + context = new com.datadoghq.trace.impl.SpanContext( + p.getTraceId(), + generatedId, + p.getSpanId(), + null, + null, + null, + false, + null, + null, + true); } else { - + context = new com.datadoghq.trace.impl.SpanContext( + generatedId, + generatedId, + 0L, + null, + null, + null, + false, + null, + null, + true); } - return null; + return context; } public Iterable> baggageItems() { return null; } } + + long generateNewId() { + return UUID.randomUUID().getMostSignificantBits(); + } } diff --git a/src/test/java/com/datadoghq/trace/impl/SpanBuilderTest.java b/src/test/java/com/datadoghq/trace/impl/SpanBuilderTest.java index d60f5b7d4e..ff813959d6 100644 --- a/src/test/java/com/datadoghq/trace/impl/SpanBuilderTest.java +++ b/src/test/java/com/datadoghq/trace/impl/SpanBuilderTest.java @@ -1,16 +1,15 @@ package com.datadoghq.trace.impl; -import org.assertj.core.data.MapEntry; import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.Map; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class SpanBuilderTest { @@ -70,9 +69,9 @@ public class SpanBuilderTest { } @Test - public void shouldBuilSpanTimestampInNano() { + public void shouldBuildSpanTimestampInMilli() { - final long expectedTimestamp = 487517802L * 1000 * 1000; + final long expectedTimestamp = 487517802L * 1000; final String expectedName = "fakeName"; Span span = (Span) tracer @@ -83,15 +82,39 @@ public class SpanBuilderTest { assertThat(span.getStartTime()).isEqualTo(expectedTimestamp); // auto-timestamp in nanoseconds - long tick = System.nanoTime(); + long tick = System.currentTimeMillis(); span = (Span) tracer .buildSpan(expectedName) .start(); // between now and now + 100ms - assertThat(span.getStartTime()).isBetween(tick, tick * 1000 * 100); + assertThat(span.getStartTime()).isBetween(tick, tick + 100); } + @Test + public void shouldLinkToParentSpan() { + + final long spanId = 1L; + final long expectedParentId = spanId; + + SpanContext mockedContext = mock(SpanContext.class); + + when(mockedContext.getSpanId()).thenReturn(spanId); + + final String expectedName = "fakeName"; + + Span span = (Span) tracer + .buildSpan(expectedName) + .asChildOf(mockedContext) + .start(); + + SpanContext actualContext = (SpanContext) span.context(); + + assertThat(actualContext.getParentId()).isEqualTo(expectedParentId); + + + } + } \ No newline at end of file diff --git a/src/test/java/com/datadoghq/trace/impl/TracerTest.java b/src/test/java/com/datadoghq/trace/impl/TracerTest.java index b571ee2fca..aa5279f73f 100644 --- a/src/test/java/com/datadoghq/trace/impl/TracerTest.java +++ b/src/test/java/com/datadoghq/trace/impl/TracerTest.java @@ -3,17 +3,21 @@ package com.datadoghq.trace.impl; import org.junit.Test; -class TracerTest { - @Test - void buildSpan() { - } +import static org.assertj.core.api.Assertions.assertThat; + +public class TracerTest { + @Test - void inject() { - } + public void testGenerateNewId() { - @Test - void extract() { + Tracer tracer = new Tracer(); + long id1 = tracer.generateNewId(); + long id2 = tracer.generateNewId(); + + assertThat(id1).isNotNull(); + assertThat(id1).isNotZero(); + assertThat(id1).isNotEqualTo(id2); } } \ No newline at end of file