diff --git a/apm-application-toolkit/apm-toolkit-opentracing/pom.xml b/apm-application-toolkit/apm-toolkit-opentracing/pom.xml index a2438fa59..227bfbe3f 100644 --- a/apm-application-toolkit/apm-toolkit-opentracing/pom.xml +++ b/apm-application-toolkit/apm-toolkit-opentracing/pom.xml @@ -15,12 +15,12 @@ io.opentracing opentracing-api - 0.20.4 + 0.30.0 io.opentracing opentracing-noop - 0.20.4 + 0.30.0 diff --git a/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/NeedSnifferActivation.java b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/NeedSnifferActivation.java new file mode 100644 index 000000000..2065eb787 --- /dev/null +++ b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/NeedSnifferActivation.java @@ -0,0 +1,18 @@ +package org.skywalking.apm.toolkit.opentracing; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * The NeedSnifferActivation annotation is flag for reader and maintainers, + * which represents this method should be activated/intercepted in sniffer. + * + * @author wusheng + */ +@Target({ElementType.METHOD, ElementType.CONSTRUCTOR}) +@Retention(RetentionPolicy.SOURCE) +public @interface NeedSnifferActivation { + String value() default "What should interceptor do?"; +} diff --git a/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkyWalkingSpan.java b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkyWalkingSpan.java deleted file mode 100644 index 6b2f9d990..000000000 --- a/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkyWalkingSpan.java +++ /dev/null @@ -1,113 +0,0 @@ -package org.skywalking.apm.toolkit.opentracing; - -import io.opentracing.Span; -import io.opentracing.SpanContext; - -import java.util.HashMap; -import java.util.Map; - -/** - * Created by wusheng on 2016/12/20. - */ -public class SkyWalkingSpan implements Span, SpanContext { - private String operationName; - - private long startTime; - - private Map tags; - - private final Map baggageItems; - - SkyWalkingSpan(String operationName, long startTime, Map tags) { - this.operationName = operationName; - this.startTime = startTime; - this.tags = tags; - baggageItems = new HashMap(); - } - - @Override - public SpanContext context() { - return this; - } - - @Override - public void finish() { - - } - - @Override - public void finish(long finishMicros) { - - } - - @Override - public void close() { - - } - - @Override - public Span setTag(String key, String value) { - return this; - } - - @Override - public Span setTag(String key, boolean value) { - return this; - } - - @Override - public Span setTag(String key, Number value) { - return this; - } - - @Override - public Span log(Map fields) { - return this; - } - - @Override - public Span log(long timestampMicroseconds, Map fields) { - return this; - } - - @Override - public Span log(String event) { - return this; - } - - @Override - public Span log(long timestampMicroseconds, String event) { - return this; - } - - @Override - public Span setBaggageItem(String key, String value) { - baggageItems.put(key, value); - return this; - } - - @Override - public String getBaggageItem(String key) { - return baggageItems.get(key); - } - - @Override - public Span setOperationName(String operationName) { - return this; - } - - @Override - public Span log(String eventName, Object payload) { - return this; - } - - @Override - public Span log(long timestampMicroseconds, String eventName, Object payload) { - return this; - } - - @Override - public Iterable> baggageItems() { - return baggageItems.entrySet(); - } -} diff --git a/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkyWalkingSpanBuilder.java b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkyWalkingSpanBuilder.java deleted file mode 100644 index 8290680e9..000000000 --- a/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkyWalkingSpanBuilder.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.skywalking.apm.toolkit.opentracing; - -import io.opentracing.References; -import io.opentracing.Span; -import io.opentracing.SpanContext; -import io.opentracing.Tracer; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -/** - * All source code in SkyWalkingSpanBuilder acts like an NoopSpanBuilder. - * Actually, it is NOT. - * The whole logic will be added after toolkit-activation. - *

- * Created by wusheng on 2016/12/20. - */ -public class SkyWalkingSpanBuilder implements Tracer.SpanBuilder { - private String operationName; - - private long startTime = 0L; - - private final Map tags; - - private SpanContext parentContext; - - SkyWalkingSpanBuilder(String operationName) { - this.operationName = operationName; - this.tags = new HashMap(); - } - - /** - * In SkyWalkingTracer, SpanContext will not be used. Tracer will build reference by itself. - * - * @param spanContext - * @return - */ - @Override - public Tracer.SpanBuilder asChildOf(SpanContext spanContext) { - this.parentContext = spanContext; - return this; - } - - /** - * In SkyWalkingTracer, Parent Span will not be used. Tracer will build reference by itself. - * - * @param span - * @return - */ - @Override - public Tracer.SpanBuilder asChildOf(Span span) { - asChildOf(span.context()); - return this; - } - - @Override - public Tracer.SpanBuilder addReference(String referenceType, SpanContext referencedContext) { - if (referenceType.equals(References.CHILD_OF)) { - return asChildOf(referencedContext); - } else { - return this; - } - } - - @Override - public Tracer.SpanBuilder withTag(String key, String value) { - if (key != null && value != null) { - tags.put(key, value); - } - return this; - } - - @Override - public Tracer.SpanBuilder withTag(String key, boolean value) { - if (key != null) { - tags.put(key, Boolean.toString(value)); - } - return this; - } - - @Override - public Tracer.SpanBuilder withTag(String key, Number value) { - if (key != null && value != null) { - tags.put(key, value.toString()); - } - return this; - } - - @Override - public Tracer.SpanBuilder withStartTimestamp(long startTime) { - this.startTime = startTime; - return this; - } - - @Override - public Span start() { - if (startTime == 0) { - startTime = System.currentTimeMillis(); - } - return new SkyWalkingSpan(this.operationName, this.startTime, this.tags); - } - - @Override - public Iterable> baggageItems() { - return parentContext == null - ? Collections.emptyMap().entrySet() - : parentContext.baggageItems(); - } -} diff --git a/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingActiveSpan.java b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingActiveSpan.java new file mode 100644 index 000000000..802504f47 --- /dev/null +++ b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingActiveSpan.java @@ -0,0 +1,123 @@ +package org.skywalking.apm.toolkit.opentracing; + +import io.opentracing.ActiveSpan; +import io.opentracing.SpanContext; +import java.util.Map; + +/** + * The SkywalkingActiveSpan is an extension of {@link SkywalkingSpan}, + * but because of Java inheritance restrict, only can do with a facade mode. + * + * @author wusheng + */ +public class SkywalkingActiveSpan implements ActiveSpan { + private SkywalkingSpan span; + + public SkywalkingActiveSpan(SkywalkingSpan span) { + this.span = span; + } + + @Override + public void deactivate() { + span.finish(); + } + + @Override + public void close() { + this.deactivate(); + } + + @Override + public Continuation capture() { + return new SkywalkingContinuation(); + } + + @Override + public SpanContext context() { + return span.context(); + } + + @Override + public ActiveSpan setTag(String key, String value) { + span.setTag(key, value); + return this; + } + + @Override + public ActiveSpan setTag(String key, boolean value) { + span.setTag(key, value); + return this; + } + + @Override + public ActiveSpan setTag(String key, Number value) { + span.setTag(key, value); + return this; + } + + @Override + public ActiveSpan log(Map fields) { + span.log(fields); + return this; + } + + @Override + public ActiveSpan log(long timestampMicroseconds, Map fields) { + span.log(timestampMicroseconds, fields); + return this; + } + + @Override + public ActiveSpan log(String event) { + span.log(event); + return this; + } + + @Override + public ActiveSpan log(long timestampMicroseconds, String event) { + span.log(timestampMicroseconds, event); + return this; + } + + /** + * Don't support baggage item. + */ + @Override + public ActiveSpan setBaggageItem(String key, String value) { + return this; + } + + /** + * Don't support baggage item. + * + * @return null, always. + */ + @Override + public String getBaggageItem(String key) { + return null; + } + + @Override + public ActiveSpan setOperationName(String operationName) { + span.setOperationName(operationName); + return this; + } + + /** + * Don't support logging with payload. + */ + @Deprecated + @Override + public ActiveSpan log(String eventName, Object payload) { + return this; + } + + /** + * Don't support logging with payload. + */ + @Deprecated + @Override + public ActiveSpan log(long timestampMicroseconds, String eventName, Object payload) { + return this; + } +} diff --git a/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingContext.java b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingContext.java new file mode 100644 index 000000000..2ef6f68dc --- /dev/null +++ b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingContext.java @@ -0,0 +1,21 @@ +package org.skywalking.apm.toolkit.opentracing; + +import io.opentracing.SpanContext; +import java.util.Map; + +/** + * Skywalking tracer context based on {@link ThreadLocal} auto mechanism. + * + * @author wusheng + */ +public class SkywalkingContext implements SpanContext { + public static final SkywalkingContext INSTANCE = new SkywalkingContext(); + + private SkywalkingContext() { + } + + @Override + public Iterable> baggageItems() { + return null; + } +} diff --git a/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingContinuation.java b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingContinuation.java new file mode 100644 index 000000000..87c4fafa6 --- /dev/null +++ b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingContinuation.java @@ -0,0 +1,21 @@ +package org.skywalking.apm.toolkit.opentracing; + +import io.opentracing.ActiveSpan; + +/** + * @author wusheng + */ +public class SkywalkingContinuation implements ActiveSpan.Continuation { + @NeedSnifferActivation("1. ContextManager#capture" + + "2. set ContextSnapshot to the dynamic field") + public SkywalkingContinuation() { + } + + @NeedSnifferActivation("1. get ContextSnapshot from the dynamic field" + + "2. ContextManager#continued") + @Override + public ActiveSpan activate() { + SkywalkingSpanBuilder builder = new SkywalkingSpanBuilder("Thread/" + Thread.currentThread().getName()); + return builder.startActive(); + } +} diff --git a/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingSpan.java b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingSpan.java new file mode 100644 index 000000000..4b82d6021 --- /dev/null +++ b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingSpan.java @@ -0,0 +1,128 @@ +package org.skywalking.apm.toolkit.opentracing; + +import io.opentracing.Span; +import io.opentracing.SpanContext; +import java.util.HashMap; +import java.util.Map; + +/** + * @author wusheng + */ +public class SkywalkingSpan implements Span { + @NeedSnifferActivation( + "1.ContextManager#createSpan (Entry,Exit,Local based on builder)." + + "2.set the span reference to the dynamic field of enhanced SkywalkingSpan") + public SkywalkingSpan(SkywalkingSpanBuilder builder) { + } + + /** + * Create a shell span for {@link SkywalkingTracer#activeSpan()} + * @param tracer + */ + @NeedSnifferActivation( + "1. set the span reference to the dynamic field of enhanced SkywalkingSpan" + ) + public SkywalkingSpan(SkywalkingTracer tracer){ + + } + + @NeedSnifferActivation("Override span's operationName, which has been given at ") + @Override + public Span setOperationName(String operationName) { + return this; + } + + @NeedSnifferActivation("AbstractTracingSpan#log(long timestampMicroseconds, Map fields)") + @Override + public Span log(long timestampMicroseconds, Map fields) { + return this; + } + + /** + * Stop the active span + * + * @param finishMicros + */ + @NeedSnifferActivation( + "1.ContextManager#stopSpan(AbstractSpan span)" + + "2. The parameter of stop methed is from the dynamic field of enhanced SkywalkingSpan") + @Override + public void finish(long finishMicros) { + + } + + @Override + public Span log(long timestampMicroseconds, String event) { + Map eventMap = new HashMap(1); + eventMap.put("event", event); + return log(timestampMicroseconds, eventMap); + } + + @Override + public void finish() { + this.finish(System.currentTimeMillis()); + } + + @Override + public SpanContext context() { + return SkywalkingContext.INSTANCE; + } + + @Override public Span setTag(String key, String value) { + return null; + } + + @Override public Span setTag(String key, boolean value) { + return null; + } + + @Override public Span setTag(String key, Number value) { + return null; + } + + @Override + public Span log(Map fields) { + return log(System.currentTimeMillis(), fields); + } + + @Override + public Span log(String event) { + return log(System.currentTimeMillis(), event); + } + + /** + * Don't support baggage item. + */ + @Override + public Span setBaggageItem(String key, String value) { + return this; + } + + /** + * Don't support baggage item. + * + * @return null, always. + */ + @Override + public String getBaggageItem(String key) { + return null; + } + + /** + * Don't support logging with payload. + */ + @Deprecated + @Override + public Span log(String eventName, Object payload) { + return this; + } + + /** + * Don't support logging with payload. + */ + @Deprecated + @Override + public Span log(long timestampMicroseconds, String eventName, Object payload) { + return this; + } +} diff --git a/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingSpanBuilder.java b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingSpanBuilder.java new file mode 100644 index 000000000..7c69d58e2 --- /dev/null +++ b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingSpanBuilder.java @@ -0,0 +1,177 @@ +package org.skywalking.apm.toolkit.opentracing; + +import io.opentracing.ActiveSpan; +import io.opentracing.BaseSpan; +import io.opentracing.References; +import io.opentracing.Span; +import io.opentracing.SpanContext; +import io.opentracing.Tracer; +import io.opentracing.tag.Tags; +import java.util.LinkedList; +import java.util.List; + +/** + * @author wusheng + */ +public class SkywalkingSpanBuilder implements Tracer.SpanBuilder { + private List tags = new LinkedList(); + private String operationName; + private boolean isEntry = false; + private boolean isExit = false; + private int port; + private String peer; + private String componentName; + private boolean isError = false; + private long startTime; + + public SkywalkingSpanBuilder(String operationName) { + this.operationName = operationName; + } + + @Override + public Tracer.SpanBuilder asChildOf(SpanContext parent) { + if (parent instanceof SkywalkingContext) { + return this; + } + throw new IllegalArgumentException("parent must be type of SpanContext"); + } + + @Override + public Tracer.SpanBuilder asChildOf(BaseSpan parent) { + if (parent instanceof SkywalkingSpan) { + return this; + } + throw new IllegalArgumentException("parent must be type of SkywalkingSpan"); + } + + /** + * Ignore the reference type. the span always the entry or has a parent span. + * + * @param referenceType + * @param referencedContext + * @return + */ + @Override + public Tracer.SpanBuilder addReference(String referenceType, SpanContext referencedContext) { + if (References.FOLLOWS_FROM.equals(referenceType)) { + throw new IllegalArgumentException("only support CHILD_OF reference"); + } + return asChildOf(referencedContext); + } + + @Override + public Tracer.SpanBuilder withTag(String key, String value) { + if (Tags.COMPONENT.equals(key)) { + componentName = value; + } else if (Tags.SPAN_KIND.equals(key)) { + if (Tags.SPAN_KIND_CLIENT.equals(key) || Tags.SPAN_KIND_PRODUCER.equals(key)) { + isEntry = false; + isExit = true; + } else if (Tags.SPAN_KIND_SERVER.equals(key) || Tags.SPAN_KIND_CONSUMER.equals(key)) { + isEntry = true; + isExit = false; + } else { + isEntry = false; + isExit = false; + } + } else if (Tags.PEER_HOST_IPV4.equals(key) || Tags.PEER_HOST_IPV6.equals(key) + || Tags.PEER_HOSTNAME.equals(key)) { + peer = value; + } else if (Tags.PEER_SERVICE.equals(key)) { + operationName = value; + } else { + tags.add(new Tag(key, value)); + } + return this; + } + + @Override + public Tracer.SpanBuilder withTag(String key, boolean value) { + if (Tags.ERROR.equals(key)) { + isError = value; + } else { + tags.add(new Tag(key, value ? "true" : "false")); + } + return this; + } + + @Override + public Tracer.SpanBuilder withTag(String key, Number value) { + if (Tags.PEER_PORT.equals(key)) { + port = value.intValue(); + } else { + tags.add(new Tag(key, value.toString())); + } + return this; + } + + @Override + public Tracer.SpanBuilder withStartTimestamp(long microseconds) { + startTime = microseconds; + return this; + } + + @Override + public ActiveSpan startActive() { + return new SkywalkingActiveSpan(new SkywalkingSpan(this)); + } + + @Override + public Span startManual() { + return new SkywalkingSpan(this); + } + + @Override + @Deprecated + public Span start() { + return startManual(); + } + + /** + * All the get methods are for accessing data from activation + */ + public List getTags() { + return tags; + } + + public String getOperationName() { + return operationName; + } + + public boolean isEntry() { + return isEntry; + } + + public boolean isExit() { + return isExit; + } + + public int getPort() { + return port; + } + + public String getPeer() { + return peer; + } + + public String getComponentName() { + return componentName; + } + + public boolean isError() { + return isError; + } + + public long getStartTime() { + return startTime; + } + + /** + * All the following methods are needed for activation. + */ + @Override + @NeedSnifferActivation("Stop the active span.") + public Tracer.SpanBuilder ignoreActiveSpan() { + return this; + } +} diff --git a/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkyWalkingTracer.java b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingTracer.java similarity index 61% rename from apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkyWalkingTracer.java rename to apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingTracer.java index 0b6a957c0..0ae5db2da 100644 --- a/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkyWalkingTracer.java +++ b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/SkywalkingTracer.java @@ -1,76 +1,84 @@ package org.skywalking.apm.toolkit.opentracing; +import io.opentracing.ActiveSpan; +import io.opentracing.Span; import io.opentracing.SpanContext; import io.opentracing.Tracer; import io.opentracing.propagation.Format; import io.opentracing.propagation.TextMap; - import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.Iterator; import java.util.Map; /** - * All source code in SkyWalkingTracer acts like an NoopTracer. - * Actually, it is NOT. - * The whole logic will be added after toolkit-activation. - *

- * Created by wusheng on 2016/12/20. + * @author wusheng */ -public class SkyWalkingTracer implements Tracer { +public class SkywalkingTracer implements Tracer { private static String TRACE_HEAD_NAME = "sw3"; - public static Tracer INSTANCE = new SkyWalkingTracer(); + @NeedSnifferActivation("1. ContextManager#inject" + + "2. ContextCarrier#serialize") + private String inject() { + return null; + } + @NeedSnifferActivation("1. ContextCarrier#deserialize" + + "2. ContextManager#extract") + private void extract(String carrier) { + + } @Override public SpanBuilder buildSpan(String operationName) { - return new SkyWalkingSpanBuilder(operationName); + return new SkywalkingSpanBuilder(operationName); } @Override public void inject(SpanContext spanContext, Format format, C carrier) { if (Format.Builtin.TEXT_MAP.equals(format) || Format.Builtin.HTTP_HEADERS.equals(format)) { - ((TextMap) carrier).put(TRACE_HEAD_NAME, formatInjectCrossProcessPropagationContextData()); + ((TextMap)carrier).put(TRACE_HEAD_NAME, inject()); } else if (Format.Builtin.BINARY.equals(format)) { byte[] key = TRACE_HEAD_NAME.getBytes(ByteBufferContext.CHARSET); - byte[] value = formatInjectCrossProcessPropagationContextData().getBytes(ByteBufferContext.CHARSET); - ((ByteBuffer) carrier).put(key); - ((ByteBuffer) carrier).putInt(value.length); - ((ByteBuffer) carrier).put(value); + byte[] value = inject().getBytes(ByteBufferContext.CHARSET); + ((ByteBuffer)carrier).put(key); + ((ByteBuffer)carrier).putInt(value.length); + ((ByteBuffer)carrier).put(value); + } else { + throw new IllegalArgumentException("Unsupported format: " + format); + } + + } + + @Override + public SpanContext extract(Format format, C carrier) { + if (Format.Builtin.TEXT_MAP.equals(format) || Format.Builtin.HTTP_HEADERS.equals(format)) { + TextMap textMapCarrier = (TextMap)carrier; + extract(fetchContextData(textMapCarrier)); + return new TextMapContext(textMapCarrier); + } else if (Format.Builtin.BINARY.equals(format)) { + ByteBuffer byteBufferCarrier = (ByteBuffer)carrier; + extract(fetchContextData(byteBufferCarrier)); + return new ByteBufferContext((ByteBuffer)carrier); } else { throw new IllegalArgumentException("Unsupported format: " + format); } } @Override - public SpanContext extract(Format format, C carrier) { - if (Format.Builtin.TEXT_MAP.equals(format) || Format.Builtin.HTTP_HEADERS.equals(format)) { - TextMap textMapCarrier = (TextMap) carrier; - formatExtractCrossProcessPropagationContextData(fetchContextData(textMapCarrier)); - return new TextMapContext(textMapCarrier); - } else if (Format.Builtin.BINARY.equals(format)) { - ByteBuffer byteBufferCarrier = (ByteBuffer) carrier; - formatExtractCrossProcessPropagationContextData(fetchContextData(byteBufferCarrier)); - return new ByteBufferContext((ByteBuffer) carrier); + public ActiveSpan activeSpan() { + return new SkywalkingActiveSpan(new SkywalkingSpan(this)); + } + + @Override + public ActiveSpan makeActive(Span span) { + if (span instanceof SkywalkingSpan) { + return new SkywalkingActiveSpan((SkywalkingSpan)span); } else { - throw new IllegalArgumentException("Unsupported format: " + format); + throw new IllegalArgumentException("span must be a type of SkywalkingSpan"); } } - /** - * set context data in toolkit-opentracing-activation - */ - private String formatInjectCrossProcessPropagationContextData() { - return ""; - } - - /** - * read context data in toolkit-opentracing-activation - */ - private void formatExtractCrossProcessPropagationContextData(String contextData) { - } - private String fetchContextData(TextMap textMap) { Iterator> iterator = textMap.iterator(); while (iterator.hasNext()) { @@ -99,4 +107,5 @@ public class SkyWalkingTracer implements Tracer { return null; } } + } diff --git a/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/Tag.java b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/Tag.java new file mode 100644 index 000000000..8a5fdc524 --- /dev/null +++ b/apm-application-toolkit/apm-toolkit-opentracing/src/main/java/org/skywalking/apm/toolkit/opentracing/Tag.java @@ -0,0 +1,22 @@ +package org.skywalking.apm.toolkit.opentracing; + +/** + * @author wusheng + */ +public class Tag { + private String key; + private String value; + + public Tag(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public String getValue() { + return value; + } +} diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/ContextManager.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/ContextManager.java index 7f7b11ebb..a26a777f6 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/ContextManager.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/ContextManager.java @@ -5,6 +5,7 @@ import org.skywalking.apm.agent.core.boot.ServiceManager; import org.skywalking.apm.agent.core.conf.Config; import org.skywalking.apm.agent.core.conf.RemoteDownstreamConfig; import org.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; import org.skywalking.apm.agent.core.context.trace.TraceSegment; import org.skywalking.apm.agent.core.dictionary.DictionaryUtil; import org.skywalking.apm.agent.core.sampling.SamplingService; @@ -106,6 +107,28 @@ public class ContextManager implements TracingContextListener, BootService, Igno return span; } + public static void inject(ContextCarrier contextCarrier) { + AbstractSpan span = activeSpan(); + if (span instanceof AbstractTracingSpan) { + if (span.isExit()) { + get().inject(contextCarrier); + } else { + throw new IllegalStateException("Can't do inject when the active span isn't an exit span"); + } + } + } + + public static void extract(ContextCarrier contextCarrier) { + AbstractSpan span = activeSpan(); + if (span instanceof AbstractTracingSpan) { + if (span.isEntry()) { + get().extract(contextCarrier); + } else { + throw new IllegalStateException("Can't do extract when the active span isn't an entry span"); + } + } + } + public ContextSnapshot capture() { return get().capture(); } @@ -122,7 +145,11 @@ public class ContextManager implements TracingContextListener, BootService, Igno } public static void stopSpan() { - get().stopSpan(activeSpan()); + stopSpan(activeSpan()); + } + + public static void stopSpan(AbstractSpan span) { + get().stopSpan(span); } @Override diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java index 4efc51749..449038d47 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java @@ -2,6 +2,7 @@ package org.skywalking.apm.agent.core.context.trace; import java.util.LinkedList; import java.util.List; +import java.util.Map; import org.skywalking.apm.agent.core.context.util.KeyValuePair; import org.skywalking.apm.agent.core.context.util.ThrowableTransformer; import org.skywalking.apm.agent.core.dictionary.DictionaryUtil; @@ -106,7 +107,25 @@ public abstract class AbstractTracingSpan implements AbstractSpan { .add(new KeyValuePair("error.kind", t.getClass().getName())) .add(new KeyValuePair("message", t.getMessage())) .add(new KeyValuePair("stack", ThrowableTransformer.INSTANCE.convert2String(t, 4000))) - .build()); + .build(System.currentTimeMillis())); + return this; + } + + /** + * Record a common log with multi fields, for supporting opentracing-java + * + * @param fields + * @return the Span, for chaining + */ + public AbstractSpan log(long timestampMicroseconds, Map fields) { + if (logs == null) { + logs = new LinkedList(); + } + LogDataEntity.Builder builder = new LogDataEntity.Builder(); + for (Map.Entry entry : fields.entrySet()) { + builder.add(new KeyValuePair(entry.getKey(), entry.getValue().toString())); + } + logs.add(builder.build(timestampMicroseconds)); return this; } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/LogDataEntity.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/LogDataEntity.java index e3b732aff..f79644d5c 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/LogDataEntity.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/LogDataEntity.java @@ -12,9 +12,11 @@ import org.skywalking.apm.network.proto.LogMessage; * @author wusheng */ public class LogDataEntity { - protected List logs; + private long timestamp = 0; + private List logs; - private LogDataEntity(List logs) { + private LogDataEntity(long timestamp, List logs) { + this.timestamp = timestamp; this.logs = logs; } @@ -36,8 +38,8 @@ public class LogDataEntity { return this; } - public LogDataEntity build() { - return new LogDataEntity(logs); + public LogDataEntity build(long timestamp) { + return new LogDataEntity(timestamp, logs); } } @@ -46,6 +48,7 @@ public class LogDataEntity { for (KeyValuePair log : logs) { logMessageBuilder.addData(log.transform()); } + logMessageBuilder.setTime(timestamp); return logMessageBuilder.build(); } }