提交 3abbc671 编写于 作者: wu-sheng's avatar wu-sheng 提交者: GitHub

Merge pull request #172 from ascrutae/zhangxin/fix/169

The opentracing-toolkit context can not propagation across process
...@@ -6,6 +6,9 @@ import io.opentracing.propagation.Format; ...@@ -6,6 +6,9 @@ import io.opentracing.propagation.Format;
import io.opentracing.propagation.TextMap; import io.opentracing.propagation.TextMap;
import java.nio.ByteBuffer; 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. * All source code in SkyWalkingTracer acts like an NoopTracer.
...@@ -15,10 +18,11 @@ import java.nio.ByteBuffer; ...@@ -15,10 +18,11 @@ import java.nio.ByteBuffer;
* Created by wusheng on 2016/12/20. * Created by wusheng on 2016/12/20.
*/ */
public class SkyWalkingTracer implements Tracer { 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(); public static Tracer INSTANCE = new SkyWalkingTracer();
@Override @Override
public SpanBuilder buildSpan(String operationName) { public SpanBuilder buildSpan(String operationName) {
return new SkyWalkingSpanBuilder(operationName); return new SkyWalkingSpanBuilder(operationName);
...@@ -27,15 +31,13 @@ public class SkyWalkingTracer implements Tracer { ...@@ -27,15 +31,13 @@ public class SkyWalkingTracer implements Tracer {
@Override @Override
public <C> void inject(SpanContext spanContext, Format<C> format, C carrier) { public <C> void inject(SpanContext spanContext, Format<C> format, C carrier) {
if (Format.Builtin.TEXT_MAP.equals(format) || Format.Builtin.HTTP_HEADERS.equals(format)) { 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)) { } else if (Format.Builtin.BINARY.equals(format)) {
byte[] key = TRACE_HEAD_NAME.getBytes(ByteBufferContext.CHARSET); byte[] key = TRACE_HEAD_NAME.getBytes(ByteBufferContext.CHARSET);
byte[] value = formatCrossProcessPropagationContextData().getBytes(ByteBufferContext.CHARSET); byte[] value = formatInjectCrossProcessPropagationContextData().getBytes(ByteBufferContext.CHARSET);
((ByteBuffer)carrier).put(ByteBufferContext.ENTRY); ((ByteBuffer) carrier).put(key);
((ByteBuffer)carrier).putInt(key.length); ((ByteBuffer) carrier).putInt(value.length);
((ByteBuffer)carrier).putInt(value.length); ((ByteBuffer) carrier).put(value);
((ByteBuffer)carrier).put(key);
((ByteBuffer)carrier).put(value);
} else { } else {
throw new IllegalArgumentException("Unsupported format: " + format); throw new IllegalArgumentException("Unsupported format: " + format);
} }
...@@ -44,13 +46,13 @@ public class SkyWalkingTracer implements Tracer { ...@@ -44,13 +46,13 @@ public class SkyWalkingTracer implements Tracer {
@Override @Override
public <C> SpanContext extract(Format<C> format, C carrier) { public <C> SpanContext extract(Format<C> format, C carrier) {
if (Format.Builtin.TEXT_MAP.equals(format) || Format.Builtin.HTTP_HEADERS.equals(format)) { if (Format.Builtin.TEXT_MAP.equals(format) || Format.Builtin.HTTP_HEADERS.equals(format)) {
TextMap textMapCarrier = (TextMap)carrier; TextMap textMapCarrier = (TextMap) carrier;
extractCrossProcessPropagationContextData(textMapCarrier); formatExtractCrossProcessPropagationContextData(fetchContextData(textMapCarrier));
return new TextMapContext(textMapCarrier); return new TextMapContext(textMapCarrier);
} else if (Format.Builtin.BINARY.equals(format)) { } else if (Format.Builtin.BINARY.equals(format)) {
ByteBuffer byteBufferCarrier = (ByteBuffer)carrier; ByteBuffer byteBufferCarrier = (ByteBuffer) carrier;
extractCrossProcessPropagationContextData(byteBufferCarrier); formatExtractCrossProcessPropagationContextData(fetchContextData(byteBufferCarrier));
return new ByteBufferContext((ByteBuffer)carrier); return new ByteBufferContext((ByteBuffer) carrier);
} else { } else {
throw new IllegalArgumentException("Unsupported format: " + format); throw new IllegalArgumentException("Unsupported format: " + format);
} }
...@@ -58,28 +60,43 @@ public class SkyWalkingTracer implements Tracer { ...@@ -58,28 +60,43 @@ public class SkyWalkingTracer implements Tracer {
/** /**
* set context data in toolkit-opentracing-activation * set context data in toolkit-opentracing-activation
*
* @return
*/ */
private String formatCrossProcessPropagationContextData() { private String formatInjectCrossProcessPropagationContextData() {
return ""; return "";
} }
/** /**
* read context data in toolkit-opentracing-activation * read context data in toolkit-opentracing-activation
*
* @param textMapCarrier
*/ */
private void extractCrossProcessPropagationContextData(TextMap textMapCarrier) { private void formatExtractCrossProcessPropagationContextData(String contextData) {
}
private String fetchContextData(TextMap textMap) {
Iterator<Map.Entry<String, String>> iterator = textMap.iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
if (TRACE_HEAD_NAME.equals(entry.getKey())) {
return entry.getValue();
}
}
return null;
} }
/** private String fetchContextData(ByteBuffer byteBuffer) {
* read context data in toolkit-opentracing-activation String contextDataStr = new String(byteBuffer.array(), Charset.forName("UTF-8"));
* int index = contextDataStr.indexOf(TRACE_HEAD_NAME);
* @param byteBufferCarrier if (index == -1) {
*/ return null;
private void extractCrossProcessPropagationContextData(ByteBuffer byteBufferCarrier) { }
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;
}
} }
} }
...@@ -2,11 +2,10 @@ package com.a.eye.skywalking.toolkit.activation.opentracing.span; ...@@ -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.ConstructorInterceptPoint;
import com.a.eye.skywalking.api.plugin.interceptor.InstanceMethodsInterceptPoint; import com.a.eye.skywalking.api.plugin.interceptor.InstanceMethodsInterceptPoint;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; import com.a.eye.skywalking.api.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
import java.util.Map;
import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.matcher.ElementMatcher; import net.bytebuddy.matcher.ElementMatcher;
import java.util.Map;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
......
...@@ -6,6 +6,7 @@ import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeC ...@@ -6,6 +6,7 @@ import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeC
import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; 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.api.plugin.interceptor.enhance.MethodInterceptResult;
import com.a.eye.skywalking.toolkit.opentracing.SkyWalkingSpan; import com.a.eye.skywalking.toolkit.opentracing.SkyWalkingSpan;
import io.opentracing.tag.Tags;
/** /**
* Intercept these following methods: * Intercept these following methods:
...@@ -15,10 +16,15 @@ import com.a.eye.skywalking.toolkit.opentracing.SkyWalkingSpan; ...@@ -15,10 +16,15 @@ import com.a.eye.skywalking.toolkit.opentracing.SkyWalkingSpan;
*/ */
public class SpanSetTagInterceptor implements InstanceMethodsAroundInterceptor { 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 @Override
public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
MethodInterceptResult result) { MethodInterceptResult result) {
String key = (String)interceptorContext.allArguments()[0]; String key = adaptTag((String)interceptorContext.allArguments()[0]);
Object value = interceptorContext.allArguments()[1]; Object value = interceptorContext.allArguments()[1];
if (value instanceof String) if (value instanceof String)
ContextManager.activeSpan().setTag(key, (String)value); ContextManager.activeSpan().setTag(key, (String)value);
...@@ -32,6 +38,33 @@ public class SpanSetTagInterceptor implements InstanceMethodsAroundInterceptor { ...@@ -32,6 +38,33 @@ public class SpanSetTagInterceptor implements InstanceMethodsAroundInterceptor {
ContextManager.activeSpan().setTag(key, value.toString()); ContextManager.activeSpan().setTag(key, value.toString());
} }
/**
* Adapt {@link Tags} of open tracing.
*
* @return tag key
*/
private String adaptTag(String tagKey) {
String key = tagKey;
if (isPeerTag(key)) {
key = KEY_OF_PEER_HOST_TAG;
}
return key;
}
/**
* Check whether current tag is one of {@link Tags#PEER_HOSTNAME}, {@link Tags#PEER_HOST_IPV4} and {@link Tags#PEER_HOST_IPV6}.
* If yes, will use the {@link com.a.eye.skywalking.trace.tag.Tags#PEER_HOST} as the key, instead of original key,
* in {@link #adaptTag(String)}.
*
* @param key of current tag
* @return true if this tag is host related.
*/
private boolean isPeerTag(String key) {
return Tags.PEER_HOST_IPV4.equals(key) || Tags.PEER_HOST_IPV6.equals(key) || Tags.PEER_HOSTNAME.equals(key);
}
@Override @Override
public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
Object ret) { Object ret) {
......
...@@ -6,11 +6,7 @@ import com.a.eye.skywalking.api.plugin.interceptor.enhance.ClassInstanceMethodsE ...@@ -6,11 +6,7 @@ import com.a.eye.skywalking.api.plugin.interceptor.enhance.ClassInstanceMethodsE
import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.matcher.ElementMatcher; 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.named;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
/** /**
* @author wusheng * @author wusheng
...@@ -32,34 +28,23 @@ public class SkyWalkingTracerActivation extends ClassInstanceMethodsEnhancePlugi ...@@ -32,34 +28,23 @@ public class SkyWalkingTracerActivation extends ClassInstanceMethodsEnhancePlugi
new InstanceMethodsInterceptPoint() { new InstanceMethodsInterceptPoint() {
@Override @Override
public ElementMatcher<MethodDescription> getMethodsMatcher() { public ElementMatcher<MethodDescription> getMethodsMatcher() {
return named("formatCrossProcessPropagationContextData"); return named("formatInjectCrossProcessPropagationContextData");
}
@Override
public String getMethodsInterceptor() {
return "com.a.eye.skywalking.toolkit.activation.opentracing.tracer.interceptor.TracerFormatCrossProcessContextInterceptor";
}
},
new InstanceMethodsInterceptPoint() {
@Override
public ElementMatcher<MethodDescription> getMethodsMatcher() {
return named("extractCrossProcessPropagationContextData").and(takesArgumentWithType(0, "io.opentracing.propagation.TextMap"));
} }
@Override @Override
public String getMethodsInterceptor() { public String getMethodsInterceptor() {
return "com.a.eye.skywalking.toolkit.activation.opentracing.tracer.interceptor.TracerExtractCrossProcessTextMapContextInterceptor"; return "com.a.eye.skywalking.toolkit.activation.opentracing.tracer.interceptor.TracerInjectFormatCrossProcessContextInterceptor";
} }
}, },
new InstanceMethodsInterceptPoint() { new InstanceMethodsInterceptPoint() {
@Override @Override
public ElementMatcher<MethodDescription> getMethodsMatcher() { public ElementMatcher<MethodDescription> getMethodsMatcher() {
return named("extractCrossProcessPropagationContextData").and(takesArgument(0, ByteBuffer.class)); return named("formatExtractCrossProcessPropagationContextData");
} }
@Override @Override
public String getMethodsInterceptor() { 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";
} }
} }
}; };
......
...@@ -6,16 +6,12 @@ import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; ...@@ -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.InstanceMethodInvokeContext;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; 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.api.plugin.interceptor.enhance.MethodInterceptResult;
import com.a.eye.skywalking.toolkit.opentracing.SkyWalkingTracer; 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 @Override
public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
MethodInterceptResult result) { MethodInterceptResult result) {
...@@ -25,8 +21,7 @@ public class TracerExtractCrossProcessByteBufferContextInterceptor implements In ...@@ -25,8 +21,7 @@ public class TracerExtractCrossProcessByteBufferContextInterceptor implements In
@Override @Override
public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
Object ret) { Object ret) {
ByteBuffer byteBuffer = (ByteBuffer)interceptorContext.allArguments()[0]; String contextDataStr = (String)interceptorContext.allArguments()[0];
String contextDataStr = new String(byteBuffer.array(), Charset.forName("UTF-8"));
ContextCarrier carrier = new ContextCarrier(); ContextCarrier carrier = new ContextCarrier();
carrier.deserialize(contextDataStr); carrier.deserialize(contextDataStr);
......
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<Map.Entry<String, String>> iterator = textMap.iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> 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) {
}
}
...@@ -9,9 +9,9 @@ import com.a.eye.skywalking.api.plugin.interceptor.enhance.MethodInterceptResult ...@@ -9,9 +9,9 @@ import com.a.eye.skywalking.api.plugin.interceptor.enhance.MethodInterceptResult
import com.a.eye.skywalking.toolkit.opentracing.SkyWalkingTracer; 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 @Override
public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
MethodInterceptResult result) { MethodInterceptResult result) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册