From 095a8851bcd61eb1a0c10f8d0cc3134bb4b7c07c Mon Sep 17 00:00:00 2001 From: Jaehong-Kim Date: Wed, 24 Apr 2024 14:55:51 +0900 Subject: [PATCH] [#10940] Fix mongodb mongodbClient constructor --- .../pinpoint/plugin/mongo/MongoPlugin.java | 3 +- .../MongoClientConstructorInterceptor.java | 10 --- .../MongoClientV4ConstructorInterceptor.java | 75 +++++++++++++++++++ 3 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 agent-module/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/interceptor/MongoClientV4ConstructorInterceptor.java diff --git a/agent-module/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/MongoPlugin.java b/agent-module/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/MongoPlugin.java index 68f163d3e474..b0c121826831 100644 --- a/agent-module/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/MongoPlugin.java +++ b/agent-module/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/MongoPlugin.java @@ -57,6 +57,7 @@ import com.navercorp.pinpoint.plugin.mongo.interceptor.MongoClientGetDatabaseInterceptor; import com.navercorp.pinpoint.plugin.mongo.interceptor.MongoClientImplConstructorInterceptor; import com.navercorp.pinpoint.plugin.mongo.interceptor.MongoClientImplGetDatabaseInterceptor; +import com.navercorp.pinpoint.plugin.mongo.interceptor.MongoClientV4ConstructorInterceptor; import com.navercorp.pinpoint.plugin.mongo.interceptor.MongoClientsInterceptor; import com.navercorp.pinpoint.plugin.mongo.interceptor.MongoCollectionImplConstructorInterceptor; import com.navercorp.pinpoint.plugin.mongo.interceptor.MongoCollectionImplReadOperationInterceptor; @@ -238,7 +239,7 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, Strin // MongoClient(final MongoClientSettings settings, @Nullable final MongoClientOptions options, @Nullable final MongoDriverInformation mongoDriverInformation) final InstrumentMethod constructorMethod13 = target.getConstructor("com.mongodb.MongoClientSettings", "com.mongodb.MongoClientOptions", "com.mongodb.MongoDriverInformation"); if (constructorMethod13 != null) { - constructorMethod13.addInterceptor(MongoClientConstructorInterceptor.class); + constructorMethod13.addInterceptor(MongoClientV4ConstructorInterceptor.class); } final InstrumentMethod getDatabaseMethod = target.getDeclaredMethod("getDatabase", "java.lang.String"); diff --git a/agent-module/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/interceptor/MongoClientConstructorInterceptor.java b/agent-module/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/interceptor/MongoClientConstructorInterceptor.java index 21b8a2c4980a..a2774387e41f 100644 --- a/agent-module/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/interceptor/MongoClientConstructorInterceptor.java +++ b/agent-module/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/interceptor/MongoClientConstructorInterceptor.java @@ -16,7 +16,6 @@ package com.navercorp.pinpoint.plugin.mongo.interceptor; -import com.mongodb.MongoClientSettings; import com.mongodb.ServerAddress; import com.navercorp.pinpoint.bootstrap.interceptor.AroundInterceptor; import com.navercorp.pinpoint.bootstrap.logging.PluginLogManager; @@ -24,7 +23,6 @@ import com.navercorp.pinpoint.common.plugin.util.HostAndPort; import com.navercorp.pinpoint.common.util.ArrayArgumentUtils; import com.navercorp.pinpoint.plugin.mongo.HostListAccessor; -import com.navercorp.pinpoint.plugin.mongo.MongoUtil; import java.util.ArrayList; import java.util.List; @@ -55,14 +53,6 @@ public void after(Object target, Object[] args, Object result, Throwable throwab } try { - // over 4.2 - final MongoClientSettings mongoClientSettings = ArrayArgumentUtils.getArgument(args, 0, MongoClientSettings.class); - if (mongoClientSettings != null) { - List list = MongoUtil.getHostList(mongoClientSettings); - setHostList(target, list); - return; - } - final List hostList = new ArrayList<>(); // arg0 is ServerAddress final ServerAddress serverAddress = ArrayArgumentUtils.getArgument(args, 0, ServerAddress.class); diff --git a/agent-module/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/interceptor/MongoClientV4ConstructorInterceptor.java b/agent-module/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/interceptor/MongoClientV4ConstructorInterceptor.java new file mode 100644 index 000000000000..4e00ed5562ff --- /dev/null +++ b/agent-module/plugins/mongodb/src/main/java/com/navercorp/pinpoint/plugin/mongo/interceptor/MongoClientV4ConstructorInterceptor.java @@ -0,0 +1,75 @@ +/* + * Copyright 2022 NAVER Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.navercorp.pinpoint.plugin.mongo.interceptor; + +import com.mongodb.MongoClientSettings; +import com.navercorp.pinpoint.bootstrap.interceptor.AroundInterceptor; +import com.navercorp.pinpoint.bootstrap.logging.PluginLogManager; +import com.navercorp.pinpoint.bootstrap.logging.PluginLogger; +import com.navercorp.pinpoint.common.util.ArrayArgumentUtils; +import com.navercorp.pinpoint.plugin.mongo.HostListAccessor; +import com.navercorp.pinpoint.plugin.mongo.MongoUtil; + +import java.util.List; + +public class MongoClientV4ConstructorInterceptor implements AroundInterceptor { + private final PluginLogger logger = PluginLogManager.getLogger(this.getClass()); + private final boolean isDebug = logger.isDebugEnabled(); + + public MongoClientV4ConstructorInterceptor() { + } + + @Override + public void before(Object target, Object[] args) { + } + + @Override + public void after(Object target, Object[] args, Object result, Throwable throwable) { + if (isDebug) { + logger.afterInterceptor(target, args, result, throwable); + } + + if (throwable != null) { + return; + } + + if (Boolean.FALSE == (target instanceof HostListAccessor)) { + return; + } + + try { + // over 4.2 + final MongoClientSettings mongoClientSettings = ArrayArgumentUtils.getArgument(args, 0, MongoClientSettings.class); + if (mongoClientSettings != null) { + List list = MongoUtil.getHostList(mongoClientSettings); + setHostList(target, list); + return; + } + } catch (Throwable th) { + if (logger.isWarnEnabled()) { + logger.warn("AFTER error. Caused:{}", th.getMessage(), th); + } + } + } + + private void setHostList(Object target, List hostList) { + ((HostListAccessor) target)._$PINPOINT$_setHostList(hostList); + if (isDebug) { + logger.debug("Set hostList={}", hostList); + } + } +} \ No newline at end of file