From 0544edabf737d9b4cc6b8a842f38a553d75dc0cc Mon Sep 17 00:00:00 2001 From: zhangxin Date: Wed, 26 Apr 2017 14:08:19 +0800 Subject: [PATCH] fix issue that skywalking extract binary data failed and refectory code --- .../toolkit/opentracing/SkyWalkingTracer.java | 69 ++++++++++++------- .../span/SkyWalkingSpanActivation.java | 3 +- .../interceptor/SpanSetTagInterceptor.java | 36 +++++++++- .../tracer/SkyWalkingTracerActivation.java | 23 ++----- ...xtractCrossProcessContextInterceptor.java} | 11 +-- ...CrossProcessTextMapContextInterceptor.java | 49 ------------- ...FormatCrossProcessContextInterceptor.java} | 4 +- 7 files changed, 88 insertions(+), 107 deletions(-) rename skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/{TracerExtractCrossProcessByteBufferContextInterceptor.java => TracerExtractCrossProcessContextInterceptor.java} (72%) delete mode 100644 skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessTextMapContextInterceptor.java rename skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/{TracerFormatCrossProcessContextInterceptor.java => TracerInjectFormatCrossProcessContextInterceptor.java} (86%) diff --git a/skywalking-application-toolkit/skywalking-toolkit-opentracing/src/main/java/com/a/eye/skywalking/toolkit/opentracing/SkyWalkingTracer.java b/skywalking-application-toolkit/skywalking-toolkit-opentracing/src/main/java/com/a/eye/skywalking/toolkit/opentracing/SkyWalkingTracer.java index 6bcda063d..def5873a1 100644 --- a/skywalking-application-toolkit/skywalking-toolkit-opentracing/src/main/java/com/a/eye/skywalking/toolkit/opentracing/SkyWalkingTracer.java +++ b/skywalking-application-toolkit/skywalking-toolkit-opentracing/src/main/java/com/a/eye/skywalking/toolkit/opentracing/SkyWalkingTracer.java @@ -6,6 +6,9 @@ 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. @@ -15,10 +18,11 @@ import java.nio.ByteBuffer; * Created by wusheng on 2016/12/20. */ public class SkyWalkingTracer implements Tracer { - private static String TRACE_HEAD_NAME = "SW-TRACING-NAME"; + private static String TRACE_HEAD_NAME = "sw3"; public static Tracer INSTANCE = new SkyWalkingTracer(); + @Override public SpanBuilder buildSpan(String operationName) { return new SkyWalkingSpanBuilder(operationName); @@ -27,15 +31,13 @@ public class SkyWalkingTracer implements Tracer { @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, formatCrossProcessPropagationContextData()); + ((TextMap) carrier).put(TRACE_HEAD_NAME, formatInjectCrossProcessPropagationContextData()); } else if (Format.Builtin.BINARY.equals(format)) { byte[] key = TRACE_HEAD_NAME.getBytes(ByteBufferContext.CHARSET); - byte[] value = formatCrossProcessPropagationContextData().getBytes(ByteBufferContext.CHARSET); - ((ByteBuffer)carrier).put(ByteBufferContext.ENTRY); - ((ByteBuffer)carrier).putInt(key.length); - ((ByteBuffer)carrier).putInt(value.length); - ((ByteBuffer)carrier).put(key); - ((ByteBuffer)carrier).put(value); + byte[] value = formatInjectCrossProcessPropagationContextData().getBytes(ByteBufferContext.CHARSET); + ((ByteBuffer) carrier).put(key); + ((ByteBuffer) carrier).putInt(value.length); + ((ByteBuffer) carrier).put(value); } else { throw new IllegalArgumentException("Unsupported format: " + format); } @@ -44,13 +46,13 @@ public class SkyWalkingTracer implements Tracer { @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; - extractCrossProcessPropagationContextData(textMapCarrier); + TextMap textMapCarrier = (TextMap) carrier; + formatExtractCrossProcessPropagationContextData(fetchContextData(textMapCarrier)); return new TextMapContext(textMapCarrier); } else if (Format.Builtin.BINARY.equals(format)) { - ByteBuffer byteBufferCarrier = (ByteBuffer)carrier; - extractCrossProcessPropagationContextData(byteBufferCarrier); - return new ByteBufferContext((ByteBuffer)carrier); + ByteBuffer byteBufferCarrier = (ByteBuffer) carrier; + formatExtractCrossProcessPropagationContextData(fetchContextData(byteBufferCarrier)); + return new ByteBufferContext((ByteBuffer) carrier); } else { throw new IllegalArgumentException("Unsupported format: " + format); } @@ -58,28 +60,43 @@ public class SkyWalkingTracer implements Tracer { /** * set context data in toolkit-opentracing-activation - * - * @return */ - private String formatCrossProcessPropagationContextData() { + private String formatInjectCrossProcessPropagationContextData() { return ""; } /** * read context data in toolkit-opentracing-activation - * - * @param textMapCarrier */ - private void extractCrossProcessPropagationContextData(TextMap textMapCarrier) { - + private void formatExtractCrossProcessPropagationContextData(String contextData) { } - /** - * read context data in toolkit-opentracing-activation - * - * @param byteBufferCarrier - */ - private void extractCrossProcessPropagationContextData(ByteBuffer byteBufferCarrier) { + private String fetchContextData(TextMap textMap) { + Iterator> iterator = textMap.iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + if (TRACE_HEAD_NAME.equals(entry.getKey())) { + return entry.getValue(); + } + } + return null; + } + + private String fetchContextData(ByteBuffer byteBuffer) { + String contextDataStr = new String(byteBuffer.array(), Charset.forName("UTF-8")); + int index = contextDataStr.indexOf(TRACE_HEAD_NAME); + if (index == -1) { + return null; + } + + try { + byteBuffer.position(index + TRACE_HEAD_NAME.getBytes().length); + byte[] contextDataBytes = new byte[byteBuffer.getInt()]; + byteBuffer.get(contextDataBytes); + return new String(contextDataBytes, Charset.forName("UTF-8")); + } catch (Exception e) { + return null; + } } } diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/SkyWalkingSpanActivation.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/SkyWalkingSpanActivation.java index 737b920d4..100b57c39 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/SkyWalkingSpanActivation.java +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/SkyWalkingSpanActivation.java @@ -2,11 +2,10 @@ package com.a.eye.skywalking.toolkit.activation.opentracing.span; import com.a.eye.skywalking.api.plugin.interceptor.ConstructorInterceptPoint; import com.a.eye.skywalking.api.plugin.interceptor.InstanceMethodsInterceptPoint; - import com.a.eye.skywalking.api.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import java.util.Map; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.matcher.ElementMatcher; -import java.util.Map; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanSetTagInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanSetTagInterceptor.java index e3a6e7ba9..e9cf6e2e4 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanSetTagInterceptor.java +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanSetTagInterceptor.java @@ -7,6 +7,9 @@ import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodsAround import com.a.eye.skywalking.api.plugin.interceptor.enhance.MethodInterceptResult; import com.a.eye.skywalking.toolkit.opentracing.SkyWalkingSpan; +import io.opentracing.Span; +import io.opentracing.tag.Tags; + /** * Intercept these following methods: * {@link SkyWalkingSpan#setTag(String, boolean)} @@ -15,10 +18,15 @@ import com.a.eye.skywalking.toolkit.opentracing.SkyWalkingSpan; */ public class SpanSetTagInterceptor implements InstanceMethodsAroundInterceptor { + /** + * key of {@link com.a.eye.skywalking.trace.tag.Tags#PEER_HOST} + */ + private static final String KEY_OF_PEER_HOST_TAG = "peer.host"; + @Override public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result) { - String key = (String)interceptorContext.allArguments()[0]; + String key = fetchTagKeyFromArguments(interceptorContext.allArguments()); Object value = interceptorContext.allArguments()[1]; if (value instanceof String) ContextManager.activeSpan().setTag(key, (String)value); @@ -30,6 +38,32 @@ public class SpanSetTagInterceptor implements InstanceMethodsAroundInterceptor { ContextManager.activeSpan().setTag(key, value.toString()); } + /** + * Fetch tag key of {@link Span#setTag}. + * + * @return tag key + */ + private String fetchTagKeyFromArguments(Object[] arguments) { + String key = (String)arguments[0]; + + if (isPeerHostPrefix(key)) { + key = KEY_OF_PEER_HOST_TAG; + } + + return key; + } + + /** + * Skywalking put the tag value of {@link Tags#PEER_HOSTNAME}, {@link Tags#PEER_HOST_IPV4} and + * {@link Tags#PEER_HOST_IPV6} into {@link com.a.eye.skywalking.trace.tag.Tags#PEER_HOST} which + * facilitate analysis. + * + * @param key tag key + */ + private boolean isPeerHostPrefix(String key) { + return Tags.PEER_HOST_IPV4.equals(key) || Tags.PEER_HOST_IPV6.equals(key) || Tags.PEER_HOSTNAME.equals(key); + } + @Override public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, Object ret) { diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/SkyWalkingTracerActivation.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/SkyWalkingTracerActivation.java index a1974a583..b91fc177b 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/SkyWalkingTracerActivation.java +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/SkyWalkingTracerActivation.java @@ -6,11 +6,7 @@ import com.a.eye.skywalking.api.plugin.interceptor.enhance.ClassInstanceMethodsE import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.matcher.ElementMatcher; -import java.nio.ByteBuffer; - -import static com.a.eye.skywalking.api.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; /** * @author wusheng @@ -32,34 +28,23 @@ public class SkyWalkingTracerActivation extends ClassInstanceMethodsEnhancePlugi new InstanceMethodsInterceptPoint() { @Override public ElementMatcher getMethodsMatcher() { - return named("formatCrossProcessPropagationContextData"); + return named("formatInjectCrossProcessPropagationContextData"); } @Override public String getMethodsInterceptor() { - return "com.a.eye.skywalking.toolkit.activation.opentracing.tracer.interceptor.TracerFormatCrossProcessContextInterceptor"; + return "com.a.eye.skywalking.toolkit.activation.opentracing.tracer.interceptor.TracerInjectFormatCrossProcessContextInterceptor"; } }, new InstanceMethodsInterceptPoint() { @Override public ElementMatcher getMethodsMatcher() { - return named("extractCrossProcessPropagationContextData").and(takesArgumentWithType(0, "io.opentracing.propagation.TextMap")); + return named("formatExtractCrossProcessPropagationContextData"); } @Override public String getMethodsInterceptor() { - return "com.a.eye.skywalking.toolkit.activation.opentracing.tracer.interceptor.TracerExtractCrossProcessTextMapContextInterceptor"; - } - }, - new InstanceMethodsInterceptPoint() { - @Override - public ElementMatcher getMethodsMatcher() { - return named("extractCrossProcessPropagationContextData").and(takesArgument(0, ByteBuffer.class)); - } - - @Override - public String getMethodsInterceptor() { - return "com.a.eye.skywalking.toolkit.activation.opentracing.tracer.interceptor.TracerExtractCrossProcessByteBufferContextInterceptor"; + return "com.a.eye.skywalking.toolkit.activation.opentracing.tracer.interceptor.TracerExtractCrossProcessContextInterceptor"; } } }; diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessByteBufferContextInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessContextInterceptor.java similarity index 72% rename from skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessByteBufferContextInterceptor.java rename to skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessContextInterceptor.java index 034c8de01..3c6226460 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessByteBufferContextInterceptor.java +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessContextInterceptor.java @@ -6,16 +6,12 @@ import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext; import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import com.a.eye.skywalking.api.plugin.interceptor.enhance.MethodInterceptResult; - import com.a.eye.skywalking.toolkit.opentracing.SkyWalkingTracer; -import io.opentracing.propagation.TextMap; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; /** - * Intercept {@link SkyWalkingTracer#extractCrossProcessPropagationContextData(TextMap)} + * Intercept {@link SkyWalkingTracer#formatExtractCrossProcessPropagationContextData(String)} */ -public class TracerExtractCrossProcessByteBufferContextInterceptor implements InstanceMethodsAroundInterceptor { +public class TracerExtractCrossProcessContextInterceptor implements InstanceMethodsAroundInterceptor { @Override public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result) { @@ -25,8 +21,7 @@ public class TracerExtractCrossProcessByteBufferContextInterceptor implements In @Override public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, Object ret) { - ByteBuffer byteBuffer = (ByteBuffer)interceptorContext.allArguments()[0]; - String contextDataStr = new String(byteBuffer.array(), Charset.forName("UTF-8")); + String contextDataStr = (String)interceptorContext.allArguments()[0]; ContextCarrier carrier = new ContextCarrier(); carrier.deserialize(contextDataStr); diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessTextMapContextInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessTextMapContextInterceptor.java deleted file mode 100644 index 9e4223930..000000000 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessTextMapContextInterceptor.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.a.eye.skywalking.toolkit.activation.opentracing.tracer.interceptor; - -import com.a.eye.skywalking.api.context.ContextCarrier; -import com.a.eye.skywalking.api.context.ContextManager; -import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; -import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext; -import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; -import com.a.eye.skywalking.api.plugin.interceptor.enhance.MethodInterceptResult; -import com.a.eye.skywalking.toolkit.opentracing.SkyWalkingTracer; -import io.opentracing.propagation.TextMap; -import java.util.Iterator; -import java.util.Map; - -/** - * Intercept {@link SkyWalkingTracer#extractCrossProcessPropagationContextData(TextMap)} - */ -public class TracerExtractCrossProcessTextMapContextInterceptor implements InstanceMethodsAroundInterceptor { - - public static final String SKY_WALKING_TRACING_NAME = "SW-TRACING-NAME"; - - @Override - public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - MethodInterceptResult result) { - // Do nothing - } - - @Override - public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - Object ret) { - TextMap textMap = (TextMap)interceptorContext.allArguments()[0]; - Iterator> iterator = textMap.iterator(); - while (iterator.hasNext()) { - Map.Entry entry = iterator.next(); - if (SKY_WALKING_TRACING_NAME.equals(entry.getKey())) { - ContextCarrier carrier = new ContextCarrier(); - carrier.deserialize(entry.getValue()); - - ContextManager.extract(carrier); - } - } - return ret; - } - - @Override - public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { - - } -} diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerFormatCrossProcessContextInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerInjectFormatCrossProcessContextInterceptor.java similarity index 86% rename from skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerFormatCrossProcessContextInterceptor.java rename to skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerInjectFormatCrossProcessContextInterceptor.java index d9de6c24f..6afe02e48 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerFormatCrossProcessContextInterceptor.java +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerInjectFormatCrossProcessContextInterceptor.java @@ -9,9 +9,9 @@ import com.a.eye.skywalking.api.plugin.interceptor.enhance.MethodInterceptResult import com.a.eye.skywalking.toolkit.opentracing.SkyWalkingTracer; /** - * Intercept {@link SkyWalkingTracer#formatCrossProcessPropagationContextData()} + * Intercept {@link SkyWalkingTracer#formatInjectCrossProcessPropagationContextData()} */ -public class TracerFormatCrossProcessContextInterceptor implements InstanceMethodsAroundInterceptor { +public class TracerInjectFormatCrossProcessContextInterceptor implements InstanceMethodsAroundInterceptor { @Override public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result) {