diff --git a/src/main/java/com/datadoghq/trace/SpanSerializer.java b/src/main/java/com/datadoghq/trace/SpanSerializer.java index 9ec3a86711..dc53169a82 100644 --- a/src/main/java/com/datadoghq/trace/SpanSerializer.java +++ b/src/main/java/com/datadoghq/trace/SpanSerializer.java @@ -1,11 +1,15 @@ package com.datadoghq.trace; +import java.util.List; + import io.opentracing.Span; public interface SpanSerializer { public String serialize(Span t) throws Exception; + public String serialize(List t) throws Exception; + public Span deserialize(String str) throws Exception; } diff --git a/src/main/java/com/datadoghq/trace/impl/DDSpan.java b/src/main/java/com/datadoghq/trace/impl/DDSpan.java index 1610702938..65e1e32259 100644 --- a/src/main/java/com/datadoghq/trace/impl/DDSpan.java +++ b/src/main/java/com/datadoghq/trace/impl/DDSpan.java @@ -1,10 +1,13 @@ package com.datadoghq.trace.impl; -import io.opentracing.SpanContext; - import java.util.Map; import java.util.Optional; +import com.fasterxml.jackson.annotation.JsonGetter; + +import io.opentracing.Span; +import io.opentracing.SpanContext; + public class DDSpan implements io.opentracing.Span { @@ -44,35 +47,35 @@ public class DDSpan implements io.opentracing.Span { } - public io.opentracing.Span setTag(String s, String s1) { + public Span setTag(String s, String s1) { return null; } - public io.opentracing.Span setTag(String s, boolean b) { + public Span setTag(String s, boolean b) { return null; } - public io.opentracing.Span setTag(String s, Number number) { + public Span setTag(String s, Number number) { return null; } - public io.opentracing.Span log(Map map) { + public Span log(Map map) { return null; } - public io.opentracing.Span log(long l, Map map) { + public Span log(long l, Map map) { return null; } - public io.opentracing.Span log(String s) { + public Span log(String s) { return null; } - public io.opentracing.Span log(long l, String s) { + public Span log(long l, String s) { return null; } - public io.opentracing.Span setBaggageItem(String s, String s1) { + public Span setBaggageItem(String s, String s1) { return null; } @@ -80,32 +83,70 @@ public class DDSpan implements io.opentracing.Span { return null; } - public io.opentracing.Span setOperationName(String s) { + public Span setOperationName(String s) { return null; } - public io.opentracing.Span log(String s, Object o) { + public Span log(String s, Object o) { return null; } - public io.opentracing.Span log(long l, String s, Object o) { + public Span log(long l, String s, Object o) { return null; } + //Getters and JSON serialisation instructions + + @JsonGetter(value="name") public String getOperationName() { return operationName; } - + + @JsonGetter(value="meta") public Map getTags() { return this.tags; } + @JsonGetter(value="start") public long getStartTime() { - return startTime; + return startTime * 1000000; } - - public DDSpanContext getContext(){ - return context; + + @JsonGetter(value="duration") + public long getDurationInNS(){ + return durationMilliseconds * 1000000; + } + + public String getService(){ + return context.getServiceName(); + } + + @JsonGetter(value="trace_id") + public long getTraceId(){ + return context.getTraceId(); + } + + @JsonGetter(value="span_id") + public long getSpanId(){ + return context.getSpanId(); + } + + @JsonGetter(value="parent_id") + public long getParentId(){ + return context.getParentId(); + } + + @JsonGetter(value="resource") + public String getResourceName(){ + return context.getResourceName()==null?getOperationName():context.getResourceName(); + } + + public String getType(){ + return context.getSpanType(); + } + + public int getError(){ + return context.getErrorFlag()?1:0; } } diff --git a/src/main/java/com/datadoghq/trace/impl/DDSpanContext.java b/src/main/java/com/datadoghq/trace/impl/DDSpanContext.java index c6d4f1d84b..e53a9f6e4c 100644 --- a/src/main/java/com/datadoghq/trace/impl/DDSpanContext.java +++ b/src/main/java/com/datadoghq/trace/impl/DDSpanContext.java @@ -72,7 +72,7 @@ public class DDSpanContext implements io.opentracing.SpanContext { return resourceName; } - public boolean isErrorFlag() { + public boolean getErrorFlag() { return errorFlag; } @@ -84,7 +84,7 @@ public class DDSpanContext implements io.opentracing.SpanContext { return spanType; } - public boolean isSampled() { + public boolean getSampled() { return sampled; } diff --git a/src/main/java/com/datadoghq/trace/impl/DDSpanSerializer.java b/src/main/java/com/datadoghq/trace/impl/DDSpanSerializer.java index 7afa4005d9..542f23b777 100644 --- a/src/main/java/com/datadoghq/trace/impl/DDSpanSerializer.java +++ b/src/main/java/com/datadoghq/trace/impl/DDSpanSerializer.java @@ -1,29 +1,33 @@ package com.datadoghq.trace.impl; -import java.io.IOException; +import java.util.List; import com.datadoghq.trace.SpanSerializer; -import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; +import io.opentracing.Span; + public class DDSpanSerializer implements SpanSerializer { protected final ObjectMapper objectMapper = new ObjectMapper(); - public String serialize(io.opentracing.Span t) throws JsonProcessingException { - return objectMapper.writeValueAsString(t); + public String serialize(Span span) throws JsonProcessingException { + return objectMapper.writeValueAsString(span); + } + + public String serialize(List spans) throws JsonProcessingException { + return objectMapper.writeValueAsString(spans); } - public io.opentracing.Span deserialize(String str) throws JsonParseException, JsonMappingException, IOException { - return objectMapper.readValue(str, DDSpan.class); + public io.opentracing.Span deserialize(String str) throws Exception { + throw new Exception("Deserialisation of spans is not implemented yet"); } public static void main(String[] args) throws Exception{ Tracer tracer = new Tracer(); - io.opentracing.Span span = tracer.buildSpan("Hello!") + Span span = tracer.buildSpan("Hello!") .withTag("port", 1234) .withTag("bool", true) .withTag("hello", "world") diff --git a/src/main/java/com/datadoghq/trace/impl/Tracer.java b/src/main/java/com/datadoghq/trace/impl/Tracer.java index 7c69732e7c..875d99c17c 100644 --- a/src/main/java/com/datadoghq/trace/impl/Tracer.java +++ b/src/main/java/com/datadoghq/trace/impl/Tracer.java @@ -22,10 +22,10 @@ public class Tracer implements io.opentracing.Tracer { return null; } - class SpanBuilder implements io.opentracing.Tracer.SpanBuilder { + public class SpanBuilder implements io.opentracing.Tracer.SpanBuilder { private final String operationName; - private Map tags = new HashMap(); + private Map tags = new HashMap(); private Long timestamp; private SpanContext parent; @@ -33,16 +33,16 @@ public class Tracer implements io.opentracing.Tracer { this.operationName = operationName; } - public io.opentracing.Tracer.SpanBuilder asChildOf(SpanContext spanContext) { + public Tracer.SpanBuilder asChildOf(SpanContext spanContext) { this.parent = spanContext; return this; } - public io.opentracing.Tracer.SpanBuilder asChildOf(Span span) { + public Tracer.SpanBuilder asChildOf(Span span) { return asChildOf(span.context()); } - public io.opentracing.Tracer.SpanBuilder addReference(String referenceType, SpanContext spanContext) { + public Tracer.SpanBuilder addReference(String referenceType, SpanContext spanContext) { if (References.CHILD_OF.equals(referenceType) || References.FOLLOWS_FROM.equals(referenceType)) { // @todo: implements the notion of referenceType, currently only link a span to a parent one @@ -53,24 +53,24 @@ public class Tracer implements io.opentracing.Tracer { } } - public io.opentracing.Tracer.SpanBuilder withTag(String tag, Number number) { + public Tracer.SpanBuilder withTag(String tag, Number number) { return withTag(tag, (Object) number); } - public io.opentracing.Tracer.SpanBuilder withTag(String tag, String string) { + public Tracer.SpanBuilder withTag(String tag, String string) { return withTag(tag, (Object) string); } - public io.opentracing.Tracer.SpanBuilder withTag(String tag, boolean bool) { + public Tracer.SpanBuilder withTag(String tag, boolean bool) { return withTag(tag, (Object) bool); } - private io.opentracing.Tracer.SpanBuilder withTag(String tag, Object value) { + private Tracer.SpanBuilder withTag(String tag, Object value) { this.tags.put(tag, value); return this; } - public io.opentracing.Tracer.SpanBuilder withStartTimestamp(long timestamp) { + public Tracer.SpanBuilder withStartTimestamp(long timestamp) { this.timestamp = timestamp; return this; } @@ -80,7 +80,6 @@ public class Tracer implements io.opentracing.Tracer { // build the context DDSpanContext context = buildTheSpanContext(); - return new DDSpan( Tracer.this, this.operationName, diff --git a/src/main/java/com/datadoghq/trace/writer/impl/DDApi.java b/src/main/java/com/datadoghq/trace/writer/impl/DDApi.java index 8c6e5c45c2..08fa910599 100644 --- a/src/main/java/com/datadoghq/trace/writer/impl/DDApi.java +++ b/src/main/java/com/datadoghq/trace/writer/impl/DDApi.java @@ -5,8 +5,12 @@ import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; +import java.util.ArrayList; import java.util.List; +import com.datadoghq.trace.impl.DDSpanSerializer; +import com.datadoghq.trace.impl.Tracer; + import io.opentracing.Span; public class DDApi { @@ -36,9 +40,10 @@ public class DDApi { } private int callPUT(String endpoint,String content){ + HttpURLConnection httpCon = null; try { URL url = new URL(tracesEndpoint); - HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); + httpCon = (HttpURLConnection) url.openConnection(); httpCon.setDoOutput(true); httpCon.setRequestMethod("PUT"); httpCon.setRequestProperty("Content-Type", "application/json"); @@ -54,6 +59,37 @@ public class DDApi { // TODO Auto-generated catch block e.printStackTrace(); return -1; - } + } + } + +public static void main(String[] args) throws Exception{ + + Tracer tracer = new Tracer(); + List array = new ArrayList(); + Span span = tracer.buildSpan("Hello!") +// .withTag("port", 1234) +// .withTag("bool", true) + .withTag("hello", "world") + .start(); + array.add(span); + + Span span2 = tracer.buildSpan("Hello2!") +// .withTag("port", 1234) +// .withTag("bool", true) + .withTag("hello", "world") + .start(); + array.add(span2); + + DDSpanSerializer ddSpanSerializer = new DDSpanSerializer(); + + + + String str = ddSpanSerializer.serialize(array); + str = "["+str+"]"; + + DDApi api = new DDApi(DDAgentWriter.DEFAULT_HOSTNAME, DDAgentWriter.DEFAULT_PORT); + int status = api.callPUT(api.tracesEndpoint, str); + System.out.println("Status: "+status); + } }