From da5d079f784131b65cf934c0b75026e35e30f545 Mon Sep 17 00:00:00 2001 From: emeroad Date: Mon, 13 Nov 2023 16:10:32 +0900 Subject: [PATCH] [#10504] Geometry filter query in the mongodb is not traced --- .../pinpoint/plugin/mongo/MongoConstants.java | 47 +++++++++---------- .../pinpoint/plugin/mongo/MongoPlugin.java | 10 ++-- .../pinpoint/plugin/mongo/WriteContext.java | 32 +++++++------ .../plugin/mongo/WriteContextTest.java | 18 +++++++ 4 files changed, 63 insertions(+), 44 deletions(-) diff --git a/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/MongoConstants.java b/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/MongoConstants.java index 2cbba6c31c9c..76fc80edb95f 100644 --- a/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/MongoConstants.java +++ b/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/MongoConstants.java @@ -19,9 +19,6 @@ import com.navercorp.pinpoint.common.trace.ServiceType; import com.navercorp.pinpoint.common.trace.ServiceTypeFactory; -import java.util.Arrays; -import java.util.List; - import static com.navercorp.pinpoint.common.trace.AnnotationKeyProperty.VIEW_IN_RECORD_SET; import static com.navercorp.pinpoint.common.trace.ServiceTypeProperty.INCLUDE_DESTINATION_ID; import static com.navercorp.pinpoint.common.trace.ServiceTypeProperty.RECORD_STATISTICS; @@ -37,28 +34,28 @@ private MongoConstants() { static final String MONGO_SCOPE = "MONGO_JAVA_DRIVER"; static final String MONGO_FILTER_NOT = "com.mongodb.client.model.Filters$NotFilter"; - static final String MONGO_FILTER_SIMPLEENCODING = "com.mongodb.client.model.Filters$SimpleEncodingFilter"; - static final String MONGO_FILTER_ITERABLEOPERATOR = "com.mongodb.client.model.Filters$IterableOperatorFilter"; + static final String MONGO_FILTER_SIMPLE_ENCODING = "com.mongodb.client.model.Filters$SimpleEncodingFilter"; + static final String MONGO_FILTER_ITERABLE_OPERATOR = "com.mongodb.client.model.Filters$IterableOperatorFilter"; static final String MONGO_FILTER_OR = "com.mongodb.client.model.Filters$OrFilter"; static final String MONGO_FILTER_AND = "com.mongodb.client.model.Filters$AndFilter"; static final String MONGO_FILTER_OPERATOR = "com.mongodb.client.model.Filters$OperatorFilter"; static final String MONGO_FILTER_SIMPLE = "com.mongodb.client.model.Filters$SimpleFilter"; - static final String MONGO_FILTER_GEOMETRYOPERATOR = "com.mongodb.client.model.Filters$.GeometryOperatorFilter"; + static final String MONGO_FILTER_GEOMETRY_OPERATOR = "com.mongodb.client.model.Filters$GeometryOperatorFilter"; static final String MONGO_FILTER_TEXT = "com.mongodb.client.model.Filters$TextFilter"; static final String MONGO_FILTER_ORNOR = "com.mongodb.client.model.Filters$OrNorFilter"; - static final List FILTERLIST = Arrays.asList( - MONGO_FILTER_NOT, - MONGO_FILTER_SIMPLEENCODING, - MONGO_FILTER_ITERABLEOPERATOR, - MONGO_FILTER_OR, - MONGO_FILTER_AND, - MONGO_FILTER_OPERATOR, - MONGO_FILTER_SIMPLE, - MONGO_FILTER_GEOMETRYOPERATOR, - MONGO_FILTER_TEXT, - MONGO_FILTER_ORNOR - ); + static final String[] FILTER_LIST = { + MONGO_FILTER_NOT, + MONGO_FILTER_SIMPLE_ENCODING, + MONGO_FILTER_ITERABLE_OPERATOR, + MONGO_FILTER_OR, + MONGO_FILTER_AND, + MONGO_FILTER_OPERATOR, + MONGO_FILTER_SIMPLE, + MONGO_FILTER_GEOMETRY_OPERATOR, + MONGO_FILTER_TEXT, + MONGO_FILTER_ORNOR + }; static final String MONGO_UPDATES_SIMPLE = "com.mongodb.client.model.Updates$SimpleUpdate"; static final String MONGO_UPDATES_WITHEACH = "com.mongodb.client.model.Updates$WithEachUpdate"; @@ -66,13 +63,13 @@ private MongoConstants() { static final String MONGO_UPDATES_PULLALL = "com.mongodb.client.model.Updates$PullAllUpdate"; static final String MONGO_UPDATES_COMPOSITE = "com.mongodb.client.model.Updates$CompositeUpdate"; - static final List UPDATESLIST = Arrays.asList( - MONGO_UPDATES_SIMPLE, - MONGO_UPDATES_WITHEACH, - MONGO_UPDATES_PUSH, - MONGO_UPDATES_PULLALL, - MONGO_UPDATES_COMPOSITE - ); + static final String[] UPDATES_LIST = { + MONGO_UPDATES_SIMPLE, + MONGO_UPDATES_WITHEACH, + MONGO_UPDATES_PUSH, + MONGO_UPDATES_PULLALL, + MONGO_UPDATES_COMPOSITE + }; static final String MONGO_SORT_COMPOSITE = "com.mongodb.client.model.Sorts$CompoundSort"; diff --git a/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/MongoPlugin.java b/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/MongoPlugin.java index 28d1f6c46adf..d311c86ca068 100644 --- a/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/MongoPlugin.java +++ b/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/MongoPlugin.java @@ -545,13 +545,13 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, Strin } List nestedClasses = target.getNestedClasses( - ClassFilters.name(MongoConstants.FILTERLIST.toArray(new String[0])) + ClassFilters.name(MongoConstants.FILTER_LIST) ); for (final InstrumentClass nestedClass : nestedClasses) { //GeometryOperatorFilter 3.1+ - if (nestedClass.getName().equals(MongoConstants.MONGO_FILTER_GEOMETRYOPERATOR)) { + if (nestedClass.getName().equals(MongoConstants.MONGO_FILTER_GEOMETRY_OPERATOR)) { instrumentor.transform(loader, nestedClass.getName(), GeometryOperatorTransform.class); } @@ -561,12 +561,12 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, Strin } //SimpleEncodingFilter - if (nestedClass.getName().equals(MongoConstants.MONGO_FILTER_SIMPLEENCODING)) { + if (nestedClass.getName().equals(MongoConstants.MONGO_FILTER_SIMPLE_ENCODING)) { instrumentor.transform(loader, nestedClass.getName(), SimpleEncodingFilterTransform.class); } //IterableOperatorFilter - if (nestedClass.getName().equals(MongoConstants.MONGO_FILTER_ITERABLEOPERATOR)) { + if (nestedClass.getName().equals(MongoConstants.MONGO_FILTER_ITERABLE_OPERATOR)) { instrumentor.transform(loader, nestedClass.getName(), IterableOperatorFilterTransform.class); } @@ -766,7 +766,7 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, Strin } List nestedClasses = target.getNestedClasses( - ClassFilters.name(MongoConstants.UPDATESLIST.toArray(new String[0])) + ClassFilters.name(MongoConstants.UPDATES_LIST) ); for (final InstrumentClass nestedClass : nestedClasses) { diff --git a/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/WriteContext.java b/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/WriteContext.java index 761d57520265..daae87b12176 100644 --- a/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/WriteContext.java +++ b/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/WriteContext.java @@ -248,11 +248,11 @@ private void parseSortObject(Object arg) { private void parseFilterObject(Object arg) { String argName = arg.getClass().getName(); - logger.debug("filter arg : " + arg.getClass().getName()); + logger.debug("filter arg : {}", argName); //OperatorFilter switch (argName) { - case MongoConstants.MONGO_FILTER_GEOMETRYOPERATOR: + case MongoConstants.MONGO_FILTER_GEOMETRY_OPERATOR: logger.debug("writing GeometryOperatorFilter"); bsonWriter.writeStartDocument(); @@ -289,7 +289,7 @@ private void parseFilterObject(Object arg) { bsonWriter.writeEndDocument(); break; //IterableOperatorFilter - case MongoConstants.MONGO_FILTER_ITERABLEOPERATOR: + case MongoConstants.MONGO_FILTER_ITERABLE_OPERATOR: logger.debug("writing IterableOperatorFilter"); if (arg instanceof FieldNameGetter) { @@ -309,7 +309,7 @@ private void parseFilterObject(Object arg) { } break; //SimpleEncodingFilter - case MongoConstants.MONGO_FILTER_SIMPLEENCODING: + case MongoConstants.MONGO_FILTER_SIMPLE_ENCODING: //else if (arg instanceof FieldNameGetter && arg instanceof ValueGetter) { logger.debug("writing SimpleEncodingFilter"); @@ -754,23 +754,27 @@ private void writeNull() { } private boolean isSort(Object arg) { - if (MongoConstants.MONGO_SORT_COMPOSITE.equals(arg.getClass().getName())) { - return true; - } - return false; + return MongoConstants.MONGO_SORT_COMPOSITE.equals(arg.getClass().getName()); } private boolean isUpdates(Object arg) { - if (MongoConstants.UPDATESLIST.contains(arg.getClass().getName())) { - return true; - } - return false; + String name = arg.getClass().getName(); + return contains(MongoConstants.UPDATES_LIST, name); } private boolean isFilter(Object arg) { - if (MongoConstants.FILTERLIST.contains(arg.getClass().getName())) { - return true; + String name = arg.getClass().getName(); + return contains(MongoConstants.FILTER_LIST, name); + } + + private static boolean contains(String[] list, String name) { + for (String className : list) { + if (className.equals(name)) { + return true; + } } return false; } + + } diff --git a/plugins/mongodb/src/test/java/com/navercorp/pinpoint/plugin/mongo/WriteContextTest.java b/plugins/mongodb/src/test/java/com/navercorp/pinpoint/plugin/mongo/WriteContextTest.java index cc7d7ce4bba1..646d59ca75f9 100644 --- a/plugins/mongodb/src/test/java/com/navercorp/pinpoint/plugin/mongo/WriteContextTest.java +++ b/plugins/mongodb/src/test/java/com/navercorp/pinpoint/plugin/mongo/WriteContextTest.java @@ -1,8 +1,10 @@ package com.navercorp.pinpoint.plugin.mongo; +import com.mongodb.client.model.Filters; import com.navercorp.pinpoint.common.util.BytesUtils; import org.bson.BsonBinary; import org.bson.BsonDocument; +import org.bson.conversions.Bson; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -10,6 +12,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Base64; +import java.util.Collections; import java.util.List; /** @@ -35,4 +38,19 @@ void parse_binary() { byte[] sourceByes = Arrays.copyOf(Base64.getEncoder().encode(bytes), WriteContext.DEFAULT_ABBREVIATE_MAX_WIDTH); Assertions.assertEquals(BytesUtils.toString(sourceByes), nopadInput); } + + + @Test + void parse_geometry() { + List parameter = new ArrayList<>(); + WriteContext context = new WriteContext(parameter, true, true); + + BsonDocument bson = new BsonDocument(); + BsonBinary binary = new BsonBinary("123456789".getBytes(StandardCharsets.UTF_8)); + bson.append("bson", binary); + + Bson geo = Filters.geoIntersects("geo", bson); + // touch GeometryOperatorFilter line + Assertions.assertThrows(ClassCastException.class, () -> context.parse(Collections.singletonList(geo))); + } } \ No newline at end of file