diff --git a/skywalking-sniffer/skywalking-agent/pom.xml b/skywalking-sniffer/skywalking-agent/pom.xml index 0d1ebff047a5b4cdc2a05aeb6b400c7f7a63845c..e12f0fc938a23e25f2301703014bc861c82f56fe 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 ba40b314290a394b9e0b9d94addba1c535e9d9d5..65018d7fdff9cdba95c30c3873126bac83e8fd41 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 2fb5ae5b0843896e3d1b3f64222188180b2a7a28..9d7f8cdf34f4f1361b6d2b3c26572ff042f6e19f 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(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 new OperationInfo(WriteMethod.UNKNOW.getName()); + 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 7a0c5ec7cc141edb31e7529755e14cc794a4fa2f..6805b9ecffc6f02f4c902f65b0c0bd5e4d8ba013 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 0e3146b4667effc50a24a57992b70394413df068..0d90125e86725a13c80c0f0449d344cebd909569 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 01e91d4685a35b2cfe1a622ecfa2ac7e82ed5838..4846a8646d2515df2b934b5789041d38c70a5edf 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 0797cfb246ff58e9852f5342f81d1beab7b75ed7..61b329ef232fe5ce7e0b94a583fb12faa500ffda 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 81bcf5a8ce367067664059dc0ddfdfb07779b2b7..6564192269e775c7b8331e19a4af55b2bf0252e3 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 2620722596d8ac7715b90327bce290b8fb505e75..bbf717396fce98368dce97e68fb0dd77ed241e44 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 0000000000000000000000000000000000000000..8473327cbbe79fd918f57f982f543817c8e8b2b1 --- /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 0000000000000000000000000000000000000000..5133c8ec1d2db03a5dca3b52248d0c16fe80550b --- /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 0000000000000000000000000000000000000000..a2f1b24bc8ae385f251fcb18b16f6b8b79974a9f --- /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 0000000000000000000000000000000000000000..89e2323d75786592197886adfed8cf4493d4d3ab --- /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 e2fb179dff797336a0d83314bd314f830debe217..0000000000000000000000000000000000000000 --- 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 42e8e3ba91ca3c7910dbcb493f16b45c1de64e12..765b9bda2b725d43ec000a1ec3c0eb29df0cecc3 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