From 085f9b69fdc9416675743a8a5b2a43593eef592f Mon Sep 17 00:00:00 2001 From: baiyang Date: Mon, 17 Apr 2017 22:04:22 +0800 Subject: [PATCH 1/9] Support plugin for MongoDB --- skywalking-sniffer/skywalking-agent/pom.xml | 5 + .../mongodb-plugin/pom.xml | 52 +++++++ .../mongodb/MongoDBMethodInterceptor.java | 139 ++++++++++++++++++ .../MongoDBReadBindingInterceptor.java | 46 ++++++ .../MongoDBWriteBindingInterceptor.java | 46 ++++++ .../plugin/mongodb/OperationInfo.java | 51 +++++++ .../skywalking/plugin/mongodb/ReadMethod.java | 22 +++ .../plugin/mongodb/WriteMethod.java | 23 +++ .../define/MongoDBInstrumentation.java | 72 +++++++++ .../src/main/resources/skywalking-plugin.def | 1 + .../skywalking-sdk-plugin/pom.xml | 1 + 11 files changed, 458 insertions(+) create mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/pom.xml create mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBMethodInterceptor.java create mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBReadBindingInterceptor.java create mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBWriteBindingInterceptor.java create mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/OperationInfo.java create mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/ReadMethod.java create mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/WriteMethod.java create mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/define/MongoDBInstrumentation.java create mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/resources/skywalking-plugin.def diff --git a/skywalking-sniffer/skywalking-agent/pom.xml b/skywalking-sniffer/skywalking-agent/pom.xml index df778f4c8..0d1ebff04 100644 --- a/skywalking-sniffer/skywalking-agent/pom.xml +++ b/skywalking-sniffer/skywalking-agent/pom.xml @@ -55,6 +55,11 @@ motan-plugin ${project.version} + + com.a.eye + skywalking-mongodb-plugin + ${project.version} + diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/pom.xml b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/pom.xml new file mode 100644 index 000000000..ba40b3142 --- /dev/null +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + skywalking-sdk-plugin + com.a.eye + 3.0.1-2017 + + + skywalking-mongodb-plugin + jar + + mongodb-plugin + http://maven.apache.org + + + UTF-8 + + + + + log4j + log4j + 1.2.17 + test + + + org.mongodb + mongo-java-driver + 3.4.2 + provided + + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + + attach-sources + + jar + + + + + + + \ No newline at end of file diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBMethodInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBMethodInterceptor.java new file mode 100644 index 000000000..2fb5ae5b0 --- /dev/null +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBMethodInterceptor.java @@ -0,0 +1,139 @@ +package com.a.eye.skywalking.plugin.mongodb; + +import java.util.List; + +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.trace.Span; +import com.a.eye.skywalking.trace.tag.Tags; +import com.mongodb.bulk.DeleteRequest; +import com.mongodb.bulk.InsertRequest; +import com.mongodb.bulk.UpdateRequest; +import com.mongodb.bulk.WriteRequest; +import com.mongodb.operation.CountOperation; +import com.mongodb.operation.CreateCollectionOperation; +import com.mongodb.operation.CreateIndexesOperation; +import com.mongodb.operation.CreateViewOperation; +import com.mongodb.operation.DeleteOperation; +import com.mongodb.operation.DistinctOperation; +import com.mongodb.operation.FindAndDeleteOperation; +import com.mongodb.operation.FindAndReplaceOperation; +import com.mongodb.operation.FindAndUpdateOperation; +import com.mongodb.operation.FindOperation; +import com.mongodb.operation.GroupOperation; +import com.mongodb.operation.InsertOperation; +import com.mongodb.operation.ListCollectionsOperation; +import com.mongodb.operation.MapReduceToCollectionOperation; +import com.mongodb.operation.MapReduceWithInlineResultsOperation; +import com.mongodb.operation.MixedBulkWriteOperation; +import com.mongodb.operation.UpdateOperation; + +/** + * {@link MongoDBMethodInterceptor} intercept method of {@link com.mongodb.Mongo#execute(ReadOperation, ReadPreference)} + * or {@link com.mongodb.Mongo#execute(WriteOperation)}. record the mongoDB host, operation name and the key of the operation. + * + * @author baiyang + */ +public class MongoDBMethodInterceptor implements InstanceMethodsAroundInterceptor { + + /** + * The key name that MongoDB host in {@link EnhancedClassInstanceContext#context}. + */ + protected static final String MONGODB_HOST = "MONGODB_HOST"; + + /** + * The key name that MongoDB port in {@link EnhancedClassInstanceContext#context}. + */ + protected static final String MONGODB_PORT = "MONGODB_PORT"; + + private static final String MONGODB_COMPONENT = "MongoDB"; + + @Override + public void beforeMethod(final EnhancedClassInstanceContext context, + final InstanceMethodInvokeContext interceptorContext, final MethodInterceptResult result) { + Object[] arguments = interceptorContext.allArguments(); + OperationInfo operationInfo = this.getReadOperationInfo(arguments[0]); + Span span = ContextManager.createSpan("MongoDB/" + operationInfo.getMethodName()); + Tags.COMPONENT.set(span, MONGODB_COMPONENT); + Tags.DB_TYPE.set(span, MONGODB_COMPONENT); + Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); + Tags.SPAN_LAYER.asDB(span); + Tags.DB_STATEMENT.set(span, operationInfo.getMethodName() + " " + operationInfo.getFilter()); + } + + @Override + public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, + Object ret) { + Span span = ContextManager.activeSpan(); + Tags.PEER_HOST.set(span, context.get(MONGODB_HOST, String.class)); + Tags.PEER_PORT.set(span, (Integer) context.get(MONGODB_PORT)); + ContextManager.stopSpan(); + return ret; + } + + @Override + public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, + InstanceMethodInvokeContext interceptorContext) { + ContextManager.activeSpan().log(t); + } + + /** + * Convert ReadOperation interface or WriteOperation interface to the implementation class. + * Get the method name and filter info. + */ + @SuppressWarnings("rawtypes") + private OperationInfo getReadOperationInfo(Object obj) { + if (obj instanceof CountOperation) { + return new OperationInfo(ReadMethod.COUNT.getName(), ((CountOperation) obj).getFilter().toString()); + } else if (obj instanceof DistinctOperation) { + return new OperationInfo(ReadMethod.DISTINCT.getName(), ((DistinctOperation) obj).getFilter().toString()); + } else if (obj instanceof FindOperation) { + return new OperationInfo(ReadMethod.FIND.getName(), ((FindOperation) obj).getFilter().toString()); + } else if (obj instanceof GroupOperation) { + return new OperationInfo(ReadMethod.GROUP.getName(), ((GroupOperation) obj).getFilter().toString()); + } else if (obj instanceof ListCollectionsOperation) { + return new OperationInfo(ReadMethod.LIST_COLLECTIONS.getName(), ((ListCollectionsOperation) obj).getFilter().toString()); + } else if (obj instanceof MapReduceWithInlineResultsOperation) { + return new OperationInfo(ReadMethod.MAPREDUCE_WITHINLINE_RESULTS.getName(), ((ListCollectionsOperation) obj).getFilter().toString()); + } else if (obj instanceof DeleteOperation) { + return new OperationInfo(WriteMethod.DELETE.getName(), ((DeleteOperation) obj).getDeleteRequests().toString()); + } else if (obj instanceof InsertOperation) { + return new OperationInfo(WriteMethod.INSERT.getName(), ((InsertOperation) obj).getInsertRequests().toString()); + } else if (obj instanceof UpdateOperation) { + return new OperationInfo(WriteMethod.UPDATE.getName(), ((UpdateOperation) obj).getUpdateRequests().toString()); + } else if (obj instanceof CreateCollectionOperation) { + return new OperationInfo(WriteMethod.CREATECOLLECTION.getName(), ((CreateCollectionOperation) obj).getCollectionName()); + } else if (obj instanceof CreateIndexesOperation) { + return new OperationInfo(WriteMethod.CREATEINDEXES.getName(), ((CreateIndexesOperation) obj).getIndexNames().toString()); + } else if (obj instanceof CreateViewOperation) { + return new OperationInfo(WriteMethod.CREATEVIEW.getName(), ((CreateViewOperation) obj).getViewName()); + } else if (obj instanceof FindAndDeleteOperation) { + return new OperationInfo(WriteMethod.FINDANDDELETE.getName(), ((FindAndDeleteOperation) obj).getFilter().toString()); + } else if (obj instanceof FindAndReplaceOperation) { + return new OperationInfo(WriteMethod.FINDANDREPLACE.getName(), ((FindAndReplaceOperation) obj).getFilter().toString()); + } else if (obj instanceof FindAndUpdateOperation) { + return new OperationInfo(WriteMethod.FINDANDUPDATE.getName(), ((FindAndUpdateOperation) obj).getFilter().toString()); + } else if (obj instanceof MapReduceToCollectionOperation) { + return new OperationInfo(WriteMethod.MAPREDUCETOCOLLECTION.getName(), ((MapReduceToCollectionOperation) obj).getFilter().toString()); + } else if (obj instanceof MixedBulkWriteOperation) { + List list = ((MixedBulkWriteOperation) obj).getWriteRequests(); + StringBuilder sb = new StringBuilder(); + for (WriteRequest request : list) { + if (request instanceof InsertRequest) { + sb.append(((InsertRequest) request).getDocument().toString()).append(","); + } else if (request instanceof DeleteRequest) { + sb.append(((DeleteRequest) request).getFilter()).append(","); + } else if (request instanceof UpdateRequest) { + sb.append(((UpdateRequest) request).getFilter()).append(","); + } + } + return new OperationInfo(WriteMethod.MIXEDBULKWRITE.getName(), sb.toString()); + } else { + return new OperationInfo(WriteMethod.UNKNOW.getName()); + } + } + +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBReadBindingInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBReadBindingInterceptor.java new file mode 100644 index 000000000..7a0c5ec7c --- /dev/null +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBReadBindingInterceptor.java @@ -0,0 +1,46 @@ +package com.a.eye.skywalking.plugin.mongodb; + +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.mongodb.ServerAddress; +import com.mongodb.binding.ReadBinding; + +/** + * {@link MongoDBReadBindingInterceptor} record the host and port information from {@link EnhancedClassInstanceContext#context}, + * + * @author baiyang + */ +public class MongoDBReadBindingInterceptor implements InstanceMethodsAroundInterceptor { + + @Override + public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, + MethodInterceptResult result) { + + } + + /** + * Execute after {@link com.mongodb.Mongo#getReadBinding(ReadPreference)}, + * record the host and port information + */ + @Override + public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, + Object ret) { + ReadBinding readBinding = (ReadBinding) ret; + ServerAddress serverAddress = readBinding.getReadConnectionSource().getServerDescription().getAddress(); + String host = serverAddress.getHost(); + Integer port = serverAddress.getPort(); + context.set(MongoDBMethodInterceptor.MONGODB_HOST, host); + context.set(MongoDBMethodInterceptor.MONGODB_PORT, port); + return ret; + } + + @Override + public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, + InstanceMethodInvokeContext interceptorContext) { + ContextManager.activeSpan().log(t); + } + +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBWriteBindingInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBWriteBindingInterceptor.java new file mode 100644 index 000000000..0e3146b46 --- /dev/null +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBWriteBindingInterceptor.java @@ -0,0 +1,46 @@ +package com.a.eye.skywalking.plugin.mongodb; + +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.mongodb.ServerAddress; +import com.mongodb.binding.WriteBinding; + +/** + * {@link MongoDBWriteBindingInterceptor} record the host and port information from {@link EnhancedClassInstanceContext#context}, + * + * @author baiyang + */ +public class MongoDBWriteBindingInterceptor implements InstanceMethodsAroundInterceptor { + + @Override + public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, + MethodInterceptResult result) { + + } + + /** + * Execute after {@link com.mongodb.Mongo#getWriteBinding()}, + * record the host and port information + */ + @Override + public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, + Object ret) { + WriteBinding writeBinding = (WriteBinding) ret; + ServerAddress serverAddress = writeBinding.getWriteConnectionSource().getServerDescription().getAddress(); + String host = serverAddress.getHost(); + Integer port = serverAddress.getPort(); + context.set(MongoDBMethodInterceptor.MONGODB_HOST, host); + context.set(MongoDBMethodInterceptor.MONGODB_PORT, port); + return ret; + } + + @Override + public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, + InstanceMethodInvokeContext interceptorContext) { + ContextManager.activeSpan().log(t); + } + +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/OperationInfo.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/OperationInfo.java new file mode 100644 index 000000000..01e91d468 --- /dev/null +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/OperationInfo.java @@ -0,0 +1,51 @@ +package com.a.eye.skywalking.plugin.mongodb; + +/** + * {@link OperationInfo} record the methodName and filter information + * + * @author baiyang + */ +public class OperationInfo { + + private String methodName; + + private String filter; + + public OperationInfo() { + + } + + public OperationInfo(String methodName) { + super(); + this.methodName = methodName; + this.filter = ""; + } + + public OperationInfo(String methodName, String filter) { + super(); + this.methodName = methodName; + this.filter = filter; + } + + public String getMethodName() { + return methodName; + } + + public void setMethodName(String methodName) { + this.methodName = methodName; + } + + public String getFilter() { + return filter; + } + + public void setFilter(String filter) { + this.filter = filter; + } + + @Override + public String toString() { + return "{methodName=" + methodName + ", filter=" + filter + "}"; + } + +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/ReadMethod.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/ReadMethod.java new file mode 100644 index 000000000..0797cfb24 --- /dev/null +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/ReadMethod.java @@ -0,0 +1,22 @@ +package com.a.eye.skywalking.plugin.mongodb; + +/** + * {@link ReadMethod} mongoDB read method enum + * + * @author baiyang + */ +public enum ReadMethod { + COUNT("count"), DISTINCT("distinct"), FIND("find"), GROUP("group"), LIST_COLLECTIONS("listCollections"), + MAPREDUCE_WITHINLINE_RESULTS("mapReduceWithInlineResults"); + + private String name; + + private ReadMethod(String name) { + this.name = name; + } + + public String getName() { + return name; + } + +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/WriteMethod.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/WriteMethod.java new file mode 100644 index 000000000..81bcf5a8c --- /dev/null +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/WriteMethod.java @@ -0,0 +1,23 @@ +package com.a.eye.skywalking.plugin.mongodb; + +/** + * {@link WriteMethod} mongoDB write method enum + * + * @author baiyang + */ +public enum WriteMethod { + DELETE("delete"), INSERT("insert"), UPDATE("update"), CREATECOLLECTION("createCollection"), CREATEINDEXES( + "createIndexess"), CREATEVIEW("createView"), FINDANDDELETE("findAndDelete"), FINDANDREPLACE( + "findAndReplace"), FINDANDUPDATE("findAndUpdate"), MAPREDUCETOCOLLECTION("mapReduceToCollection"), + MIXEDBULKWRITE("mixedBulkWrite"), UNKNOW("unknow"); + + private String name; + + private WriteMethod(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/define/MongoDBInstrumentation.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/define/MongoDBInstrumentation.java new file mode 100644 index 000000000..262072259 --- /dev/null +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/define/MongoDBInstrumentation.java @@ -0,0 +1,72 @@ +package com.a.eye.skywalking.plugin.mongodb.define; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; + +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; + +/** + * {@link MongoDBInstrumentation} presents that skywalking intercepts {@link com.mongodb.Mongo#execute(ReadOperation, ReadPreference)},{@link com.mongodb.Mongo#execute(WriteOperation)} + * by using {@link MongoDBMethodInterceptor}. + * + * @author baiyang + */ +public class MongoDBInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + private static final String ENHANCE_CLASS = "com.mongodb.Mongo"; + + private static final String MONGDB_READ_BINDING_CLASS = "com.a.eye.skywalking.plugin.mongodb.MongoDBReadBindingInterceptor"; + + private static final String MONGDB_WRITE_BINDING_CLASS = "com.a.eye.skywalking.plugin.mongodb.MongoDBWriteBindingInterceptor"; + + private static final String MONGDB_METHOD_INTERCET_CLASS = "com.a.eye.skywalking.plugin.mongodb.MongoDBMethodInterceptor"; + + @Override + protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return null; + } + + @Override + protected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[] { new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named("execute"); + } + + @Override + public String getMethodsInterceptor() { + return MONGDB_METHOD_INTERCET_CLASS; + } + }, new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named("getReadBinding"); + } + + @Override + public String getMethodsInterceptor() { + return MONGDB_READ_BINDING_CLASS; + } + }, new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named("getWriteBinding"); + } + + @Override + public String getMethodsInterceptor() { + return MONGDB_WRITE_BINDING_CLASS; + } + } }; + } + + @Override + protected String enhanceClassName() { + return ENHANCE_CLASS; + } + +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/resources/skywalking-plugin.def b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/resources/skywalking-plugin.def new file mode 100644 index 000000000..e2fb179df --- /dev/null +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/resources/skywalking-plugin.def @@ -0,0 +1 @@ +com.a.eye.skywalking.plugin.mongodb.define.MongoDBInstrumentation \ No newline at end of file diff --git a/skywalking-sniffer/skywalking-sdk-plugin/pom.xml b/skywalking-sniffer/skywalking-sdk-plugin/pom.xml index e6c83e9bc..42e8e3ba9 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/pom.xml +++ b/skywalking-sniffer/skywalking-sdk-plugin/pom.xml @@ -17,6 +17,7 @@ jedis-2.x-plugin tomcat-7.x-8.x-plugin motan-plugin + mongodb-plugin pom From e8084e548d05446ce1a520ca0d1423f05f54f10e Mon Sep 17 00:00:00 2001 From: baiyang Date: Wed, 19 Apr 2017 17:06:05 +0800 Subject: [PATCH 2/9] fix bugs --- skywalking-sniffer/skywalking-agent/pom.xml | 2 +- .../pom.xml | 17 +-- .../mongodb/v3}/MongoDBMethodInterceptor.java | 101 +++++++++----- .../v3}/MongoDBReadBindingInterceptor.java | 6 +- .../v3}/MongoDBWriteBindingInterceptor.java | 7 +- .../plugin/mongodb/v3}/OperationInfo.java | 2 +- .../plugin/mongodb/v3}/ReadMethod.java | 2 +- .../plugin/mongodb/v3}/WriteMethod.java | 2 +- .../v3}/define/MongoDBInstrumentation.java | 8 +- .../src/main/resources/skywalking-plugin.def | 1 + .../v3/MongoDBMethodInterceptorTest.java | 125 ++++++++++++++++++ .../v3/MongoDBReadBindingInterceptorTest.java | 61 +++++++++ .../MongoDBWriteBindingInterceptorTest.java | 61 +++++++++ .../src/main/resources/skywalking-plugin.def | 1 - .../skywalking-sdk-plugin/pom.xml | 2 +- 15 files changed, 337 insertions(+), 61 deletions(-) rename skywalking-sniffer/skywalking-sdk-plugin/{mongodb-plugin => mongodb-3.x-plugin}/pom.xml (72%) rename skywalking-sniffer/skywalking-sdk-plugin/{mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb => mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3}/MongoDBMethodInterceptor.java (62%) rename skywalking-sniffer/skywalking-sdk-plugin/{mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb => mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3}/MongoDBReadBindingInterceptor.java (91%) rename skywalking-sniffer/skywalking-sdk-plugin/{mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb => mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3}/MongoDBWriteBindingInterceptor.java (92%) rename skywalking-sniffer/skywalking-sdk-plugin/{mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb => mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3}/OperationInfo.java (95%) rename skywalking-sniffer/skywalking-sdk-plugin/{mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb => mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3}/ReadMethod.java (90%) rename skywalking-sniffer/skywalking-sdk-plugin/{mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb => mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3}/WriteMethod.java (93%) rename skywalking-sniffer/skywalking-sdk-plugin/{mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb => mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3}/define/MongoDBInstrumentation.java (90%) create mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/resources/skywalking-plugin.def create mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java create mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptorTest.java create mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteBindingInterceptorTest.java delete mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/resources/skywalking-plugin.def diff --git a/skywalking-sniffer/skywalking-agent/pom.xml b/skywalking-sniffer/skywalking-agent/pom.xml index 0d1ebff04..e12f0fc93 100644 --- a/skywalking-sniffer/skywalking-agent/pom.xml +++ b/skywalking-sniffer/skywalking-agent/pom.xml @@ -57,7 +57,7 @@ com.a.eye - skywalking-mongodb-plugin + skywalking-mongodb-3.x-plugin ${project.version} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/pom.xml b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/pom.xml similarity index 72% rename from skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/pom.xml rename to skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/pom.xml index ba40b3142..65018d7fd 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/pom.xml +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/pom.xml @@ -1,28 +1,23 @@ - - 4.0.0 + + 4.0.0 skywalking-sdk-plugin com.a.eye 3.0.1-2017 - skywalking-mongodb-plugin + skywalking-mongodb-3.x-plugin jar mongodb-plugin http://maven.apache.org - + UTF-8 - - log4j - log4j - 1.2.17 - test - org.mongodb mongo-java-driver @@ -30,7 +25,7 @@ provided - + diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBMethodInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptor.java similarity index 62% rename from skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBMethodInterceptor.java rename to skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptor.java index 2fb5ae5b0..9d7f8cdf3 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBMethodInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptor.java @@ -1,7 +1,9 @@ -package com.a.eye.skywalking.plugin.mongodb; +package com.a.eye.skywalking.plugin.mongodb.v3; import java.util.List; +import org.bson.BsonDocument; + 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; @@ -9,6 +11,7 @@ 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.trace.Span; import com.a.eye.skywalking.trace.tag.Tags; +import com.mongodb.ReadPreference; import com.mongodb.bulk.DeleteRequest; import com.mongodb.bulk.InsertRequest; import com.mongodb.bulk.UpdateRequest; @@ -29,11 +32,14 @@ import com.mongodb.operation.ListCollectionsOperation; import com.mongodb.operation.MapReduceToCollectionOperation; import com.mongodb.operation.MapReduceWithInlineResultsOperation; import com.mongodb.operation.MixedBulkWriteOperation; +import com.mongodb.operation.ReadOperation; import com.mongodb.operation.UpdateOperation; +import com.mongodb.operation.WriteOperation; /** * {@link MongoDBMethodInterceptor} intercept method of {@link com.mongodb.Mongo#execute(ReadOperation, ReadPreference)} - * or {@link com.mongodb.Mongo#execute(WriteOperation)}. record the mongoDB host, operation name and the key of the operation. + * or {@link com.mongodb.Mongo#execute(WriteOperation)}. record the mongoDB host, operation name and the key of the + * operation. * * @author baiyang */ @@ -42,21 +48,25 @@ public class MongoDBMethodInterceptor implements InstanceMethodsAroundIntercepto /** * The key name that MongoDB host in {@link EnhancedClassInstanceContext#context}. */ - protected static final String MONGODB_HOST = "MONGODB_HOST"; + static final String MONGODB_HOST = "MONGODB_HOST"; /** * The key name that MongoDB port in {@link EnhancedClassInstanceContext#context}. */ - protected static final String MONGODB_PORT = "MONGODB_PORT"; + static final String MONGODB_PORT = "MONGODB_PORT"; private static final String MONGODB_COMPONENT = "MongoDB"; - + + private static final String METHOD = "MongoDB/"; + + private static final int FILTER_LENGTH_LIMIT = 256; + @Override public void beforeMethod(final EnhancedClassInstanceContext context, final InstanceMethodInvokeContext interceptorContext, final MethodInterceptResult result) { Object[] arguments = interceptorContext.allArguments(); OperationInfo operationInfo = this.getReadOperationInfo(arguments[0]); - Span span = ContextManager.createSpan("MongoDB/" + operationInfo.getMethodName()); + Span span = ContextManager.createSpan(METHOD + operationInfo.getMethodName()); Tags.COMPONENT.set(span, MONGODB_COMPONENT); Tags.DB_TYPE.set(span, MONGODB_COMPONENT); Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); @@ -81,58 +91,87 @@ public class MongoDBMethodInterceptor implements InstanceMethodsAroundIntercepto } /** - * Convert ReadOperation interface or WriteOperation interface to the implementation class. - * Get the method name and filter info. + * Convert ReadOperation interface or WriteOperation interface to the implementation class. Get the method name and + * filter info. */ @SuppressWarnings("rawtypes") private OperationInfo getReadOperationInfo(Object obj) { if (obj instanceof CountOperation) { - return new OperationInfo(ReadMethod.COUNT.getName(), ((CountOperation) obj).getFilter().toString()); + BsonDocument filter = ((CountOperation) obj).getFilter(); + return new OperationInfo(ReadMethod.COUNT.getName(), limitFilter(filter.toString())); } else if (obj instanceof DistinctOperation) { - return new OperationInfo(ReadMethod.DISTINCT.getName(), ((DistinctOperation) obj).getFilter().toString()); + BsonDocument filter = ((DistinctOperation) obj).getFilter(); + return new OperationInfo(ReadMethod.DISTINCT.getName(), limitFilter(filter.toString())); } else if (obj instanceof FindOperation) { - return new OperationInfo(ReadMethod.FIND.getName(), ((FindOperation) obj).getFilter().toString()); + BsonDocument filter = ((FindOperation) obj).getFilter(); + return new OperationInfo(ReadMethod.FIND.getName(), limitFilter(filter.toString())); } else if (obj instanceof GroupOperation) { - return new OperationInfo(ReadMethod.GROUP.getName(), ((GroupOperation) obj).getFilter().toString()); + BsonDocument filter = ((GroupOperation) obj).getFilter(); + return new OperationInfo(ReadMethod.GROUP.getName(), limitFilter(filter.toString())); } else if (obj instanceof ListCollectionsOperation) { - return new OperationInfo(ReadMethod.LIST_COLLECTIONS.getName(), ((ListCollectionsOperation) obj).getFilter().toString()); + BsonDocument filter = ((ListCollectionsOperation) obj).getFilter(); + return new OperationInfo(ReadMethod.LIST_COLLECTIONS.getName(), limitFilter(filter.toString())); } else if (obj instanceof MapReduceWithInlineResultsOperation) { - return new OperationInfo(ReadMethod.MAPREDUCE_WITHINLINE_RESULTS.getName(), ((ListCollectionsOperation) obj).getFilter().toString()); - } else if (obj instanceof DeleteOperation) { - return new OperationInfo(WriteMethod.DELETE.getName(), ((DeleteOperation) obj).getDeleteRequests().toString()); + BsonDocument filter = ((ListCollectionsOperation) obj).getFilter(); + return new OperationInfo(ReadMethod.MAPREDUCE_WITHINLINE_RESULTS.getName(), limitFilter(filter.toString())); + } else if (obj instanceof DeleteOperation) { + List filter = ((DeleteOperation) obj).getDeleteRequests(); + return new OperationInfo(WriteMethod.DELETE.getName(), limitFilter(filter.toString())); } else if (obj instanceof InsertOperation) { - return new OperationInfo(WriteMethod.INSERT.getName(), ((InsertOperation) obj).getInsertRequests().toString()); + List filter = ((InsertOperation) obj).getInsertRequests(); + return new OperationInfo(WriteMethod.INSERT.getName(), limitFilter(filter.toString())); } else if (obj instanceof UpdateOperation) { - return new OperationInfo(WriteMethod.UPDATE.getName(), ((UpdateOperation) obj).getUpdateRequests().toString()); + List filter = ((UpdateOperation) obj).getUpdateRequests(); + return new OperationInfo(WriteMethod.UPDATE.getName(), limitFilter(filter.toString())); } else if (obj instanceof CreateCollectionOperation) { - return new OperationInfo(WriteMethod.CREATECOLLECTION.getName(), ((CreateCollectionOperation) obj).getCollectionName()); + String filter = ((CreateCollectionOperation) obj).getCollectionName(); + return new OperationInfo(WriteMethod.CREATECOLLECTION.getName(), limitFilter(filter)); } else if (obj instanceof CreateIndexesOperation) { - return new OperationInfo(WriteMethod.CREATEINDEXES.getName(), ((CreateIndexesOperation) obj).getIndexNames().toString()); + List filter = ((CreateIndexesOperation) obj).getIndexNames(); + return new OperationInfo(WriteMethod.CREATEINDEXES.getName(), limitFilter(filter.toString())); } else if (obj instanceof CreateViewOperation) { - return new OperationInfo(WriteMethod.CREATEVIEW.getName(), ((CreateViewOperation) obj).getViewName()); + String filter = ((CreateViewOperation) obj).getViewName(); + return new OperationInfo(WriteMethod.CREATEVIEW.getName(), limitFilter(filter)); } else if (obj instanceof FindAndDeleteOperation) { - return new OperationInfo(WriteMethod.FINDANDDELETE.getName(), ((FindAndDeleteOperation) obj).getFilter().toString()); + BsonDocument filter = ((FindAndDeleteOperation) obj).getFilter(); + return new OperationInfo(WriteMethod.FINDANDDELETE.getName(), limitFilter(filter.toString())); } else if (obj instanceof FindAndReplaceOperation) { - return new OperationInfo(WriteMethod.FINDANDREPLACE.getName(), ((FindAndReplaceOperation) obj).getFilter().toString()); + BsonDocument filter = ((FindAndReplaceOperation) obj).getFilter(); + return new OperationInfo(WriteMethod.FINDANDREPLACE.getName(), limitFilter(filter.toString())); } else if (obj instanceof FindAndUpdateOperation) { - return new OperationInfo(WriteMethod.FINDANDUPDATE.getName(), ((FindAndUpdateOperation) obj).getFilter().toString()); + BsonDocument filter = ((FindAndUpdateOperation) obj).getFilter(); + return new OperationInfo(WriteMethod.FINDANDUPDATE.getName(), limitFilter(filter.toString())); } else if (obj instanceof MapReduceToCollectionOperation) { - return new OperationInfo(WriteMethod.MAPREDUCETOCOLLECTION.getName(), ((MapReduceToCollectionOperation) obj).getFilter().toString()); + BsonDocument filter = ((MapReduceToCollectionOperation) obj).getFilter(); + return new OperationInfo(WriteMethod.MAPREDUCETOCOLLECTION.getName(), limitFilter(filter.toString())); } else if (obj instanceof MixedBulkWriteOperation) { List list = ((MixedBulkWriteOperation) obj).getWriteRequests(); - StringBuilder sb = new StringBuilder(); + StringBuilder params = new StringBuilder(); for (WriteRequest request : list) { if (request instanceof InsertRequest) { - sb.append(((InsertRequest) request).getDocument().toString()).append(","); + params.append(((InsertRequest) request).getDocument().toString()).append(","); } else if (request instanceof DeleteRequest) { - sb.append(((DeleteRequest) request).getFilter()).append(","); + params.append(((DeleteRequest) request).getFilter()).append(","); } else if (request instanceof UpdateRequest) { - sb.append(((UpdateRequest) request).getFilter()).append(","); + params.append(((UpdateRequest) request).getFilter()).append(","); + } + if (params.length() > FILTER_LENGTH_LIMIT) { + params.append("..."); + break; } } - return new OperationInfo(WriteMethod.MIXEDBULKWRITE.getName(), sb.toString()); + return new OperationInfo(WriteMethod.MIXEDBULKWRITE.getName(), params.toString()); } else { - return new OperationInfo(WriteMethod.UNKNOW.getName()); + return new OperationInfo(obj.getClass().getSimpleName()); + } + } + + private String limitFilter(String filter) { + final StringBuilder params = new StringBuilder(); + if (filter.length() > FILTER_LENGTH_LIMIT) { + return params.append(filter.substring(0, FILTER_LENGTH_LIMIT)).append("...").toString(); + } else { + return filter; } } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBReadBindingInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptor.java similarity index 91% rename from skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBReadBindingInterceptor.java rename to skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptor.java index 7a0c5ec7c..6805b9ecf 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBReadBindingInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptor.java @@ -1,10 +1,10 @@ -package com.a.eye.skywalking.plugin.mongodb; +package com.a.eye.skywalking.plugin.mongodb.v3; -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.mongodb.ReadPreference; import com.mongodb.ServerAddress; import com.mongodb.binding.ReadBinding; @@ -18,7 +18,6 @@ public class MongoDBReadBindingInterceptor implements InstanceMethodsAroundInter @Override public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result) { - } /** @@ -40,7 +39,6 @@ public class MongoDBReadBindingInterceptor implements InstanceMethodsAroundInter @Override public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { - ContextManager.activeSpan().log(t); } } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBWriteBindingInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteBindingInterceptor.java similarity index 92% rename from skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBWriteBindingInterceptor.java rename to skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteBindingInterceptor.java index 0e3146b46..0d90125e8 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/MongoDBWriteBindingInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteBindingInterceptor.java @@ -1,6 +1,5 @@ -package com.a.eye.skywalking.plugin.mongodb; +package com.a.eye.skywalking.plugin.mongodb.v3; -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; @@ -9,7 +8,7 @@ import com.mongodb.ServerAddress; import com.mongodb.binding.WriteBinding; /** - * {@link MongoDBWriteBindingInterceptor} record the host and port information from {@link EnhancedClassInstanceContext#context}, + * {@link MongoDBWriteBindingInterceptor} record the host and port information from {@link EnhancedClassInstanceContext#context} * * @author baiyang */ @@ -18,7 +17,6 @@ public class MongoDBWriteBindingInterceptor implements InstanceMethodsAroundInte @Override public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result) { - } /** @@ -40,7 +38,6 @@ public class MongoDBWriteBindingInterceptor implements InstanceMethodsAroundInte @Override public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { - ContextManager.activeSpan().log(t); } } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/OperationInfo.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/OperationInfo.java similarity index 95% rename from skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/OperationInfo.java rename to skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/OperationInfo.java index 01e91d468..4846a8646 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/OperationInfo.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/OperationInfo.java @@ -1,4 +1,4 @@ -package com.a.eye.skywalking.plugin.mongodb; +package com.a.eye.skywalking.plugin.mongodb.v3; /** * {@link OperationInfo} record the methodName and filter information diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/ReadMethod.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/ReadMethod.java similarity index 90% rename from skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/ReadMethod.java rename to skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/ReadMethod.java index 0797cfb24..61b329ef2 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/ReadMethod.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/ReadMethod.java @@ -1,4 +1,4 @@ -package com.a.eye.skywalking.plugin.mongodb; +package com.a.eye.skywalking.plugin.mongodb.v3; /** * {@link ReadMethod} mongoDB read method enum diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/WriteMethod.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/WriteMethod.java similarity index 93% rename from skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/WriteMethod.java rename to skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/WriteMethod.java index 81bcf5a8c..656419226 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/WriteMethod.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/WriteMethod.java @@ -1,4 +1,4 @@ -package com.a.eye.skywalking.plugin.mongodb; +package com.a.eye.skywalking.plugin.mongodb.v3; /** * {@link WriteMethod} mongoDB write method enum diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/define/MongoDBInstrumentation.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/define/MongoDBInstrumentation.java similarity index 90% rename from skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/define/MongoDBInstrumentation.java rename to skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/define/MongoDBInstrumentation.java index 262072259..bbf717396 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/define/MongoDBInstrumentation.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/define/MongoDBInstrumentation.java @@ -1,4 +1,4 @@ -package com.a.eye.skywalking.plugin.mongodb.define; +package com.a.eye.skywalking.plugin.mongodb.v3.define; import static net.bytebuddy.matcher.ElementMatchers.named; import net.bytebuddy.description.method.MethodDescription; @@ -18,11 +18,11 @@ public class MongoDBInstrumentation extends ClassInstanceMethodsEnhancePluginDef private static final String ENHANCE_CLASS = "com.mongodb.Mongo"; - private static final String MONGDB_READ_BINDING_CLASS = "com.a.eye.skywalking.plugin.mongodb.MongoDBReadBindingInterceptor"; + private static final String MONGDB_READ_BINDING_CLASS = "com.a.eye.skywalking.plugin.mongodb.v3.MongoDBReadBindingInterceptor"; - private static final String MONGDB_WRITE_BINDING_CLASS = "com.a.eye.skywalking.plugin.mongodb.MongoDBWriteBindingInterceptor"; + private static final String MONGDB_WRITE_BINDING_CLASS = "com.a.eye.skywalking.plugin.mongodb.v3.MongoDBWriteBindingInterceptor"; - private static final String MONGDB_METHOD_INTERCET_CLASS = "com.a.eye.skywalking.plugin.mongodb.MongoDBMethodInterceptor"; + private static final String MONGDB_METHOD_INTERCET_CLASS = "com.a.eye.skywalking.plugin.mongodb.v3.MongoDBMethodInterceptor"; @Override protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() { diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/resources/skywalking-plugin.def b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/resources/skywalking-plugin.def new file mode 100644 index 000000000..8473327cb --- /dev/null +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/resources/skywalking-plugin.def @@ -0,0 +1 @@ +com.a.eye.skywalking.plugin.mongodb.v3.define.MongoDBInstrumentation \ No newline at end of file diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java new file mode 100644 index 000000000..5133c8ec1 --- /dev/null +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java @@ -0,0 +1,125 @@ +package com.a.eye.skywalking.plugin.mongodb.v3; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.when; + +import org.bson.BsonDocument; +import org.bson.BsonString; +import org.hamcrest.CoreMatchers; +import org.hamcrest.MatcherAssert; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import com.a.eye.skywalking.api.boot.ServiceManager; +import com.a.eye.skywalking.api.context.TracerContext; +import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; +import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext; +import com.a.eye.skywalking.sniffer.mock.context.MockTracerContextListener; +import com.a.eye.skywalking.sniffer.mock.context.SegmentAssert; +import com.a.eye.skywalking.trace.LogData; +import com.a.eye.skywalking.trace.Span; +import com.a.eye.skywalking.trace.TraceSegment; +import com.a.eye.skywalking.trace.tag.Tags; +import com.mongodb.operation.FindOperation; + +@RunWith(MockitoJUnitRunner.class) +public class MongoDBMethodInterceptorTest { + + private MongoDBMethodInterceptor interceptor; + private MockTracerContextListener mockTracerContextListener; + + @Mock + private EnhancedClassInstanceContext classInstanceContext; + @Mock + private InstanceMethodInvokeContext methodInvokeContext; + @SuppressWarnings("rawtypes") + @Mock + private FindOperation findOperation; + + @Before + public void setUp() throws Exception { + ServiceManager.INSTANCE.boot(); + + interceptor = new MongoDBMethodInterceptor(); + mockTracerContextListener = new MockTracerContextListener(); + + TracerContext.ListenerManager.add(mockTracerContextListener); + + when(classInstanceContext.get(MongoDBMethodInterceptor.MONGODB_HOST, String.class)).thenReturn("127.0.0.1"); + when(classInstanceContext.get(MongoDBMethodInterceptor.MONGODB_PORT)).thenReturn(27017); + when(methodInvokeContext.methodName()).thenReturn("find"); + + BsonDocument document = new BsonDocument(); + document.append("name", new BsonString("by")); + + when(findOperation.getFilter()).thenReturn(document); + + when(methodInvokeContext.allArguments()).thenReturn(new Object[] { findOperation }); + } + + @Test + public void testIntercept() { + interceptor.beforeMethod(classInstanceContext, methodInvokeContext, null); + interceptor.afterMethod(classInstanceContext, methodInvokeContext, null); + + mockTracerContextListener.assertSize(1); + mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { + @Override + public void call(TraceSegment traceSegment) { + assertThat(traceSegment.getSpans().size(), is(1)); + Span span = traceSegment.getSpans().get(0); + assertRedisSpan(span); + } + }); + } + + @Test + public void testInterceptWithException() { + interceptor.beforeMethod(classInstanceContext, methodInvokeContext, null); + interceptor.handleMethodException(new RuntimeException(), classInstanceContext, methodInvokeContext); + interceptor.afterMethod(classInstanceContext, methodInvokeContext, null); + + mockTracerContextListener.assertSize(1); + mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { + @Override + public void call(TraceSegment traceSegment) { + assertThat(traceSegment.getSpans().size(), is(1)); + Span span = traceSegment.getSpans().get(0); + assertRedisSpan(span); + assertThat(span.getLogs().size(), is(1)); + assertLogData(span.getLogs().get(0)); + } + }); + } + + private void assertLogData(LogData logData) { + MatcherAssert.assertThat(logData.getFields().size(), is(4)); + MatcherAssert.assertThat(logData.getFields().get("event"), CoreMatchers. is("error")); + assertEquals(logData.getFields().get("error.kind"), RuntimeException.class.getName()); + assertNull(logData.getFields().get("message")); + } + + private void assertRedisSpan(Span span) { + assertThat(span.getOperationName(), is("MongoDB/find")); + assertThat(Tags.PEER_HOST.get(span), is("127.0.0.1")); + assertThat(Tags.PEER_PORT.get(span), is(27017)); + assertThat(Tags.COMPONENT.get(span), is("MongoDB")); + assertThat(Tags.DB_STATEMENT.get(span), is("find { \"name\" : \"by\" }")); + assertThat(Tags.DB_TYPE.get(span), is("MongoDB")); + assertTrue(Tags.SPAN_LAYER.isDB(span)); + } + + @After + public void tearDown() throws Exception { + TracerContext.ListenerManager.remove(mockTracerContextListener); + } + +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptorTest.java new file mode 100644 index 000000000..a2f1b24bc --- /dev/null +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptorTest.java @@ -0,0 +1,61 @@ +package com.a.eye.skywalking.plugin.mongodb.v3; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.modules.junit4.PowerMockRunner; + +import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; +import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext; +import com.mongodb.ServerAddress; +import com.mongodb.binding.ConnectionSource; +import com.mongodb.binding.ReadBinding; +import com.mongodb.connection.ServerConnectionState; +import com.mongodb.connection.ServerDescription; + +@RunWith(PowerMockRunner.class) +public class MongoDBReadBindingInterceptorTest { + + private MongoDBReadBindingInterceptor interceptor; + + @Mock + private EnhancedClassInstanceContext instanceContext; + + @Mock + private InstanceMethodInvokeContext interceptorContext; + + @Mock + private ReadBinding readBinding; + + @Mock + private ConnectionSource connectionSource; + + private ServerAddress address = new ServerAddress("127.0.0.1", 27017); + + @Before + public void setUp() throws Exception { + + interceptor = new MongoDBReadBindingInterceptor(); + + ServerDescription serverDescription = + ServerDescription.builder().address(address).state(ServerConnectionState.CONNECTED).build(); + + PowerMockito.when(connectionSource.getServerDescription()).thenReturn(serverDescription); + + PowerMockito.when(readBinding.getReadConnectionSource()).thenReturn(connectionSource); + + } + + @Test + public void afterMethodTest() throws Exception { + interceptor.afterMethod(instanceContext, interceptorContext, readBinding); + verify(instanceContext, times(1)).set(MongoDBMethodInterceptor.MONGODB_HOST, "127.0.0.1"); + verify(instanceContext, times(1)).set(MongoDBMethodInterceptor.MONGODB_PORT, 27017); + } + +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteBindingInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteBindingInterceptorTest.java new file mode 100644 index 000000000..89e2323d7 --- /dev/null +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteBindingInterceptorTest.java @@ -0,0 +1,61 @@ +package com.a.eye.skywalking.plugin.mongodb.v3; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.modules.junit4.PowerMockRunner; + +import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; +import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext; +import com.mongodb.ServerAddress; +import com.mongodb.binding.ConnectionSource; +import com.mongodb.binding.WriteBinding; +import com.mongodb.connection.ServerConnectionState; +import com.mongodb.connection.ServerDescription; + +@RunWith(PowerMockRunner.class) +public class MongoDBWriteBindingInterceptorTest { + + private MongoDBWriteBindingInterceptor interceptor; + + @Mock + private EnhancedClassInstanceContext instanceContext; + + @Mock + private InstanceMethodInvokeContext interceptorContext; + + @Mock + private WriteBinding writeBinding; + + @Mock + private ConnectionSource connectionSource; + + private ServerAddress address = new ServerAddress("127.0.0.1", 27017); + + @Before + public void setUp() throws Exception { + + interceptor = new MongoDBWriteBindingInterceptor(); + + ServerDescription serverDescription = + ServerDescription.builder().address(address).state(ServerConnectionState.CONNECTED).build(); + + PowerMockito.when(connectionSource.getServerDescription()).thenReturn(serverDescription); + + PowerMockito.when(writeBinding.getWriteConnectionSource()).thenReturn(connectionSource); + + } + + @Test + public void afterMethodTest() throws Exception { + interceptor.afterMethod(instanceContext, interceptorContext, writeBinding); + verify(instanceContext, times(1)).set(MongoDBMethodInterceptor.MONGODB_HOST, "127.0.0.1"); + verify(instanceContext, times(1)).set(MongoDBMethodInterceptor.MONGODB_PORT, 27017); + } + +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/resources/skywalking-plugin.def b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/resources/skywalking-plugin.def deleted file mode 100644 index e2fb179df..000000000 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-plugin/src/main/resources/skywalking-plugin.def +++ /dev/null @@ -1 +0,0 @@ -com.a.eye.skywalking.plugin.mongodb.define.MongoDBInstrumentation \ No newline at end of file diff --git a/skywalking-sniffer/skywalking-sdk-plugin/pom.xml b/skywalking-sniffer/skywalking-sdk-plugin/pom.xml index 42e8e3ba9..765b9bda2 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/pom.xml +++ b/skywalking-sniffer/skywalking-sdk-plugin/pom.xml @@ -17,7 +17,7 @@ jedis-2.x-plugin tomcat-7.x-8.x-plugin motan-plugin - mongodb-plugin + mongodb-3.x-plugin pom From e42bf6e014597d9b43df0c3b7955aeedaac36e8c Mon Sep 17 00:00:00 2001 From: baiyang Date: Wed, 19 Apr 2017 20:22:32 +0800 Subject: [PATCH 3/9] Add a flag to determine whether to bind data --- .../java/com/a/eye/skywalking/api/conf/Config.java | 7 +++++++ .../plugin/mongodb/v3/MongoDBMethodInterceptor.java | 12 +++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Config.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Config.java index 96aaafa13..6bca636d9 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Config.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Config.java @@ -23,6 +23,13 @@ public class Config { * Zero and negative number are illegal. */ public static int SAMPLING_CYCLE = 1; + + /** + * Set Mongodb plugin whether to bind params + * False=Not bound + * True=Binding + */ + public static boolean MONGODB_BINDPARAM = false; } public static class Collector { diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptor.java index 9d7f8cdf3..21015772a 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptor.java @@ -4,6 +4,7 @@ import java.util.List; import org.bson.BsonDocument; +import com.a.eye.skywalking.api.conf.Config; 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; @@ -65,13 +66,18 @@ public class MongoDBMethodInterceptor implements InstanceMethodsAroundIntercepto public void beforeMethod(final EnhancedClassInstanceContext context, final InstanceMethodInvokeContext interceptorContext, final MethodInterceptResult result) { Object[] arguments = interceptorContext.allArguments(); - OperationInfo operationInfo = this.getReadOperationInfo(arguments[0]); - Span span = ContextManager.createSpan(METHOD + operationInfo.getMethodName()); + Span span = null; + if (Config.Agent.MONGODB_BINDPARAM) { + OperationInfo operationInfo = this.getReadOperationInfo(arguments[0]); + span = ContextManager.createSpan(METHOD + operationInfo.getMethodName()); + Tags.DB_STATEMENT.set(span, operationInfo.getMethodName() + " " + operationInfo.getFilter()); + } else { + span = ContextManager.createSpan(METHOD + arguments[0].getClass().getSimpleName()); + } Tags.COMPONENT.set(span, MONGODB_COMPONENT); Tags.DB_TYPE.set(span, MONGODB_COMPONENT); Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); Tags.SPAN_LAYER.asDB(span); - Tags.DB_STATEMENT.set(span, operationInfo.getMethodName() + " " + operationInfo.getFilter()); } @Override From 4d9e1d201a96c6369434fb93d4334e3c37e4fbbd Mon Sep 17 00:00:00 2001 From: baiyang Date: Wed, 19 Apr 2017 20:56:11 +0800 Subject: [PATCH 4/9] modify MongoDBMethodInterceptorTest --- .../plugin/mongodb/v3/MongoDBMethodInterceptorTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java index 5133c8ec1..ab38e2138 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java @@ -19,6 +19,7 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import com.a.eye.skywalking.api.boot.ServiceManager; +import com.a.eye.skywalking.api.conf.Config; import com.a.eye.skywalking.api.context.TracerContext; import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext; @@ -52,6 +53,8 @@ public class MongoDBMethodInterceptorTest { mockTracerContextListener = new MockTracerContextListener(); TracerContext.ListenerManager.add(mockTracerContextListener); + + Config.Agent.MONGODB_BINDPARAM = true; when(classInstanceContext.get(MongoDBMethodInterceptor.MONGODB_HOST, String.class)).thenReturn("127.0.0.1"); when(classInstanceContext.get(MongoDBMethodInterceptor.MONGODB_PORT)).thenReturn(27017); From 79f51a7a28461334e8ccab916d8bed39644aa971 Mon Sep 17 00:00:00 2001 From: baiyang Date: Thu, 20 Apr 2017 15:20:09 +0800 Subject: [PATCH 5/9] modify mongodb --- .../com/a/eye/skywalking/api/conf/Config.java | 17 ++- .../mongodb-3.x-plugin/pom.xml | 2 +- .../mongodb/v3/MongoDBMethodInterceptor.java | 96 ++++++------ .../v3/MongoDBReadBindingInterceptor.java | 55 +++---- .../plugin/mongodb/v3/OperationInfo.java | 51 ------- .../plugin/mongodb/v3/ReadMethod.java | 22 --- .../plugin/mongodb/v3/WriteMethod.java | 23 --- .../v3/MongoDBMethodInterceptorTest.java | 6 +- .../v3/MongoDBWriteMethodInterceptorTest.java | 137 ++++++++++++++++++ 9 files changed, 232 insertions(+), 177 deletions(-) delete mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/OperationInfo.java delete mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/ReadMethod.java delete mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/WriteMethod.java create mode 100644 skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteMethodInterceptorTest.java diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Config.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Config.java index 6bca636d9..8441edb55 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Config.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Config.java @@ -23,13 +23,6 @@ public class Config { * Zero and negative number are illegal. */ public static int SAMPLING_CYCLE = 1; - - /** - * Set Mongodb plugin whether to bind params - * False=Not bound - * True=Binding - */ - public static boolean MONGODB_BINDPARAM = false; } public static class Collector { @@ -88,4 +81,14 @@ public class Config { */ public static LogLevel LEVEL = LogLevel.DEBUG; } + + public static class Plugin{ + public static class MongoDB{ + /** + * If true, trace all the parameters, default is false. + * Only trace the operation, not include parameters. + */ + public static boolean TRACE_PARAM = false; + } + } } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/pom.xml b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/pom.xml index 65018d7fd..197011f64 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/pom.xml +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/pom.xml @@ -12,7 +12,7 @@ mongodb-plugin http://maven.apache.org - + UTF-8 diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptor.java index 21015772a..d9d6243c6 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptor.java @@ -62,22 +62,24 @@ public class MongoDBMethodInterceptor implements InstanceMethodsAroundIntercepto private static final int FILTER_LENGTH_LIMIT = 256; + private static final String EMPTY = ""; + @Override public void beforeMethod(final EnhancedClassInstanceContext context, final InstanceMethodInvokeContext interceptorContext, final MethodInterceptResult result) { Object[] arguments = interceptorContext.allArguments(); - Span span = null; - if (Config.Agent.MONGODB_BINDPARAM) { - OperationInfo operationInfo = this.getReadOperationInfo(arguments[0]); - span = ContextManager.createSpan(METHOD + operationInfo.getMethodName()); - Tags.DB_STATEMENT.set(span, operationInfo.getMethodName() + " " + operationInfo.getFilter()); - } else { - span = ContextManager.createSpan(METHOD + arguments[0].getClass().getSimpleName()); - } + + String methodName = arguments[0].getClass().getSimpleName(); + Span span = ContextManager.createSpan(METHOD + methodName); Tags.COMPONENT.set(span, MONGODB_COMPONENT); Tags.DB_TYPE.set(span, MONGODB_COMPONENT); Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); Tags.SPAN_LAYER.asDB(span); + + if (Config.Plugin.MongoDB.TRACE_PARAM) { + Tags.DB_STATEMENT.set(span, methodName + " " + this.getTraceParam(arguments[0])); + } + } @Override @@ -101,77 +103,81 @@ public class MongoDBMethodInterceptor implements InstanceMethodsAroundIntercepto * filter info. */ @SuppressWarnings("rawtypes") - private OperationInfo getReadOperationInfo(Object obj) { + private String getTraceParam(Object obj) { if (obj instanceof CountOperation) { BsonDocument filter = ((CountOperation) obj).getFilter(); - return new OperationInfo(ReadMethod.COUNT.getName(), limitFilter(filter.toString())); + return limitFilter(filter.toString()); } else if (obj instanceof DistinctOperation) { BsonDocument filter = ((DistinctOperation) obj).getFilter(); - return new OperationInfo(ReadMethod.DISTINCT.getName(), limitFilter(filter.toString())); + return limitFilter(filter.toString()); } else if (obj instanceof FindOperation) { BsonDocument filter = ((FindOperation) obj).getFilter(); - return new OperationInfo(ReadMethod.FIND.getName(), limitFilter(filter.toString())); + return limitFilter(filter.toString()); } else if (obj instanceof GroupOperation) { BsonDocument filter = ((GroupOperation) obj).getFilter(); - return new OperationInfo(ReadMethod.GROUP.getName(), limitFilter(filter.toString())); + return limitFilter(filter.toString()); } else if (obj instanceof ListCollectionsOperation) { BsonDocument filter = ((ListCollectionsOperation) obj).getFilter(); - return new OperationInfo(ReadMethod.LIST_COLLECTIONS.getName(), limitFilter(filter.toString())); + return limitFilter(filter.toString()); } else if (obj instanceof MapReduceWithInlineResultsOperation) { BsonDocument filter = ((ListCollectionsOperation) obj).getFilter(); - return new OperationInfo(ReadMethod.MAPREDUCE_WITHINLINE_RESULTS.getName(), limitFilter(filter.toString())); + return limitFilter(filter.toString()); } else if (obj instanceof DeleteOperation) { - List filter = ((DeleteOperation) obj).getDeleteRequests(); - return new OperationInfo(WriteMethod.DELETE.getName(), limitFilter(filter.toString())); + List writeRequestList = ((DeleteOperation) obj).getDeleteRequests(); + return getFilter(writeRequestList); } else if (obj instanceof InsertOperation) { - List filter = ((InsertOperation) obj).getInsertRequests(); - return new OperationInfo(WriteMethod.INSERT.getName(), limitFilter(filter.toString())); + List writeRequestList = ((InsertOperation) obj).getInsertRequests(); + return getFilter(writeRequestList); } else if (obj instanceof UpdateOperation) { - List filter = ((UpdateOperation) obj).getUpdateRequests(); - return new OperationInfo(WriteMethod.UPDATE.getName(), limitFilter(filter.toString())); + List writeRequestList = ((UpdateOperation) obj).getUpdateRequests(); + return getFilter(writeRequestList); } else if (obj instanceof CreateCollectionOperation) { String filter = ((CreateCollectionOperation) obj).getCollectionName(); - return new OperationInfo(WriteMethod.CREATECOLLECTION.getName(), limitFilter(filter)); + return limitFilter(filter); } else if (obj instanceof CreateIndexesOperation) { List filter = ((CreateIndexesOperation) obj).getIndexNames(); - return new OperationInfo(WriteMethod.CREATEINDEXES.getName(), limitFilter(filter.toString())); + return limitFilter(filter.toString()); } else if (obj instanceof CreateViewOperation) { String filter = ((CreateViewOperation) obj).getViewName(); - return new OperationInfo(WriteMethod.CREATEVIEW.getName(), limitFilter(filter)); + return limitFilter(filter); } else if (obj instanceof FindAndDeleteOperation) { BsonDocument filter = ((FindAndDeleteOperation) obj).getFilter(); - return new OperationInfo(WriteMethod.FINDANDDELETE.getName(), limitFilter(filter.toString())); + return limitFilter(filter.toString()); } else if (obj instanceof FindAndReplaceOperation) { BsonDocument filter = ((FindAndReplaceOperation) obj).getFilter(); - return new OperationInfo(WriteMethod.FINDANDREPLACE.getName(), limitFilter(filter.toString())); + return limitFilter(filter.toString()); } else if (obj instanceof FindAndUpdateOperation) { BsonDocument filter = ((FindAndUpdateOperation) obj).getFilter(); - return new OperationInfo(WriteMethod.FINDANDUPDATE.getName(), limitFilter(filter.toString())); + return limitFilter(filter.toString()); } else if (obj instanceof MapReduceToCollectionOperation) { BsonDocument filter = ((MapReduceToCollectionOperation) obj).getFilter(); - return new OperationInfo(WriteMethod.MAPREDUCETOCOLLECTION.getName(), limitFilter(filter.toString())); + return limitFilter(filter.toString()); } else if (obj instanceof MixedBulkWriteOperation) { - List list = ((MixedBulkWriteOperation) obj).getWriteRequests(); - StringBuilder params = new StringBuilder(); - for (WriteRequest request : list) { - if (request instanceof InsertRequest) { - params.append(((InsertRequest) request).getDocument().toString()).append(","); - } else if (request instanceof DeleteRequest) { - params.append(((DeleteRequest) request).getFilter()).append(","); - } else if (request instanceof UpdateRequest) { - params.append(((UpdateRequest) request).getFilter()).append(","); - } - if (params.length() > FILTER_LENGTH_LIMIT) { - params.append("..."); - break; - } - } - return new OperationInfo(WriteMethod.MIXEDBULKWRITE.getName(), params.toString()); + List writeRequestList = ((MixedBulkWriteOperation) obj).getWriteRequests(); + return getFilter(writeRequestList); } else { - return new OperationInfo(obj.getClass().getSimpleName()); + return EMPTY; } } + private String getFilter(List writeRequestList) { + StringBuilder params = new StringBuilder(); + for (WriteRequest request : writeRequestList) { + if (request instanceof InsertRequest) { + params.append(((InsertRequest) request).getDocument().toString()).append(","); + } else if (request instanceof DeleteRequest) { + params.append(((DeleteRequest) request).getFilter()).append(","); + } else if (request instanceof UpdateRequest) { + params.append(((UpdateRequest) request).getFilter()).append(","); + } + if (params.length() > FILTER_LENGTH_LIMIT) { + params.append("..."); + break; + } + } + return params.toString(); + } + private String limitFilter(String filter) { final StringBuilder params = new StringBuilder(); if (filter.length() > FILTER_LENGTH_LIMIT) { diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptor.java index 6805b9ecf..7182d3eaf 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptor.java @@ -9,36 +9,41 @@ import com.mongodb.ServerAddress; import com.mongodb.binding.ReadBinding; /** - * {@link MongoDBReadBindingInterceptor} record the host and port information from {@link EnhancedClassInstanceContext#context}, + * {@link MongoDBReadBindingInterceptor} record the host and port information + * from {@link EnhancedClassInstanceContext#context}, * * @author baiyang */ -public class MongoDBReadBindingInterceptor implements InstanceMethodsAroundInterceptor { +public class MongoDBReadBindingInterceptor implements + InstanceMethodsAroundInterceptor { - @Override - public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - MethodInterceptResult result) { - } + @Override + public void beforeMethod(EnhancedClassInstanceContext context, + InstanceMethodInvokeContext interceptorContext, + MethodInterceptResult result) { + } - /** - * Execute after {@link com.mongodb.Mongo#getReadBinding(ReadPreference)}, - * record the host and port information - */ - @Override - public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - Object ret) { - ReadBinding readBinding = (ReadBinding) ret; - ServerAddress serverAddress = readBinding.getReadConnectionSource().getServerDescription().getAddress(); - String host = serverAddress.getHost(); - Integer port = serverAddress.getPort(); - context.set(MongoDBMethodInterceptor.MONGODB_HOST, host); - context.set(MongoDBMethodInterceptor.MONGODB_PORT, port); - return ret; - } + /** + * Execute after {@link com.mongodb.Mongo#getReadBinding(ReadPreference)}, + * record the host and port information + */ + @Override + public Object afterMethod(EnhancedClassInstanceContext context, + InstanceMethodInvokeContext interceptorContext, Object ret) { + ReadBinding readBinding = (ReadBinding) ret; + ServerAddress serverAddress = readBinding.getReadConnectionSource() + .getServerDescription().getAddress(); + String host = serverAddress.getHost(); + Integer port = serverAddress.getPort(); + context.set(MongoDBMethodInterceptor.MONGODB_HOST, host); + context.set(MongoDBMethodInterceptor.MONGODB_PORT, port); + return ret; + } - @Override - public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { - } + @Override + public void handleMethodException(Throwable t, + EnhancedClassInstanceContext context, + InstanceMethodInvokeContext interceptorContext) { + } } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/OperationInfo.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/OperationInfo.java deleted file mode 100644 index 4846a8646..000000000 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/OperationInfo.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.a.eye.skywalking.plugin.mongodb.v3; - -/** - * {@link OperationInfo} record the methodName and filter information - * - * @author baiyang - */ -public class OperationInfo { - - private String methodName; - - private String filter; - - public OperationInfo() { - - } - - public OperationInfo(String methodName) { - super(); - this.methodName = methodName; - this.filter = ""; - } - - public OperationInfo(String methodName, String filter) { - super(); - this.methodName = methodName; - this.filter = filter; - } - - public String getMethodName() { - return methodName; - } - - public void setMethodName(String methodName) { - this.methodName = methodName; - } - - public String getFilter() { - return filter; - } - - public void setFilter(String filter) { - this.filter = filter; - } - - @Override - public String toString() { - return "{methodName=" + methodName + ", filter=" + filter + "}"; - } - -} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/ReadMethod.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/ReadMethod.java deleted file mode 100644 index 61b329ef2..000000000 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/ReadMethod.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.a.eye.skywalking.plugin.mongodb.v3; - -/** - * {@link ReadMethod} mongoDB read method enum - * - * @author baiyang - */ -public enum ReadMethod { - COUNT("count"), DISTINCT("distinct"), FIND("find"), GROUP("group"), LIST_COLLECTIONS("listCollections"), - MAPREDUCE_WITHINLINE_RESULTS("mapReduceWithInlineResults"); - - private String name; - - private ReadMethod(String name) { - this.name = name; - } - - public String getName() { - return name; - } - -} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/WriteMethod.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/WriteMethod.java deleted file mode 100644 index 656419226..000000000 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/WriteMethod.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.a.eye.skywalking.plugin.mongodb.v3; - -/** - * {@link WriteMethod} mongoDB write method enum - * - * @author baiyang - */ -public enum WriteMethod { - DELETE("delete"), INSERT("insert"), UPDATE("update"), CREATECOLLECTION("createCollection"), CREATEINDEXES( - "createIndexess"), CREATEVIEW("createView"), FINDANDDELETE("findAndDelete"), FINDANDREPLACE( - "findAndReplace"), FINDANDUPDATE("findAndUpdate"), MAPREDUCETOCOLLECTION("mapReduceToCollection"), - MIXEDBULKWRITE("mixedBulkWrite"), UNKNOW("unknow"); - - private String name; - - private WriteMethod(String name) { - this.name = name; - } - - public String getName() { - return name; - } -} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java index ab38e2138..caf4e7f02 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java @@ -54,7 +54,7 @@ public class MongoDBMethodInterceptorTest { TracerContext.ListenerManager.add(mockTracerContextListener); - Config.Agent.MONGODB_BINDPARAM = true; + Config.Plugin.MongoDB.TRACE_PARAM = true; when(classInstanceContext.get(MongoDBMethodInterceptor.MONGODB_HOST, String.class)).thenReturn("127.0.0.1"); when(classInstanceContext.get(MongoDBMethodInterceptor.MONGODB_PORT)).thenReturn(27017); @@ -111,11 +111,11 @@ public class MongoDBMethodInterceptorTest { } private void assertRedisSpan(Span span) { - assertThat(span.getOperationName(), is("MongoDB/find")); + // assertThat(span.getOperationName(), is("MongoDB/FindOperation")); assertThat(Tags.PEER_HOST.get(span), is("127.0.0.1")); assertThat(Tags.PEER_PORT.get(span), is(27017)); assertThat(Tags.COMPONENT.get(span), is("MongoDB")); - assertThat(Tags.DB_STATEMENT.get(span), is("find { \"name\" : \"by\" }")); + // assertThat(Tags.DB_STATEMENT.get(span), is("find { \"name\" : \"by\" }")); assertThat(Tags.DB_TYPE.get(span), is("MongoDB")); assertTrue(Tags.SPAN_LAYER.isDB(span)); } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteMethodInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteMethodInterceptorTest.java new file mode 100644 index 000000000..20854d504 --- /dev/null +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteMethodInterceptorTest.java @@ -0,0 +1,137 @@ +package com.a.eye.skywalking.plugin.mongodb.v3; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; + +import org.bson.BsonDocument; +import org.bson.BsonString; +import org.hamcrest.CoreMatchers; +import org.hamcrest.MatcherAssert; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import com.a.eye.skywalking.api.boot.ServiceManager; +import com.a.eye.skywalking.api.conf.Config; +import com.a.eye.skywalking.api.context.TracerContext; +import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; +import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext; +import com.a.eye.skywalking.sniffer.mock.context.MockTracerContextListener; +import com.a.eye.skywalking.sniffer.mock.context.SegmentAssert; +import com.a.eye.skywalking.trace.LogData; +import com.a.eye.skywalking.trace.Span; +import com.a.eye.skywalking.trace.TraceSegment; +import com.a.eye.skywalking.trace.tag.Tags; +import com.mongodb.bulk.DeleteRequest; +import com.mongodb.operation.DeleteOperation; + +@RunWith(MockitoJUnitRunner.class) +public class MongoDBWriteMethodInterceptorTest { + + private MongoDBMethodInterceptor interceptor; + private MockTracerContextListener mockTracerContextListener; + + @Mock + private EnhancedClassInstanceContext classInstanceContext; + @Mock + private InstanceMethodInvokeContext methodInvokeContext; + @Mock + private DeleteOperation deleteOperation; + + @Before + public void setUp() throws Exception { + ServiceManager.INSTANCE.boot(); + + interceptor = new MongoDBMethodInterceptor(); + mockTracerContextListener = new MockTracerContextListener(); + + TracerContext.ListenerManager.add(mockTracerContextListener); + + Config.Plugin.MongoDB.TRACE_PARAM = true; + + when(classInstanceContext.get(MongoDBMethodInterceptor.MONGODB_HOST, String.class)).thenReturn("127.0.0.1"); + when(classInstanceContext.get(MongoDBMethodInterceptor.MONGODB_PORT)).thenReturn(27017); + when(methodInvokeContext.methodName()).thenReturn("find"); + + BsonDocument document = new BsonDocument(); + document.append("name", new BsonString("by")); + + List requestList = new ArrayList(); + + DeleteRequest deleteRequest = new DeleteRequest(document); + + requestList.add(deleteRequest); + + when(deleteOperation.getDeleteRequests()).thenReturn(requestList); + + when(methodInvokeContext.allArguments()).thenReturn(new Object[] { deleteOperation }); + } + + @Test + public void testIntercept() { + interceptor.beforeMethod(classInstanceContext, methodInvokeContext, null); + interceptor.afterMethod(classInstanceContext, methodInvokeContext, null); + + mockTracerContextListener.assertSize(1); + mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { + @Override + public void call(TraceSegment traceSegment) { + assertThat(traceSegment.getSpans().size(), is(1)); + Span span = traceSegment.getSpans().get(0); + assertRedisSpan(span); + } + }); + } + + private void assertRedisSpan(Span span) { + // assertThat(span.getOperationName(), is("MongoDB/DeleteOperation")); + assertThat(Tags.PEER_HOST.get(span), is("127.0.0.1")); + assertThat(Tags.PEER_PORT.get(span), is(27017)); + assertThat(Tags.COMPONENT.get(span), is("MongoDB")); + // assertThat(Tags.DB_STATEMENT.get(span), is("DeleteOperation { \"name\" : \"by\" },")); + assertThat(Tags.DB_TYPE.get(span), is("MongoDB")); + assertTrue(Tags.SPAN_LAYER.isDB(span)); + } + + @Test + public void testInterceptWithException() { + interceptor.beforeMethod(classInstanceContext, methodInvokeContext, null); + interceptor.handleMethodException(new RuntimeException(), classInstanceContext, methodInvokeContext); + interceptor.afterMethod(classInstanceContext, methodInvokeContext, null); + + mockTracerContextListener.assertSize(1); + mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { + @Override + public void call(TraceSegment traceSegment) { + assertThat(traceSegment.getSpans().size(), is(1)); + Span span = traceSegment.getSpans().get(0); + assertRedisSpan(span); + assertThat(span.getLogs().size(), is(1)); + assertLogData(span.getLogs().get(0)); + } + }); + } + + private void assertLogData(LogData logData) { + MatcherAssert.assertThat(logData.getFields().size(), is(4)); + MatcherAssert.assertThat(logData.getFields().get("event"), CoreMatchers. is("error")); + assertEquals(logData.getFields().get("error.kind"), RuntimeException.class.getName()); + assertNull(logData.getFields().get("message")); + } + + @After + public void tearDown() throws Exception { + TracerContext.ListenerManager.remove(mockTracerContextListener); + } + +} From d016f31b466885bc304b5a4a8c7178b71e8a408b Mon Sep 17 00:00:00 2001 From: baiyang Date: Thu, 20 Apr 2017 16:25:40 +0800 Subject: [PATCH 6/9] modify test case --- .../v3/MongoDBMethodInterceptorTest.java | 23 ++++++++++++------- .../v3/MongoDBWriteMethodInterceptorTest.java | 17 +++++++++----- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java index caf4e7f02..bd589478e 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java @@ -9,6 +9,7 @@ import static org.mockito.Mockito.when; import org.bson.BsonDocument; import org.bson.BsonString; +import org.bson.codecs.Decoder; import org.hamcrest.CoreMatchers; import org.hamcrest.MatcherAssert; import org.junit.After; @@ -17,6 +18,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import org.powermock.api.mockito.PowerMockito; import com.a.eye.skywalking.api.boot.ServiceManager; import com.a.eye.skywalking.api.conf.Config; @@ -29,6 +31,7 @@ import com.a.eye.skywalking.trace.LogData; import com.a.eye.skywalking.trace.Span; import com.a.eye.skywalking.trace.TraceSegment; import com.a.eye.skywalking.trace.tag.Tags; +import com.mongodb.MongoNamespace; import com.mongodb.operation.FindOperation; @RunWith(MockitoJUnitRunner.class) @@ -41,11 +44,9 @@ public class MongoDBMethodInterceptorTest { private EnhancedClassInstanceContext classInstanceContext; @Mock private InstanceMethodInvokeContext methodInvokeContext; - @SuppressWarnings("rawtypes") - @Mock - private FindOperation findOperation; - @Before + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Before public void setUp() throws Exception { ServiceManager.INSTANCE.boot(); @@ -62,8 +63,14 @@ public class MongoDBMethodInterceptorTest { BsonDocument document = new BsonDocument(); document.append("name", new BsonString("by")); - - when(findOperation.getFilter()).thenReturn(document); + + MongoNamespace mongoNamespace = new MongoNamespace("test.user"); + + Decoder decoder = PowerMockito.mock(Decoder.class); + + FindOperation findOperation = new FindOperation(mongoNamespace, decoder); + + findOperation.filter(document); when(methodInvokeContext.allArguments()).thenReturn(new Object[] { findOperation }); } @@ -111,11 +118,11 @@ public class MongoDBMethodInterceptorTest { } private void assertRedisSpan(Span span) { - // assertThat(span.getOperationName(), is("MongoDB/FindOperation")); + assertThat(span.getOperationName(), is("MongoDB/FindOperation")); assertThat(Tags.PEER_HOST.get(span), is("127.0.0.1")); assertThat(Tags.PEER_PORT.get(span), is(27017)); assertThat(Tags.COMPONENT.get(span), is("MongoDB")); - // assertThat(Tags.DB_STATEMENT.get(span), is("find { \"name\" : \"by\" }")); + assertThat(Tags.DB_STATEMENT.get(span), is("FindOperation { \"name\" : \"by\" }")); assertThat(Tags.DB_TYPE.get(span), is("MongoDB")); assertTrue(Tags.SPAN_LAYER.isDB(span)); } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteMethodInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteMethodInterceptorTest.java index 20854d504..21f913838 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteMethodInterceptorTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteMethodInterceptorTest.java @@ -20,6 +20,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import org.powermock.api.mockito.PowerMockito; import com.a.eye.skywalking.api.boot.ServiceManager; import com.a.eye.skywalking.api.conf.Config; @@ -32,6 +33,8 @@ import com.a.eye.skywalking.trace.LogData; import com.a.eye.skywalking.trace.Span; import com.a.eye.skywalking.trace.TraceSegment; import com.a.eye.skywalking.trace.tag.Tags; +import com.mongodb.MongoNamespace; +import com.mongodb.WriteConcern; import com.mongodb.bulk.DeleteRequest; import com.mongodb.operation.DeleteOperation; @@ -45,8 +48,6 @@ public class MongoDBWriteMethodInterceptorTest { private EnhancedClassInstanceContext classInstanceContext; @Mock private InstanceMethodInvokeContext methodInvokeContext; - @Mock - private DeleteOperation deleteOperation; @Before public void setUp() throws Exception { @@ -71,8 +72,12 @@ public class MongoDBWriteMethodInterceptorTest { DeleteRequest deleteRequest = new DeleteRequest(document); requestList.add(deleteRequest); - - when(deleteOperation.getDeleteRequests()).thenReturn(requestList); + + MongoNamespace mongoNamespace = new MongoNamespace("test.user"); + + WriteConcern writeConcern = PowerMockito.mock(WriteConcern.class); + + DeleteOperation deleteOperation = new DeleteOperation(mongoNamespace,false,writeConcern,requestList); when(methodInvokeContext.allArguments()).thenReturn(new Object[] { deleteOperation }); } @@ -94,11 +99,11 @@ public class MongoDBWriteMethodInterceptorTest { } private void assertRedisSpan(Span span) { - // assertThat(span.getOperationName(), is("MongoDB/DeleteOperation")); + assertThat(span.getOperationName(), is("MongoDB/DeleteOperation")); assertThat(Tags.PEER_HOST.get(span), is("127.0.0.1")); assertThat(Tags.PEER_PORT.get(span), is(27017)); assertThat(Tags.COMPONENT.get(span), is("MongoDB")); - // assertThat(Tags.DB_STATEMENT.get(span), is("DeleteOperation { \"name\" : \"by\" },")); + assertThat(Tags.DB_STATEMENT.get(span), is("DeleteOperation { \"name\" : \"by\" },")); assertThat(Tags.DB_TYPE.get(span), is("MongoDB")); assertTrue(Tags.SPAN_LAYER.isDB(span)); } From dd6e47552b747f22e857c55a39ca675c85cd821d Mon Sep 17 00:00:00 2001 From: baiyang Date: Thu, 20 Apr 2017 17:52:39 +0800 Subject: [PATCH 7/9] modify code style --- .../com/a/eye/skywalking/api/conf/Config.java | 6 +- .../mongodb-3.x-plugin/pom.xml | 80 +++++++++---------- .../mongodb/v3/MongoDBMethodInterceptor.java | 48 +++++------ .../v3/MongoDBReadBindingInterceptor.java | 54 ++++++------- .../v3/MongoDBWriteBindingInterceptor.java | 11 +-- .../v3/define/MongoDBInstrumentation.java | 62 +++++++------- .../v3/MongoDBMethodInterceptorTest.java | 18 ++--- .../v3/MongoDBReadBindingInterceptorTest.java | 2 +- .../MongoDBWriteBindingInterceptorTest.java | 2 +- .../v3/MongoDBWriteMethodInterceptorTest.java | 18 ++--- 10 files changed, 153 insertions(+), 148 deletions(-) diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Config.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Config.java index 8441edb55..1c88af5aa 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Config.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Config.java @@ -81,9 +81,9 @@ public class Config { */ public static LogLevel LEVEL = LogLevel.DEBUG; } - - public static class Plugin{ - public static class MongoDB{ + + public static class Plugin { + public static class MongoDB { /** * If true, trace all the parameters, default is false. * Only trace the operation, not include parameters. diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/pom.xml b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/pom.xml index 197011f64..956a67a9e 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/pom.xml +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/pom.xml @@ -1,47 +1,47 @@ - 4.0.0 - - skywalking-sdk-plugin - com.a.eye - 3.0.1-2017 - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + skywalking-sdk-plugin + com.a.eye + 3.0.1-2017 + - skywalking-mongodb-3.x-plugin - jar + skywalking-mongodb-3.x-plugin + jar - mongodb-plugin - http://maven.apache.org + mongodb-plugin + http://maven.apache.org - - UTF-8 - + + UTF-8 + - - - org.mongodb - mongo-java-driver - 3.4.2 - provided - - + + + org.mongodb + mongo-java-driver + 3.4.2 + provided + + - - - - - org.apache.maven.plugins - maven-source-plugin - - - - attach-sources - - jar - - - - - - + + + + + org.apache.maven.plugins + maven-source-plugin + + + + attach-sources + + jar + + + + + + \ No newline at end of file diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptor.java index d9d6243c6..d69fabbe8 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptor.java @@ -66,7 +66,7 @@ public class MongoDBMethodInterceptor implements InstanceMethodsAroundIntercepto @Override public void beforeMethod(final EnhancedClassInstanceContext context, - final InstanceMethodInvokeContext interceptorContext, final MethodInterceptResult result) { + final InstanceMethodInvokeContext interceptorContext, final MethodInterceptResult result) { Object[] arguments = interceptorContext.allArguments(); String methodName = arguments[0].getClass().getSimpleName(); @@ -84,17 +84,17 @@ public class MongoDBMethodInterceptor implements InstanceMethodsAroundIntercepto @Override public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - Object ret) { + Object ret) { Span span = ContextManager.activeSpan(); Tags.PEER_HOST.set(span, context.get(MONGODB_HOST, String.class)); - Tags.PEER_PORT.set(span, (Integer) context.get(MONGODB_PORT)); + Tags.PEER_PORT.set(span, (Integer)context.get(MONGODB_PORT)); ContextManager.stopSpan(); return ret; } @Override public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { + InstanceMethodInvokeContext interceptorContext) { ContextManager.activeSpan().log(t); } @@ -105,55 +105,55 @@ public class MongoDBMethodInterceptor implements InstanceMethodsAroundIntercepto @SuppressWarnings("rawtypes") private String getTraceParam(Object obj) { if (obj instanceof CountOperation) { - BsonDocument filter = ((CountOperation) obj).getFilter(); + BsonDocument filter = ((CountOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof DistinctOperation) { - BsonDocument filter = ((DistinctOperation) obj).getFilter(); + BsonDocument filter = ((DistinctOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof FindOperation) { - BsonDocument filter = ((FindOperation) obj).getFilter(); + BsonDocument filter = ((FindOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof GroupOperation) { - BsonDocument filter = ((GroupOperation) obj).getFilter(); + BsonDocument filter = ((GroupOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof ListCollectionsOperation) { - BsonDocument filter = ((ListCollectionsOperation) obj).getFilter(); + BsonDocument filter = ((ListCollectionsOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof MapReduceWithInlineResultsOperation) { - BsonDocument filter = ((ListCollectionsOperation) obj).getFilter(); + BsonDocument filter = ((ListCollectionsOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof DeleteOperation) { - List writeRequestList = ((DeleteOperation) obj).getDeleteRequests(); + List writeRequestList = ((DeleteOperation)obj).getDeleteRequests(); return getFilter(writeRequestList); } else if (obj instanceof InsertOperation) { - List writeRequestList = ((InsertOperation) obj).getInsertRequests(); + List writeRequestList = ((InsertOperation)obj).getInsertRequests(); return getFilter(writeRequestList); } else if (obj instanceof UpdateOperation) { - List writeRequestList = ((UpdateOperation) obj).getUpdateRequests(); + List writeRequestList = ((UpdateOperation)obj).getUpdateRequests(); return getFilter(writeRequestList); } else if (obj instanceof CreateCollectionOperation) { - String filter = ((CreateCollectionOperation) obj).getCollectionName(); + String filter = ((CreateCollectionOperation)obj).getCollectionName(); return limitFilter(filter); } else if (obj instanceof CreateIndexesOperation) { - List filter = ((CreateIndexesOperation) obj).getIndexNames(); + List filter = ((CreateIndexesOperation)obj).getIndexNames(); return limitFilter(filter.toString()); } else if (obj instanceof CreateViewOperation) { - String filter = ((CreateViewOperation) obj).getViewName(); + String filter = ((CreateViewOperation)obj).getViewName(); return limitFilter(filter); } else if (obj instanceof FindAndDeleteOperation) { - BsonDocument filter = ((FindAndDeleteOperation) obj).getFilter(); + BsonDocument filter = ((FindAndDeleteOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof FindAndReplaceOperation) { - BsonDocument filter = ((FindAndReplaceOperation) obj).getFilter(); + BsonDocument filter = ((FindAndReplaceOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof FindAndUpdateOperation) { - BsonDocument filter = ((FindAndUpdateOperation) obj).getFilter(); + BsonDocument filter = ((FindAndUpdateOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof MapReduceToCollectionOperation) { - BsonDocument filter = ((MapReduceToCollectionOperation) obj).getFilter(); + BsonDocument filter = ((MapReduceToCollectionOperation)obj).getFilter(); return limitFilter(filter.toString()); } else if (obj instanceof MixedBulkWriteOperation) { - List writeRequestList = ((MixedBulkWriteOperation) obj).getWriteRequests(); + List writeRequestList = ((MixedBulkWriteOperation)obj).getWriteRequests(); return getFilter(writeRequestList); } else { return EMPTY; @@ -164,11 +164,11 @@ public class MongoDBMethodInterceptor implements InstanceMethodsAroundIntercepto StringBuilder params = new StringBuilder(); for (WriteRequest request : writeRequestList) { if (request instanceof InsertRequest) { - params.append(((InsertRequest) request).getDocument().toString()).append(","); + params.append(((InsertRequest)request).getDocument().toString()).append(","); } else if (request instanceof DeleteRequest) { - params.append(((DeleteRequest) request).getFilter()).append(","); + params.append(((DeleteRequest)request).getFilter()).append(","); } else if (request instanceof UpdateRequest) { - params.append(((UpdateRequest) request).getFilter()).append(","); + params.append(((UpdateRequest)request).getFilter()).append(","); } if (params.length() > FILTER_LENGTH_LIMIT) { params.append("..."); diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptor.java index 7182d3eaf..000422d5f 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptor.java @@ -15,35 +15,35 @@ import com.mongodb.binding.ReadBinding; * @author baiyang */ public class MongoDBReadBindingInterceptor implements - InstanceMethodsAroundInterceptor { + InstanceMethodsAroundInterceptor { - @Override - public void beforeMethod(EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext, - MethodInterceptResult result) { - } + @Override + public void beforeMethod(EnhancedClassInstanceContext context, + InstanceMethodInvokeContext interceptorContext, + MethodInterceptResult result) { + } - /** - * Execute after {@link com.mongodb.Mongo#getReadBinding(ReadPreference)}, - * record the host and port information - */ - @Override - public Object afterMethod(EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext, Object ret) { - ReadBinding readBinding = (ReadBinding) ret; - ServerAddress serverAddress = readBinding.getReadConnectionSource() - .getServerDescription().getAddress(); - String host = serverAddress.getHost(); - Integer port = serverAddress.getPort(); - context.set(MongoDBMethodInterceptor.MONGODB_HOST, host); - context.set(MongoDBMethodInterceptor.MONGODB_PORT, port); - return ret; - } + /** + * Execute after {@link com.mongodb.Mongo#getReadBinding(ReadPreference)}, + * record the host and port information + */ + @Override + public Object afterMethod(EnhancedClassInstanceContext context, + InstanceMethodInvokeContext interceptorContext, Object ret) { + ReadBinding readBinding = (ReadBinding)ret; + ServerAddress serverAddress = readBinding.getReadConnectionSource() + .getServerDescription().getAddress(); + String host = serverAddress.getHost(); + Integer port = serverAddress.getPort(); + context.set(MongoDBMethodInterceptor.MONGODB_HOST, host); + context.set(MongoDBMethodInterceptor.MONGODB_PORT, port); + return ret; + } - @Override - public void handleMethodException(Throwable t, - EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { - } + @Override + public void handleMethodException(Throwable t, + EnhancedClassInstanceContext context, + InstanceMethodInvokeContext interceptorContext) { + } } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteBindingInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteBindingInterceptor.java index 0d90125e8..09a89f6bc 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteBindingInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteBindingInterceptor.java @@ -8,7 +8,8 @@ import com.mongodb.ServerAddress; import com.mongodb.binding.WriteBinding; /** - * {@link MongoDBWriteBindingInterceptor} record the host and port information from {@link EnhancedClassInstanceContext#context} + * {@link MongoDBWriteBindingInterceptor} record the host and port information from {@link + * EnhancedClassInstanceContext#context} * * @author baiyang */ @@ -16,7 +17,7 @@ public class MongoDBWriteBindingInterceptor implements InstanceMethodsAroundInte @Override public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - MethodInterceptResult result) { + MethodInterceptResult result) { } /** @@ -25,8 +26,8 @@ public class MongoDBWriteBindingInterceptor implements InstanceMethodsAroundInte */ @Override public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, - Object ret) { - WriteBinding writeBinding = (WriteBinding) ret; + Object ret) { + WriteBinding writeBinding = (WriteBinding)ret; ServerAddress serverAddress = writeBinding.getWriteConnectionSource().getServerDescription().getAddress(); String host = serverAddress.getHost(); Integer port = serverAddress.getPort(); @@ -37,7 +38,7 @@ public class MongoDBWriteBindingInterceptor implements InstanceMethodsAroundInte @Override public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { + InstanceMethodInvokeContext interceptorContext) { } } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/define/MongoDBInstrumentation.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/define/MongoDBInstrumentation.java index bbf717396..98f7e08c6 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/define/MongoDBInstrumentation.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/main/java/com/a/eye/skywalking/plugin/mongodb/v3/define/MongoDBInstrumentation.java @@ -1,16 +1,18 @@ package com.a.eye.skywalking.plugin.mongodb.v3.define; import static net.bytebuddy.matcher.ElementMatchers.named; + import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.matcher.ElementMatcher; 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 com.a.eye.skywalking.plugin.mongodb.v3.MongoDBMethodInterceptor; /** - * {@link MongoDBInstrumentation} presents that skywalking intercepts {@link com.mongodb.Mongo#execute(ReadOperation, ReadPreference)},{@link com.mongodb.Mongo#execute(WriteOperation)} - * by using {@link MongoDBMethodInterceptor}. + * {@link MongoDBInstrumentation} presents that skywalking intercepts {@link com.mongodb.Mongo#execute(ReadOperation, + * ReadPreference)},{@link com.mongodb.Mongo#execute(WriteOperation)} by using {@link MongoDBMethodInterceptor}. * * @author baiyang */ @@ -31,37 +33,39 @@ public class MongoDBInstrumentation extends ClassInstanceMethodsEnhancePluginDef @Override protected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[] { new InstanceMethodsInterceptPoint() { - @Override - public ElementMatcher getMethodsMatcher() { - return named("execute"); - } + return new InstanceMethodsInterceptPoint[] { + new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named("execute"); + } - @Override - public String getMethodsInterceptor() { - return MONGDB_METHOD_INTERCET_CLASS; - } - }, new InstanceMethodsInterceptPoint() { - @Override - public ElementMatcher getMethodsMatcher() { - return named("getReadBinding"); - } + @Override + public String getMethodsInterceptor() { + return MONGDB_METHOD_INTERCET_CLASS; + } + }, new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named("getReadBinding"); + } - @Override - public String getMethodsInterceptor() { - return MONGDB_READ_BINDING_CLASS; - } - }, new InstanceMethodsInterceptPoint() { - @Override - public ElementMatcher getMethodsMatcher() { - return named("getWriteBinding"); - } + @Override + public String getMethodsInterceptor() { + return MONGDB_READ_BINDING_CLASS; + } + }, new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named("getWriteBinding"); + } - @Override - public String getMethodsInterceptor() { - return MONGDB_WRITE_BINDING_CLASS; + @Override + public String getMethodsInterceptor() { + return MONGDB_WRITE_BINDING_CLASS; + } } - } }; + }; } @Override diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java index bd589478e..9078ca259 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java @@ -45,8 +45,8 @@ public class MongoDBMethodInterceptorTest { @Mock private InstanceMethodInvokeContext methodInvokeContext; - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Before + @SuppressWarnings({"rawtypes", "unchecked"}) + @Before public void setUp() throws Exception { ServiceManager.INSTANCE.boot(); @@ -54,7 +54,7 @@ public class MongoDBMethodInterceptorTest { mockTracerContextListener = new MockTracerContextListener(); TracerContext.ListenerManager.add(mockTracerContextListener); - + Config.Plugin.MongoDB.TRACE_PARAM = true; when(classInstanceContext.get(MongoDBMethodInterceptor.MONGODB_HOST, String.class)).thenReturn("127.0.0.1"); @@ -63,16 +63,16 @@ public class MongoDBMethodInterceptorTest { BsonDocument document = new BsonDocument(); document.append("name", new BsonString("by")); - + MongoNamespace mongoNamespace = new MongoNamespace("test.user"); - + Decoder decoder = PowerMockito.mock(Decoder.class); - + FindOperation findOperation = new FindOperation(mongoNamespace, decoder); - + findOperation.filter(document); - when(methodInvokeContext.allArguments()).thenReturn(new Object[] { findOperation }); + when(methodInvokeContext.allArguments()).thenReturn(new Object[] {findOperation}); } @Test @@ -112,7 +112,7 @@ public class MongoDBMethodInterceptorTest { private void assertLogData(LogData logData) { MatcherAssert.assertThat(logData.getFields().size(), is(4)); - MatcherAssert.assertThat(logData.getFields().get("event"), CoreMatchers. is("error")); + MatcherAssert.assertThat(logData.getFields().get("event"), CoreMatchers.is("error")); assertEquals(logData.getFields().get("error.kind"), RuntimeException.class.getName()); assertNull(logData.getFields().get("message")); } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptorTest.java index a2f1b24bc..78b515717 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptorTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBReadBindingInterceptorTest.java @@ -43,7 +43,7 @@ public class MongoDBReadBindingInterceptorTest { interceptor = new MongoDBReadBindingInterceptor(); ServerDescription serverDescription = - ServerDescription.builder().address(address).state(ServerConnectionState.CONNECTED).build(); + ServerDescription.builder().address(address).state(ServerConnectionState.CONNECTED).build(); PowerMockito.when(connectionSource.getServerDescription()).thenReturn(serverDescription); diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteBindingInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteBindingInterceptorTest.java index 89e2323d7..138e18c0f 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteBindingInterceptorTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteBindingInterceptorTest.java @@ -43,7 +43,7 @@ public class MongoDBWriteBindingInterceptorTest { interceptor = new MongoDBWriteBindingInterceptor(); ServerDescription serverDescription = - ServerDescription.builder().address(address).state(ServerConnectionState.CONNECTED).build(); + ServerDescription.builder().address(address).state(ServerConnectionState.CONNECTED).build(); PowerMockito.when(connectionSource.getServerDescription()).thenReturn(serverDescription); diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteMethodInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteMethodInterceptorTest.java index 21f913838..1154f6f57 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteMethodInterceptorTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBWriteMethodInterceptorTest.java @@ -72,14 +72,14 @@ public class MongoDBWriteMethodInterceptorTest { DeleteRequest deleteRequest = new DeleteRequest(document); requestList.add(deleteRequest); - - MongoNamespace mongoNamespace = new MongoNamespace("test.user"); - - WriteConcern writeConcern = PowerMockito.mock(WriteConcern.class); - - DeleteOperation deleteOperation = new DeleteOperation(mongoNamespace,false,writeConcern,requestList); - when(methodInvokeContext.allArguments()).thenReturn(new Object[] { deleteOperation }); + MongoNamespace mongoNamespace = new MongoNamespace("test.user"); + + WriteConcern writeConcern = PowerMockito.mock(WriteConcern.class); + + DeleteOperation deleteOperation = new DeleteOperation(mongoNamespace, false, writeConcern, requestList); + + when(methodInvokeContext.allArguments()).thenReturn(new Object[] {deleteOperation}); } @Test @@ -99,7 +99,7 @@ public class MongoDBWriteMethodInterceptorTest { } private void assertRedisSpan(Span span) { - assertThat(span.getOperationName(), is("MongoDB/DeleteOperation")); + assertThat(span.getOperationName(), is("MongoDB/DeleteOperation")); assertThat(Tags.PEER_HOST.get(span), is("127.0.0.1")); assertThat(Tags.PEER_PORT.get(span), is(27017)); assertThat(Tags.COMPONENT.get(span), is("MongoDB")); @@ -129,7 +129,7 @@ public class MongoDBWriteMethodInterceptorTest { private void assertLogData(LogData logData) { MatcherAssert.assertThat(logData.getFields().size(), is(4)); - MatcherAssert.assertThat(logData.getFields().get("event"), CoreMatchers. is("error")); + MatcherAssert.assertThat(logData.getFields().get("event"), CoreMatchers.is("error")); assertEquals(logData.getFields().get("error.kind"), RuntimeException.class.getName()); assertNull(logData.getFields().get("message")); } From 78c330a804a45c4bde426ea571e9f21c44ac7518 Mon Sep 17 00:00:00 2001 From: baiyang Date: Thu, 20 Apr 2017 18:04:44 +0800 Subject: [PATCH 8/9] modify code style --- .../plugin/mongodb/v3/MongoDBMethodInterceptorTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java index 9078ca259..6902ab01c 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/mongodb-3.x-plugin/src/test/java/com/a/eye/skywalking/plugin/mongodb/v3/MongoDBMethodInterceptorTest.java @@ -63,13 +63,9 @@ public class MongoDBMethodInterceptorTest { BsonDocument document = new BsonDocument(); document.append("name", new BsonString("by")); - MongoNamespace mongoNamespace = new MongoNamespace("test.user"); - Decoder decoder = PowerMockito.mock(Decoder.class); - FindOperation findOperation = new FindOperation(mongoNamespace, decoder); - findOperation.filter(document); when(methodInvokeContext.allArguments()).thenReturn(new Object[] {findOperation}); From 7db8ac7803cb405be2f5d3a2bb63ec798df09115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=8F=E6=9D=A8=20Bai=20Yang?= Date: Thu, 20 Apr 2017 20:36:46 +0800 Subject: [PATCH 9/9] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e6bcd0756..df784b161 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ _In chronological order_ * 徐妍 [@TastySummer](https://github.com/TastySummer) * 彭勇升 [@pengys5](https://github.com/pengys5) * 戴文 - +* 柏杨 [@bai-yang](https://github.com/bai-yang) # Screenshots - Topological graph of application clusters.