From d6036c00396a23736d36f7e6015ab6c4432d0872 Mon Sep 17 00:00:00 2001 From: emeroad Date: Mon, 20 Jun 2022 19:56:21 +0900 Subject: [PATCH] [#8945] End of support for elasticsearch bbose client plugin --- .../resources/profiles/local/pinpoint.config | 10 - .../profiles/release/pinpoint.config | 10 - .../pinpoint/common/trace/ServiceType.java | 4 +- .../common/trace/ServiceTypeProperty.java | 1 + doc/modules.md | 1 - plugins-it/elasticsearch-bbose-it/pom.xml | 92 ------ .../plugin/elasticsearchbboss/Car.java | 63 ---- .../ElasticsearchExecutor569IT.java | 38 --- .../ElasticsearchExecutorIT.java | 294 ------------------ .../elasticsearchbboss/car-mapping.xml | 43 --- plugins-it/pom.xml | 1 - plugins/assembly/pom.xml | 5 - plugins/elasticsearch-bboss/README.md | 155 --------- plugins/elasticsearch-bboss/mysql.png | Bin 120963 -> 0 bytes plugins/elasticsearch-bboss/pom.xml | 25 -- plugins/elasticsearch-bboss/problem1.png | Bin 117478 -> 0 bytes .../ClusterVersionAccessor.java | 23 -- .../ElasticsearchConstants.java | 42 --- .../ElasticsearchCustomMethodFilter.java | 44 --- .../ElasticsearchMetadataProvider.java | 43 --- .../ElasticsearchPlugin.java | 208 ------------- .../ElasticsearchPluginConfig.java | 100 ------ .../RestSeachExecutorMethodFilter.java | 34 -- ...ticsearchExecutorOperationInterceptor.java | 230 -------------- ...rchOperationAsyncInitiatorInterceptor.java | 75 ----- .../ElasticsearchOperationInterceptor.java | 55 ---- .../ParallelWorkerConstructorInterceptor.java | 43 --- .../ParallelWorkerRunInterceptor.java | 44 --- ...p.pinpoint.bootstrap.plugin.ProfilerPlugin | 1 - ...inpoint.common.trace.TraceMetadataProvider | 1 - .../ElasticsearchCustomMethodFilterTest.java | 49 --- .../ElasticsearchMetadataProviderTest.java | 36 --- .../ElasticsearchPluginConfigTest.java | 42 --- .../ElasticsearchPluginTest.java | 157 ---------- .../RestSeachExecutorMethodFilterTest.java | 43 --- ...earchExecutorOperationInterceptorTest.java | 93 ------ ...perationAsyncInitiatorInterceptorTest.java | 70 ----- ...ElasticsearchOperationInterceptorTest.java | 98 ------ ...SliceWorkerConstructorInterceptorTest.java | 67 ---- .../SliceWorkerRunInterceptorTest.java | 89 ------ plugins/pom.xml | 1 - 41 files changed, 3 insertions(+), 2427 deletions(-) delete mode 100644 plugins-it/elasticsearch-bbose-it/pom.xml delete mode 100644 plugins-it/elasticsearch-bbose-it/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/Car.java delete mode 100644 plugins-it/elasticsearch-bbose-it/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchExecutor569IT.java delete mode 100644 plugins-it/elasticsearch-bbose-it/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchExecutorIT.java delete mode 100644 plugins-it/elasticsearch-bbose-it/src/test/resources/elasticsearchbboss/car-mapping.xml delete mode 100644 plugins/elasticsearch-bboss/README.md delete mode 100644 plugins/elasticsearch-bboss/mysql.png delete mode 100644 plugins/elasticsearch-bboss/pom.xml delete mode 100644 plugins/elasticsearch-bboss/problem1.png delete mode 100644 plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ClusterVersionAccessor.java delete mode 100644 plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchConstants.java delete mode 100644 plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchCustomMethodFilter.java delete mode 100644 plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchMetadataProvider.java delete mode 100644 plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchPlugin.java delete mode 100644 plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchPluginConfig.java delete mode 100644 plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/RestSeachExecutorMethodFilter.java delete mode 100644 plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchExecutorOperationInterceptor.java delete mode 100644 plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchOperationAsyncInitiatorInterceptor.java delete mode 100644 plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchOperationInterceptor.java delete mode 100644 plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ParallelWorkerConstructorInterceptor.java delete mode 100644 plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ParallelWorkerRunInterceptor.java delete mode 100644 plugins/elasticsearch-bboss/src/main/resources/META-INF/services/com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin delete mode 100644 plugins/elasticsearch-bboss/src/main/resources/META-INF/services/com.navercorp.pinpoint.common.trace.TraceMetadataProvider delete mode 100644 plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchCustomMethodFilterTest.java delete mode 100644 plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchMetadataProviderTest.java delete mode 100644 plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchPluginConfigTest.java delete mode 100644 plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchPluginTest.java delete mode 100644 plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/RestSeachExecutorMethodFilterTest.java delete mode 100644 plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchExecutorOperationInterceptorTest.java delete mode 100644 plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchOperationAsyncInitiatorInterceptorTest.java delete mode 100644 plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchOperationInterceptorTest.java delete mode 100644 plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/SliceWorkerConstructorInterceptorTest.java delete mode 100644 plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/SliceWorkerRunInterceptorTest.java diff --git a/agent/src/main/resources/profiles/local/pinpoint.config b/agent/src/main/resources/profiles/local/pinpoint.config index 60e894899588..9a4383c45ebf 100644 --- a/agent/src/main/resources/profiles/local/pinpoint.config +++ b/agent/src/main/resources/profiles/local/pinpoint.config @@ -1196,16 +1196,6 @@ profiler.elasticsearch.enabled=true profiler.elasticsearch.recordDsl=true profiler.elasticsearch.recordESVersion=false -########################################################### -# ElasticsearchBBoss -########################################################### -profiler.elasticsearchbboss.enabled=true -profiler.elasticsearchbboss.recordResult=false -profiler.elasticsearchbboss.recordArgs=true -profiler.elasticsearchbboss.recordDsl=true -profiler.elasticsearchbboss.recordESVersion=true -profiler.elasticsearchbboss.recordResponseHandlerClass=false -profiler.elasticsearchbboss.maxDslSize=50000 ########################################################### # JDK CompletableFuture diff --git a/agent/src/main/resources/profiles/release/pinpoint.config b/agent/src/main/resources/profiles/release/pinpoint.config index 403dbe7cd760..3070c489e9fc 100644 --- a/agent/src/main/resources/profiles/release/pinpoint.config +++ b/agent/src/main/resources/profiles/release/pinpoint.config @@ -1219,16 +1219,6 @@ profiler.elasticsearch.enabled=true profiler.elasticsearch.recordDsl=true profiler.elasticsearch.recordESVersion=false -########################################################### -# ElasticsearchBBoss -########################################################### -profiler.elasticsearchbboss.enabled=true -profiler.elasticsearchbboss.recordResult=false -profiler.elasticsearchbboss.recordArgs=true -profiler.elasticsearchbboss.recordDsl=true -profiler.elasticsearchbboss.recordESVersion=true -profiler.elasticsearchbboss.recordResponseHandlerClass=false -profiler.elasticsearchbboss.maxDslSize=50000 ########################################################### # JDK CompletableFuture diff --git a/commons/src/main/java/com/navercorp/pinpoint/common/trace/ServiceType.java b/commons/src/main/java/com/navercorp/pinpoint/common/trace/ServiceType.java index dc41d09ee7d6..2e3dada8fc2e 100644 --- a/commons/src/main/java/com/navercorp/pinpoint/common/trace/ServiceType.java +++ b/commons/src/main/java/com/navercorp/pinpoint/common/trace/ServiceType.java @@ -231,8 +231,8 @@ * 9160GRPC * 9161GRPC_INTERNAL * 9162GRPC_SERVER_INTERNAL - * 9201ElasticsearchBBoss - * 9202ElasticsearchBBossExecutor + * 9201ElasticsearchBBoss @Deprecated + * 9202ElasticsearchBBossExecutor @Deprecated * 9203ELASTICSEARCH * 9204ELASTICSEARCH_HIGHLEVEL_CLIENT * 9205ELASTICSEARCH8 diff --git a/commons/src/main/java/com/navercorp/pinpoint/common/trace/ServiceTypeProperty.java b/commons/src/main/java/com/navercorp/pinpoint/common/trace/ServiceTypeProperty.java index 2bfdbe2a1f66..7d54ed6257b4 100644 --- a/commons/src/main/java/com/navercorp/pinpoint/common/trace/ServiceTypeProperty.java +++ b/commons/src/main/java/com/navercorp/pinpoint/common/trace/ServiceTypeProperty.java @@ -24,5 +24,6 @@ public enum ServiceTypeProperty { QUEUE, RECORD_STATISTICS, INCLUDE_DESTINATION_ID, + @Deprecated ALIAS } diff --git a/doc/modules.md b/doc/modules.md index b8b9e46fbbd9..7ed3e5645b19 100644 --- a/doc/modules.md +++ b/doc/modules.md @@ -55,7 +55,6 @@ | Jackson Databind | jackson-databind | 2.0.6 | 2.12.3 | | | | MariaDB Connector/J | mariadb-java-client | 1.3.0 | 2.7.2 | | | | MongoDB Java Driver | mongodb-driver | 3.0.0 | 3.12.8 | | | -| [Elasticsearch](https://github.com/pinpoint-apm/pinpoint/tree/master/plugins/elasticsearch-bboss) | bboss-elasticsearch-rest-jdbc | 5.6.9 | 5.8.2 | | | | Elasticsearch | elasticsearch-rest-high-level-client | 6.0.0 | 6.8.15 | | | | Datastax Java Driver | cassandra-driver-core | 2.0.10 | 3.11.0 | | | | Druid | druid | 1.0.0 | 1.2.6 | | | diff --git a/plugins-it/elasticsearch-bbose-it/pom.xml b/plugins-it/elasticsearch-bbose-it/pom.xml deleted file mode 100644 index c28502e3b663..000000000000 --- a/plugins-it/elasticsearch-bbose-it/pom.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - 4.0.0 - - com.navercorp.pinpoint - pinpoint-plugins-it - 2.5.0-SNAPSHOT - - - pinpoint-elasticsearch-bboss-plugin-it - - jar - - - 1.8 - ${env.JAVA_8_HOME} - - - - - com.bbossgroups.plugins - bboss-elasticsearch-rest-jdbc - 5.6.9 - test - - - org.slf4j - slf4j-log4j12 - - - com.bbossgroups - bboss-persistent - - - - - org.elasticsearch.client - elasticsearch-rest-high-level-client - 7.3.0 - test - - - pl.allegro.tech - embedded-elasticsearch - 2.10.0 - test - - - - com.navercorp.pinpoint - pinpoint-plugin-it-utils - ${project.version} - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - true - - - - org.apache.maven.plugins - maven-failsafe-plugin - - ${env.JAVA_8_HOME}/bin/java - - - - - diff --git a/plugins-it/elasticsearch-bbose-it/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/Car.java b/plugins-it/elasticsearch-bbose-it/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/Car.java deleted file mode 100644 index bf0c1fd0ce76..000000000000 --- a/plugins-it/elasticsearch-bbose-it/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/Car.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2018 Naver Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance,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.elasticsearchbboss; - -import com.frameworkset.orm.annotation.ESId; - -/** - *

Description: Car PO along to cars indice mapping struction

- * - * @author yinbp[yin-bp@163.com] - */ -public class Car { - @ESId(persistent = true, readSet = true) - private String carId; - private String manufacturer; - private String model; - private String description; - - public String getManufacturer() { - return manufacturer; - } - - public void setManufacturer(String manufacturer) { - this.manufacturer = manufacturer; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getCarId() { - return carId; - } - - public void setCarId(String carId) { - this.carId = carId; - } -} \ No newline at end of file diff --git a/plugins-it/elasticsearch-bbose-it/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchExecutor569IT.java b/plugins-it/elasticsearch-bbose-it/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchExecutor569IT.java deleted file mode 100644 index b4da18352703..000000000000 --- a/plugins-it/elasticsearch-bbose-it/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchExecutor569IT.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss; - - -import com.navercorp.pinpoint.pluginit.utils.AgentPath; -import com.navercorp.pinpoint.test.plugin.Dependency; -import com.navercorp.pinpoint.test.plugin.JvmVersion; -import com.navercorp.pinpoint.test.plugin.PinpointAgent; -import com.navercorp.pinpoint.test.plugin.PinpointPluginTestSuite; -import org.junit.runner.RunWith; - - -/** - * @author yinbp[yin-bp@163.com] - */ - -@RunWith(PinpointPluginTestSuite.class) -@PinpointAgent(AgentPath.PATH) -@Dependency({"com.bbossgroups.plugins:bboss-elasticsearch-rest-jdbc:[5.6.9,5.8.3)", - "pl.allegro.tech:embedded-elasticsearch:2.8.0"}) -@JvmVersion(8) -public class ElasticsearchExecutor569IT extends ElasticsearchExecutorIT { - - -} \ No newline at end of file diff --git a/plugins-it/elasticsearch-bbose-it/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchExecutorIT.java b/plugins-it/elasticsearch-bbose-it/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchExecutorIT.java deleted file mode 100644 index 01bdee27ed41..000000000000 --- a/plugins-it/elasticsearch-bbose-it/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchExecutorIT.java +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss; - - -import com.navercorp.pinpoint.bootstrap.plugin.test.PluginTestVerifier; -import com.navercorp.pinpoint.bootstrap.plugin.test.PluginTestVerifierHolder; -import com.navercorp.pinpoint.test.plugin.shared.AfterSharedClass; -import com.navercorp.pinpoint.test.plugin.shared.BeforeSharedClass; - -import org.frameworkset.elasticsearch.ElasticSearchHelper; -import org.frameworkset.elasticsearch.client.ClientInterface; -import org.frameworkset.elasticsearch.entity.ESDatas; -import org.junit.BeforeClass; -import org.junit.Test; -import pl.allegro.tech.embeddedelasticsearch.EmbeddedElastic; -import pl.allegro.tech.embeddedelasticsearch.PopularProperties; - -import java.io.IOException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static com.navercorp.pinpoint.bootstrap.plugin.test.Expectations.event; -import static java.util.concurrent.TimeUnit.MINUTES; - - -/** - * @author yinbp[yin-bp@163.com] - */ - - -public abstract class ElasticsearchExecutorIT { - private static EmbeddedElastic embeddedElastic; - private static ClientInterface clientInterface; - private static ClientInterface configRestClientInterface; - private String serviceType = "ElasticsearchBBoss"; - - @BeforeSharedClass - public static void sharedSetup() throws IOException, InterruptedException { - // BBoss support elasticsearch 1.x,2.x,5.x,6.x,7.x,+ - // and we use elasticsearch 6.3.0 to test the Elasticsearch BBoss client plugin. - - // BBoss connect elasticsearch use localhost and http port 9200 default. - -// Here is a bboss web demo base spring boot and elasticsearch 5.x,6.x,7.x,8.x: -// https://github.com/bbossgroups/es_bboss_web -// -// Here is a quickstart tutorial: -// https://esdoc.bbossgroups.com/#/quickstart - embeddedElastic = EmbeddedElastic.builder() - .withElasticVersion("6.8.0") - .withSetting(PopularProperties.HTTP_PORT, 9200) - .withEsJavaOpts("-Xms128m -Xmx512m") - .withStartTimeout(2, MINUTES) - .build() - .start(); - } - - @AfterSharedClass - public static void sharedTearDown() { - if (embeddedElastic != null) { - embeddedElastic.stop(); - } - } - - @BeforeClass - public static void setUpBeforeClass() throws Exception { - //Build a elasticsearch client instance(Return a single instance but multithreaded security) with dsl config file elasticsearchbboss/car-mapping.xml. - configRestClientInterface = ElasticSearchHelper.getConfigRestClientUtil("elasticsearchbboss/car-mapping.xml"); - // Create an elasticsearch client interface instance with a specific Elasticserch datasource name and with dsl config file elasticsearchbboss/car-mapping.xml. - //configRestClientInterface = ElasticSearchHelper.getConfigRestClientUtil("esdatasourceName","elasticsearchbboss/car-mapping.xml"); - - //build a elasticsearch client instance(Return a single instance but multithreaded security) for do not need dsl or direct dsl operations. - clientInterface = ElasticSearchHelper.getRestClientUtil(); - // Create an elasticsearch client interface instance with a specific Elasticserch datasource name - //clientInterface = ElasticSearchHelper.getRestClientUtil("esdatasourceName"); - - // A multidatasource spring boot demo: https://github.com/bbossgroups/es_bboss_web/tree/multiesdatasource - } - - @Test - public void indiceCreate() throws Exception { - PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance(); - Class configClass = Class.forName("org.frameworkset.elasticsearch.client.ConfigRestClientUtil"); - Method createIndiceMappingMethod = configClass.getMethod("createIndiceMapping", String.class, String.class); - try { - configRestClientInterface.createIndiceMapping("cars", "createCarIndice"); - - } catch (Exception ignored) { - - } - - verifier.verifyTrace(event(serviceType, createIndiceMappingMethod)); - - - } - - @Test - public void indiceDrop() throws Exception { - PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance(); - Class configClass = Class.forName("org.frameworkset.elasticsearch.client.ConfigRestClientUtil"); - Method dropIndiceMethod = configClass.getMethod("dropIndice", String.class); - try { - configRestClientInterface.dropIndice("cars"); - } catch (Exception ignored) { - - } - - verifier.verifyTrace(event(serviceType, dropIndiceMethod)); - - - } - - @Test - public void indiceExist() throws Exception { - - //Validate the indice twitter exist or not - PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance(); - - //Validate the indice cars exist or not - boolean existIndice = clientInterface.existIndice("cars"); - -// Assert.assertEquals(existIndice,true); - Class restClientUtilClass = Class.forName("org.frameworkset.elasticsearch.client.RestClientUtil"); - Method existIndiceMethod = restClientUtilClass.getMethod("existIndice", String.class); - verifier.verifyTrace(event(serviceType, existIndiceMethod)); - - } - - @Test - public void addDocument() throws Exception { - Class restClientUtilClass = Class.forName("org.frameworkset.elasticsearch.client.RestClientUtil"); - Method addDocumentMethod = restClientUtilClass.getDeclaredMethod("addDocument", String.class, String.class, - Object.class, String.class); - PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance(); - Car car = new Car(); - //set carid as the index documentid - car.setCarId("1"); - car.setManufacturer("Volkswagenwerk"); - car.setModel("passat1.8T"); - car.setDescription("passat 2018"); - - //add data to cars/car indice. Use force refresh when test case,but product mode does not use forcerefresh - // and should use: - // clientInterface.addDocument("cars",car). - try { - clientInterface.addDocument("cars", "car", car, "refresh=true"); - } catch (Exception ignored) { - - } - - verifier.verifyTrace(event(serviceType, addDocumentMethod)); - - } - - @Test - public void getDocument() throws Exception { - PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance(); - //get car by document id "1" - try { - Car car = clientInterface.getDocument("cars", "1", Car.class); - } catch (Exception ignored) { - - } - - - Class restClientUtilClass = Class.forName("org.frameworkset.elasticsearch.client.RestClientUtil"); - Method getDocumentMethod = restClientUtilClass.getDeclaredMethod("getDocument", String.class, - String.class, Class.class); - verifier.verifyTrace(event(serviceType, getDocumentMethod)); - } - - @Test - public void bulkDocuments() throws Exception { - PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance(); - List cars = new ArrayList<>(); - Car car = new Car(); - //set carid as the index documentid - car.setCarId("2"); - car.setManufacturer("Volkswagenwerk"); - car.setModel("passat1.8T"); - car.setDescription("passat 2018"); - cars.add(car); - car = new Car(); - //set carid as the index documentid - car.setCarId("3"); - car.setManufacturer("Volkswagenwerk"); - car.setModel("2.0T"); - car.setDescription("passat 2019"); - cars.add(car); - //add datas to cars/car indice.Use force refresh when test case,but product mode does not use forcerefresh - // and should use: - // clientInterface.addDocuments("cars",cars); - - try { - clientInterface.addDocuments("cars", "car", cars, "refresh=true"); - } catch (Exception ignored) { - - } - Class restClientUtilClass = Class.forName("org.frameworkset.elasticsearch.client.RestClientUtil"); - Method addDocumentsMethod = restClientUtilClass.getDeclaredMethod("addDocuments", String.class, String.class, - List.class, String.class); - verifier.verifyTrace(event(serviceType, addDocumentsMethod)); - - } - - - @Test - public void searchDocuments() throws Exception { - PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance(); - try { - Map condition = new HashMap<>(); - //set description as search condition - condition.put("description", "passat"); - - //search data to cars/car indice that match condition with a simple query dsl named testSearch defined in elasticsearchbboss/car-mapping.xml. - ESDatas carESDatas = configRestClientInterface.searchList("cars/_search", "testSearch", condition, Car.class); - //datas that match condition - List cars = carESDatas.getDatas(); - //totalsize that match condition - long totalSize = carESDatas.getTotalSize(); - } catch (Exception ignored) { - - } - - Class configClass = Class.forName("org.frameworkset.elasticsearch.client.ConfigRestClientUtil"); - Method searchListMethod = configClass.getDeclaredMethod("searchList", String.class, - String.class, Map.class, Class.class); - verifier.verifyTrace(event(serviceType, searchListMethod)); - } - - @Test - public void updateDocument() throws Exception { - PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance(); - Car car = new Car(); - //set carid as the index documentid - car.setCarId("1"); - car.setManufacturer("Volkswagenwerk"); - // Update model from 1.4T to 1.0T - car.setModel("1.0T"); - car.setDescription("passat 2017"); - // Update data on cars/car indice that document id is 1. - // Use force refresh when test case,but product mode does not use forcerefresh - // and should use: - // clientInterface.updateDocument("cars","1",car); - - try { - clientInterface.updateDocument("cars", "car", "1", car, "refresh=true"); - } catch (Exception ignored) { - - } - Class restClientUtilClass = Class.forName("org.frameworkset.elasticsearch.client.RestClientUtil"); - Method updateDocumentMethod = restClientUtilClass.getDeclaredMethod("updateDocument", String.class, String.class, - Object.class, Object.class, String.class); - verifier.verifyTrace(event(serviceType, updateDocumentMethod)); - - } - - @Test - public void deleteDocument() throws Exception { - PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance(); - // Delete data on cars/car indice that document id is 1. - // Use force refresh when test case,but product mode does not use forcerefresh - // and should use: - // clientInterface.deleteDocument("cars","1"); - - try { - clientInterface.deleteDocument("cars", "car", "1", "refresh=true"); - } catch (Exception ignored) { - - } - Class restClientUtilClass = Class.forName("org.frameworkset.elasticsearch.client.RestClientUtil"); - Method deleteDocument = restClientUtilClass.getDeclaredMethod("deleteDocument", String.class, String.class, - String.class, String.class); - verifier.verifyTrace(event(serviceType, deleteDocument)); - - } - -} \ No newline at end of file diff --git a/plugins-it/elasticsearch-bbose-it/src/test/resources/elasticsearchbboss/car-mapping.xml b/plugins-it/elasticsearch-bbose-it/src/test/resources/elasticsearchbboss/car-mapping.xml deleted file mode 100644 index b64824e9954b..000000000000 --- a/plugins-it/elasticsearch-bbose-it/src/test/resources/elasticsearchbboss/car-mapping.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/plugins-it/pom.xml b/plugins-it/pom.xml index 2994ed751722..54fe7173aaec 100644 --- a/plugins-it/pom.xml +++ b/plugins-it/pom.xml @@ -38,7 +38,6 @@ cxf-it druid-it dubbo-it - elasticsearch-bbose-it elasticsearch-it elasticsearch-7.16-it fastjson-it diff --git a/plugins/assembly/pom.xml b/plugins/assembly/pom.xml index 8030604b2e1e..28b70a9d6355 100644 --- a/plugins/assembly/pom.xml +++ b/plugins/assembly/pom.xml @@ -335,11 +335,6 @@ com.navercorp.pinpoint pinpoint-openwhisk-plugin ${project.version} - - - com.navercorp.pinpoint - pinpoint-elasticsearch-bboss-plugin - ${project.version} com.navercorp.pinpoint diff --git a/plugins/elasticsearch-bboss/README.md b/plugins/elasticsearch-bboss/README.md deleted file mode 100644 index d1aba2ce1fca..000000000000 --- a/plugins/elasticsearch-bboss/README.md +++ /dev/null @@ -1,155 +0,0 @@ -ElasticSearch is an Open Source (Apache 2), Distributed, RESTful, Search Engine built on top of Apache Lucene. - -This agent plugin is worked with elasticsearch bboss highlevel rest client [BBoss][bs]. - -[BBoss][bs] is a best Java Highlevel Rest client for [ElasticSearch][es]. - - -If there is trace in the context, add context trace as span event. - -Some work pictures of this plugin: -Elasticsearch Bboss work in tomcat -![GitHub Logo](https://oscimg.oschina.net/oscnet/a6aa8b7e84db0437dd6cbff88bdf1160fab.jpg) -![GitHub Logo](https://oscimg.oschina.net/oscnet/9665c0376579bbf1ca6093c1a0cf11c6c45.jpg) -Async parallel slice scoll query -![GitHub Logo](https://oscimg.oschina.net/oscnet/2ad63bcb0ad2de30a2cc13aa5f8a8ea86b4.jpg) -Simple indice and indice type exist query -![GitHub Logo](https://oscimg.oschina.net/oscnet/4c2e63e159786c28909ca2a003c8ee28432.jpg) -dsl query -![GitHub Logo](https://oscimg.oschina.net/oscnet/90fe224aee8b52c50b22fdfe0860658324d.jpg) - - -How to use Elasticsearch BBoss. - -First add the maven dependency of BBoss to your pom.xml: - -```xml - - com.bbossgroups.plugins - bboss-elasticsearch-rest-jdbc - 5.6.9 - -``` - -If it's a spring boot project, you can replace the Maven coordinates above with the following Maven coordinates: - -```xml - - com.bbossgroups.plugins - bboss-elasticsearch-spring-boot-starter - 5.6.9 - -``` - - - -Next, add the Elasticsearch addresses to the application.properties file under the project resource directory, and create a new one if the file does not exist: - -```properties -elasticsearch.rest.hostNames=10.21.20.168:9200 - -#Cluster addresses are separated by commas - -#elasticsearch.rest.hostNames=10.180.211.27:9200,10.180.211.28:9200,10.180.211.29:9200 -``` - - - -And last create a jsp file named testElasticsearch.jsp : - -```jsp -<%@ page import="org.frameworkset.elasticsearch.ElasticSearchHelper" %> -<%@ page import="org.frameworkset.elasticsearch.client.ClientInterface" %> -<%@ page import="org.frameworkset.elasticsearch.entity.ESDatas" %> -<%@ page import="org.frameworkset.elasticsearch.scroll.ScrollHandler" %> -<%@ page import="java.util.List" %> -<%@ page import="java.util.Map" %> -<%@ page import="org.frameworkset.elasticsearch.scroll.HandlerInfo" %> -<%@ page language="java" pageEncoding="UTF-8"%> - -<% - ClientInterface clientUtil = ElasticSearchHelper.getRestClientUtil(); - //get elasticsearch cluster state - String result = clientUtil.executeHttp("_cluster/state?pretty",ClientInterface.HTTP_GET); - - //check indice twitter and index type tweet exist or not. - boolean exist1 = clientUtil.existIndiceType("twitter","tweet"); - out.println("twitter tweet type exist:"+exist1); - //check indice twitter exist or not - exist1 = clientUtil.existIndice("twitter"); - out.println("twitter exist:"+exist1); - //count documents in indice twitter - long count = clientUtil.countAll("demo"); - out.println(count); - - //Get All documents of indice twitter,DEFAULT_FETCHSIZE is 5000 - ESDatas esDatas = clientUtil.searchAll("demo", Map.class); - - //Get All documents of indice twitter,Set fetchsize to 10000, Using ScrollHandler to process each batch of datas. - clientUtil.searchAll("demo",10000,new ScrollHandler() { - public void handle(ESDatas esDatas, HandlerInfo handlerInfo) throws Exception { - List dataList = esDatas.getDatas(); - System.out.println("TotalSize:"+esDatas.getTotalSize()); - if(dataList != null) { - System.out.println("dataList.size:" + dataList.size()); - } - else - { - System.out.println("dataList.size:0"); - } - //do something other such as do a db query. - //SQLExecutor.queryList(Map.class,"select * from td_sm_user"); - } - },Map.class); - //Use slice parallel scoll query all documents of indice twitter by 2 thread tasks. DEFAULT_FETCHSIZE is 5000 - //You can also use ScrollHandler to process each batch of datas on your own. - clientUtil.searchAllParallel("demo", Map.class,2); - //use query dsl to execute scroll search and use ScrollHandler to parallel handle each page scroll search result. - clientUtil.scrollParallel("demo/_search","{ \"size\":10,\"query\": {\"match_all\": {}},\"sort\": [\"_doc\"]}","1m",Map.class,new ScrollHandler() { - public void handle(ESDatas esDatas, HandlerInfo handlerInfo) throws Exception { - List dataList = esDatas.getDatas(); - System.out.println("TotalSize:"+esDatas.getTotalSize()); - if(dataList != null) { - System.out.println("dataList.size:" + dataList.size()); - } - else - { - System.out.println("dataList.size:0"); - } - //do something other such as do a db query. - //SQLExecutor.queryList(Map.class,"select * from td_sm_user"); - } - }); - out.println("searchAllParallel:ok"); -%> - -``` - -Put the file into the web project that has been connected to pinpoint, run the program, log on pinpoint to see the execution effect of bboss plugin. - -For more BBoss Elasticsearch Highlevel Rest Client detail see : - https://esdoc.bbossgroups.com/#/README - -github sourcecode: -https://github.com/bbossgroups/bboss-elasticsearch - -Fast import bboss to your project: -1. For Spring boot project see -https://esdoc.bbossgroups.com/#/spring-booter-with-bboss -2. For normal maven or gradle project see -https://esdoc.bbossgroups.com/#/common-project-with-bboss - -ElasticsearchBBoss Demo - -[eshelloworld-booter][booter] - -[eshelloword-spring-boot-starter][springbooter] - -[booter]: https://github.com/bbossgroups/elasticsearch-example -[springbooter]: https://github.com/bbossgroups/elasticsearch-springboot-example - -[bs]: https://github.com/bbossgroups/bboss-elasticsearch -[es]: http://www.elasticsearch.org -[DocumentCRUDTest]: https://github.com/bbossgroups/elasticsearch-example/blob/master/src/test/java/org/bboss/elasticsearchtest/crud/DocumentCRUDTest.java - - diff --git a/plugins/elasticsearch-bboss/mysql.png b/plugins/elasticsearch-bboss/mysql.png deleted file mode 100644 index 1b5daba3b451545f5ae4b8d9d68bcca85cbab2bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120963 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 d|0A8SxMAX`b_D)nUlwFJdODZ1$!Bfv{XY`PC` - - 4.0.0 - - com.navercorp.pinpoint - pinpoint-plugins - 2.5.0-SNAPSHOT - - pinpoint-elasticsearch-bboss-plugin - pinpoint-elasticsearch-bboss-plugin - jar - - - - - - - com.navercorp.pinpoint - pinpoint-bootstrap-core - provided - - - - diff --git a/plugins/elasticsearch-bboss/problem1.png b/plugins/elasticsearch-bboss/problem1.png deleted file mode 100644 index e12ec385f097eed138cccaf99e8181f869a81bb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117478 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�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 z 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

-5G(xa1@9Nuov!G!FYRE8tpAm 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 diff --git a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ClusterVersionAccessor.java b/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ClusterVersionAccessor.java deleted file mode 100644 index 535d96ce7075..000000000000 --- a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ClusterVersionAccessor.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss; - -/** - * @author yinbp[yin-bp@163.com] - */ -public interface ClusterVersionAccessor { - void _$PINPOINT$_setClusterVersion(String clusterVersion); - String _$PINPOINT$_getClusterVersion(); -} diff --git a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchConstants.java b/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchConstants.java deleted file mode 100644 index bf56ebb15821..000000000000 --- a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchConstants.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss; - -import com.navercorp.pinpoint.common.trace.*; - -import static com.navercorp.pinpoint.common.trace.ServiceTypeProperty.*; - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ElasticsearchConstants { - public static final AnnotationKey ARGS_ANNOTATION_KEY = AnnotationKeyFactory.of(171, "es.args", AnnotationKeyProperty.VIEW_IN_RECORD_SET); - public static final int maxDslSize = 50000; - public static final ServiceType ELASTICSEARCH = ServiceTypeFactory.of(9201, "ElasticsearchBBoss"); - - public static final AnnotationKey ARGS_URL_ANNOTATION_KEY = AnnotationKeyFactory.of(172, "es.url", AnnotationKeyProperty.VIEW_IN_RECORD_SET); - public static final AnnotationKey ARGS_DSL_ANNOTATION_KEY = AnnotationKeyFactory.of(173, "es.dsl", AnnotationKeyProperty.VIEW_IN_RECORD_SET); - public static final AnnotationKey ARGS_ACTION_ANNOTATION_KEY = AnnotationKeyFactory.of(174, "es.action", AnnotationKeyProperty.VIEW_IN_RECORD_SET); - public static final AnnotationKey ARGS_RESPONSEHANDLE_ANNOTATION_KEY = AnnotationKeyFactory.of(175, "es.responseHandle", AnnotationKeyProperty.VIEW_IN_RECORD_SET); - public static final AnnotationKey ARGS_VERSION_ANNOTATION_KEY = AnnotationKeyFactory.of(176, "es.version", AnnotationKeyProperty.VIEW_IN_RECORD_SET); - public static final ServiceType ELASTICSEARCH_EXECUTOR = ServiceTypeFactory.of(9202, "ElasticsearchBBossExecutor", ALIAS); - public static final String ELASTICSEARCH_SCOPE = "ElasticsearchBBoss_SCOPE"; - public static final String ELASTICSEARCH_Parallel_SCOPE = "ElasticsearchBBoss_Parallel_SCOPE"; - public static final String ELASTICSEARCH_EXECUTOR_SCOPE = "ElasticsearchBBossExecutor_SCOPE"; - public static final String[] clazzInterceptors = new String[]{ - "org.frameworkset.elasticsearch.client.ConfigRestClientUtil", - "org.frameworkset.elasticsearch.client.RestClientUtil" - }; -} diff --git a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchCustomMethodFilter.java b/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchCustomMethodFilter.java deleted file mode 100644 index 2e3dea07022f..000000000000 --- a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchCustomMethodFilter.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss; - - -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentMethod; -import com.navercorp.pinpoint.bootstrap.instrument.MethodFilter; - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ElasticsearchCustomMethodFilter implements MethodFilter { - - public ElasticsearchCustomMethodFilter( ) { - } - - @Override - public boolean accept(InstrumentMethod method) { - - - if(method.getName().equals("runSliceTask") - || method.getName().equals("runScrollTask") - || method.getName().equals("runSliceScrollTask") ){ //parallel handle method - return REJECT; - } - else - { - return ACCEPT; - } - } - -} diff --git a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchMetadataProvider.java b/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchMetadataProvider.java deleted file mode 100644 index e15b1a6db773..000000000000 --- a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchMetadataProvider.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss; - -import com.navercorp.pinpoint.common.trace.TraceMetadataProvider; -import com.navercorp.pinpoint.common.trace.TraceMetadataSetupContext; - - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ElasticsearchMetadataProvider implements TraceMetadataProvider { - - @Override - public void setup(TraceMetadataSetupContext context) { - - if(context == null) - return; - context.addServiceType(ElasticsearchConstants.ELASTICSEARCH); - context.addServiceType(ElasticsearchConstants.ELASTICSEARCH_EXECUTOR); - - context.addAnnotationKey(ElasticsearchConstants.ARGS_VERSION_ANNOTATION_KEY);//Elasticsearch version info - context.addAnnotationKey(ElasticsearchConstants.ARGS_URL_ANNOTATION_KEY);//HTTP request URL parameters - context.addAnnotationKey(ElasticsearchConstants.ARGS_DSL_ANNOTATION_KEY);//HTTP DSL body conent - context.addAnnotationKey(ElasticsearchConstants.ARGS_ACTION_ANNOTATION_KEY);//HTTP Elasticsearch restful ACTION method - context.addAnnotationKey(ElasticsearchConstants.ARGS_RESPONSEHANDLE_ANNOTATION_KEY);//HTTP Response handler class name, - context.addAnnotationKey(ElasticsearchConstants.ARGS_ANNOTATION_KEY);//Elasticsearch client api arguments - - } - -} diff --git a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchPlugin.java b/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchPlugin.java deleted file mode 100644 index 152dfae78bf4..000000000000 --- a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchPlugin.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss; - -import com.navercorp.pinpoint.bootstrap.async.AsyncContextAccessor; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentException; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentMethod; -import com.navercorp.pinpoint.bootstrap.instrument.Instrumentor; -import com.navercorp.pinpoint.bootstrap.instrument.transformer.TransformCallback; -import com.navercorp.pinpoint.bootstrap.instrument.transformer.TransformTemplate; -import com.navercorp.pinpoint.bootstrap.instrument.transformer.TransformTemplateAware; -import com.navercorp.pinpoint.bootstrap.interceptor.scope.ExecutionPolicy; -import com.navercorp.pinpoint.bootstrap.interceptor.scope.InterceptorScope; -import com.navercorp.pinpoint.bootstrap.logging.PLogger; -import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; -import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin; -import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPluginSetupContext; -import com.navercorp.pinpoint.plugin.elasticsearchbboss.interceptor.*; - -import java.security.ProtectionDomain; -import java.util.List; - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ElasticsearchPlugin implements ProfilerPlugin, TransformTemplateAware { - - - - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private TransformTemplate transformTemplate; - private static RestSeachExecutorMethodFilter restSeachExecutorMethodFilter = new RestSeachExecutorMethodFilter(); - static final ElasticsearchCustomMethodFilter elasticsearchCustomMethodFilter = new ElasticsearchCustomMethodFilter(); - @Override - public void setup(ProfilerPluginSetupContext context) { - if (context == null) { - return; - } - - final ElasticsearchPluginConfig elasticsearchPluginConfig = new ElasticsearchPluginConfig(context.getConfig()); - if (logger.isInfoEnabled()) { - logger.info("ElasticsearchPlugin config:{}", elasticsearchPluginConfig); - } - - if (!elasticsearchPluginConfig.isEnabled()) { - return; - } - addElasticsearchInterceptors(); - addElasticsearchExecutorInterceptors(); - this.addParallelElasticsearchInterceptors(); - } - - - // implementations - private void addElasticsearchInterceptors() { - transformTemplate.transform("org.frameworkset.elasticsearch.client.ConfigRestClientUtil",ConfigRestClientTransformCallback.class); - transformTemplate.transform("org.frameworkset.elasticsearch.client.RestClientUtil",RestClientTransformCallback.class); - - } - - // implementations - private void addElasticsearchExecutorInterceptors() { - - transformTemplate.transform("org.frameworkset.elasticsearch.client.RestSearchExecutor", RestSearchExecutorTransformCallback.class); - - - } - - // implementations - private void addParallelElasticsearchInterceptors() { - - transformTemplate.transform("org.frameworkset.elasticsearch.SliceRunTask", ParallelRunTaskTransformCallback.class); - transformTemplate.transform("org.frameworkset.elasticsearch.scroll.thread.ScrollTask", ParallelRunTaskTransformCallback.class); - } - - @Override - public void setTransformTemplate(TransformTemplate transformTemplate) { - this.transformTemplate = transformTemplate; - } - - public static class RestSearchExecutorTransformCallback implements TransformCallback{ - @Override - public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, - String className, Class classBeingRedefined, ProtectionDomain protectionDomain, - byte[] classfileBuffer) throws InstrumentException { - - final InstrumentClass target = instrumentor.getInstrumentClass(loader, className, classfileBuffer); - target.addField(ClusterVersionAccessor.class); - final List methodsToTrace = target.getDeclaredMethods(restSeachExecutorMethodFilter); - for (InstrumentMethod methodToTrace : methodsToTrace) { - - methodToTrace.addScopedInterceptor(ElasticsearchExecutorOperationInterceptor.class, ElasticsearchConstants.ELASTICSEARCH_EXECUTOR_SCOPE, ExecutionPolicy.ALWAYS); - } - - return target.toBytecode(); - } - - } - - public static class ParallelRunTaskTransformCallback implements TransformCallback{ - @Override - public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, - String className, Class classBeingRedefined, ProtectionDomain protectionDomain, - byte[] classfileBuffer) throws InstrumentException { - - final InstrumentClass target = instrumentor.getInstrumentClass(loader, className, classfileBuffer); - InterceptorScope scope = instrumentor.getInterceptorScope(ElasticsearchConstants.ELASTICSEARCH_Parallel_SCOPE); - - target.addField(AsyncContextAccessor.class); - - InstrumentMethod constructor = target.getConstructor("org.frameworkset.elasticsearch.client.RestClientUtil","int", - "java.lang.String","java.lang.String", "java.lang.String", "java.lang.Class", - "org.frameworkset.elasticsearch.scroll.ParallelSliceScrollResult","org.frameworkset.elasticsearch.serial.SerialContext" ); - if(constructor != null) - constructor.addScopedInterceptor(ParallelWorkerConstructorInterceptor.class, scope, ExecutionPolicy.INTERNAL); - - constructor = target.getConstructor("org.frameworkset.elasticsearch.scroll.ScrollHandler","org.frameworkset.elasticsearch.entity.ESDatas", - "org.frameworkset.elasticsearch.scroll.HandlerInfo"); - if(constructor != null) - constructor.addScopedInterceptor(ParallelWorkerConstructorInterceptor.class, scope, ExecutionPolicy.INTERNAL); - - constructor = target.getConstructor("org.frameworkset.elasticsearch.scroll.ScrollHandler","org.frameworkset.elasticsearch.entity.ESDatas", - "org.frameworkset.elasticsearch.scroll.HandlerInfo","org.frameworkset.elasticsearch.scroll.SliceScrollResultInf"); - if(constructor != null) - constructor.addScopedInterceptor(ParallelWorkerConstructorInterceptor.class, scope, ExecutionPolicy.INTERNAL); - InstrumentMethod run = target.getDeclaredMethod("run"); - run.addInterceptor(ParallelWorkerRunInterceptor.class); - - return target.toBytecode(); - } - } - - public static abstract class BaseClientTransformCallback implements TransformCallback{ - protected byte[] toBytecode(InstrumentClass target) throws InstrumentException{ - List methodsToTrace = target.getDeclaredMethods(elasticsearchCustomMethodFilter); - for (InstrumentMethod methodToTrace : methodsToTrace) { - methodToTrace.addScopedInterceptor(ElasticsearchOperationInterceptor.class, ElasticsearchConstants.ELASTICSEARCH_SCOPE, ExecutionPolicy.BOUNDARY); - } - - InstrumentMethod runSliceTaskMethod = target.getDeclaredMethod("runSliceTask", - "int","java.lang.String","java.lang.String","java.lang.String","java.lang.Class" - ,"org.frameworkset.elasticsearch.scroll.ParallelSliceScrollResult" - ,"java.util.concurrent.ExecutorService" - ,"java.util.List" - ,"org.frameworkset.elasticsearch.serial.SerialContext" ); - - if(runSliceTaskMethod != null) { - runSliceTaskMethod.addScopedInterceptor(ElasticsearchOperationAsyncInitiatorInterceptor.class, ElasticsearchConstants.ELASTICSEARCH_Parallel_SCOPE); - } - - InstrumentMethod runScrollTask = target.getDeclaredMethod("runScrollTask", - "java.util.List","org.frameworkset.elasticsearch.scroll.ScrollHandler", - "org.frameworkset.elasticsearch.entity.ESDatas","org.frameworkset.elasticsearch.scroll.HandlerInfo" - ,"java.util.concurrent.ExecutorService" ); - - if(runScrollTask != null) { - runScrollTask.addScopedInterceptor(ElasticsearchOperationAsyncInitiatorInterceptor.class, ElasticsearchConstants.ELASTICSEARCH_Parallel_SCOPE); - } - - InstrumentMethod runSliceScrollTask = target.getDeclaredMethod("runSliceScrollTask", - "java.util.List","org.frameworkset.elasticsearch.scroll.ScrollHandler", - "org.frameworkset.elasticsearch.entity.ESDatas","org.frameworkset.elasticsearch.scroll.HandlerInfo" - ,"org.frameworkset.elasticsearch.scroll.SliceScrollResultInf" - ,"java.util.concurrent.ExecutorService" ); - - if(runSliceScrollTask != null) { - runSliceScrollTask.addScopedInterceptor(ElasticsearchOperationAsyncInitiatorInterceptor.class, ElasticsearchConstants.ELASTICSEARCH_Parallel_SCOPE); - } - - return target.toBytecode(); - } - } - public static class RestClientTransformCallback extends BaseClientTransformCallback{ - @Override - public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, - String className, Class classBeingRedefined, ProtectionDomain protectionDomain, - byte[] classfileBuffer) throws InstrumentException { - - final InstrumentClass target = instrumentor.getInstrumentClass(loader, "org.frameworkset.elasticsearch.client.RestClientUtil", classfileBuffer); - return toBytecode(target); - } - } - - public static class ConfigRestClientTransformCallback extends BaseClientTransformCallback{ - @Override - public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, - String className, Class classBeingRedefined, ProtectionDomain protectionDomain, - byte[] classfileBuffer) throws InstrumentException { - - final InstrumentClass target = instrumentor.getInstrumentClass(loader, "org.frameworkset.elasticsearch.client.ConfigRestClientUtil", classfileBuffer); - return toBytecode(target); - } - } -} diff --git a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchPluginConfig.java b/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchPluginConfig.java deleted file mode 100644 index dd126d61123f..000000000000 --- a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchPluginConfig.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss; - -import com.navercorp.pinpoint.bootstrap.config.ProfilerConfig; - - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ElasticsearchPluginConfig { - - private final boolean elasticsearchEnabled; - private final boolean recordResult ; - private final boolean recordArgs ; - private final boolean recordDsl ; - private final boolean recordESVersion ; - private final boolean recordResponseHandler ; - - private final int maxDslSize; - public boolean isEnabled() { - return elasticsearchEnabled; - } - - - - public ElasticsearchPluginConfig(ProfilerConfig profilerConfig) { - if(profilerConfig != null) { - this.elasticsearchEnabled = profilerConfig.readBoolean("profiler.elasticsearchbboss.enabled", true); - recordResult = profilerConfig.readBoolean("profiler.elasticsearchbboss.recordResult",false); - recordArgs = profilerConfig.readBoolean("profiler.elasticsearchbboss.recordArgs",true); - recordDsl = profilerConfig.readBoolean("profiler.elasticsearchbboss.recordDsl",true); - maxDslSize = profilerConfig.readInt("profiler.elasticsearchbboss.maxDslSize",ElasticsearchConstants.maxDslSize); - recordResponseHandler = profilerConfig.readBoolean("profiler.elasticsearchbboss.recordResponseHandlerClass",false); - recordESVersion = profilerConfig.readBoolean("profiler.elasticsearchbboss.recordESVersion",true); - - } - else { - this.elasticsearchEnabled = false; - recordResult = false; - recordArgs = true; - recordDsl = true; - maxDslSize = ElasticsearchConstants.maxDslSize; - recordResponseHandler = false; - recordESVersion = true; - } - } - - - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("ElasticsearchBBossPluginConfig{"); - sb.append("elasticsearchBBossEnabled=").append(elasticsearchEnabled); - sb.append(",recordResult=").append(recordResult); - sb.append(",recordArgs=").append(recordArgs); - sb.append(",recordDsl=").append(recordDsl); - sb.append(",maxDslSize=").append(maxDslSize); - sb.append(",recordResponseHandler=").append(recordResponseHandler); - sb.append(",recordESVersion=").append(recordESVersion); - sb.append('}'); - return sb.toString(); - } - - public boolean isRecordResult() { - return recordResult; - } - - public boolean isRecordArgs() { - return recordArgs; - } - - public boolean isRecordDsl() { - return recordDsl; - } - - public boolean isRecordESVersion() { - return recordESVersion; - } - - public boolean isRecordResponseHandler() { - return recordResponseHandler; - } - - public int getMaxDslSize() { - return maxDslSize; - } -} diff --git a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/RestSeachExecutorMethodFilter.java b/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/RestSeachExecutorMethodFilter.java deleted file mode 100644 index 24f505aa4f48..000000000000 --- a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/RestSeachExecutorMethodFilter.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss; - -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentMethod; -import com.navercorp.pinpoint.bootstrap.instrument.MethodFilter; - -/** - * @author yinbp[yin-bp@163.com] - */ -public class RestSeachExecutorMethodFilter implements MethodFilter { - @Override - public boolean accept(InstrumentMethod instrumentMethod) { - String name = instrumentMethod.getName(); - return name.equals("execute") || name.equals("executeHttp") - || name.equals("executeSimpleRequest") - || name.equals("executeRequest") - || name.equals("discoverHost") - ; - - } -} diff --git a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchExecutorOperationInterceptor.java b/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchExecutorOperationInterceptor.java deleted file mode 100644 index da1c13c65d59..000000000000 --- a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchExecutorOperationInterceptor.java +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss.interceptor; - -import com.navercorp.pinpoint.bootstrap.context.MethodDescriptor; -import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; -import com.navercorp.pinpoint.bootstrap.context.TraceContext; -import com.navercorp.pinpoint.bootstrap.interceptor.SpanEventSimpleAroundInterceptorForPlugin; -import com.navercorp.pinpoint.common.trace.AnnotationKey; -import com.navercorp.pinpoint.common.util.ArrayUtils; -import com.navercorp.pinpoint.plugin.elasticsearchbboss.ClusterVersionAccessor; -import com.navercorp.pinpoint.plugin.elasticsearchbboss.ElasticsearchConstants; -import com.navercorp.pinpoint.plugin.elasticsearchbboss.ElasticsearchPluginConfig; - -import java.lang.reflect.Method; - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ElasticsearchExecutorOperationInterceptor extends SpanEventSimpleAroundInterceptorForPlugin { - private final boolean recordResult; - private final boolean recordArgs; - private final boolean recordDsl; - private final boolean recordResponseHandler; - private final boolean recordESVersion; - private volatile Method getClusterVersionInfo; - private final int maxDslSize; - - public ElasticsearchExecutorOperationInterceptor(TraceContext context, MethodDescriptor descriptor) { - super(context, descriptor); - final ElasticsearchPluginConfig elasticsearchPluginConfig = new ElasticsearchPluginConfig(context.getProfilerConfig()); - recordResult = elasticsearchPluginConfig.isRecordResult(); - recordArgs = elasticsearchPluginConfig.isRecordArgs(); - recordDsl = elasticsearchPluginConfig.isRecordDsl(); - maxDslSize = elasticsearchPluginConfig.getMaxDslSize(); - recordResponseHandler = elasticsearchPluginConfig.isRecordResponseHandler(); - recordESVersion = elasticsearchPluginConfig.isRecordESVersion(); - - - } - - @Override - public void before(Object target, Object[] args) { - super.before(target, args); - - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - - - super.after(target, args, result, throwable); - } - - - @Override - protected void doInBeforeTrace(SpanEventRecorder recorder, Object target, Object[] args) { - - recorder.recordServiceType(ElasticsearchConstants.ELASTICSEARCH_EXECUTOR); - } - - private String getClusterVersionInfo(Object target) { - if (target instanceof ClusterVersionAccessor) { - ClusterVersionAccessor clusterVersionAccessor = (ClusterVersionAccessor) target; - if (clusterVersionAccessor._$PINPOINT$_getClusterVersion() != null) { - return clusterVersionAccessor._$PINPOINT$_getClusterVersion(); - } else { - synchronized (target.getClass()) { - if (clusterVersionAccessor._$PINPOINT$_getClusterVersion() == null) { - try { - Method _getClusterVersionInfo = target.getClass().getMethod("getClusterVersionInfo"); - String version = (String) _getClusterVersionInfo.invoke(target); - if (version == null) { - clusterVersionAccessor._$PINPOINT$_setClusterVersion("UNKNOWN_VERSION"); - } else { - clusterVersionAccessor._$PINPOINT$_setClusterVersion(version); - } - - } catch (Exception e) { - clusterVersionAccessor._$PINPOINT$_setClusterVersion("UNKNOWN_VERSION"); - } - } - - } - return clusterVersionAccessor._$PINPOINT$_getClusterVersion(); - } - } else { - if (getClusterVersionInfo == null) { - synchronized (target.getClass()) { - if (getClusterVersionInfo == null) { - try { - getClusterVersionInfo = target.getClass().getMethod("getClusterVersionInfo"); - } catch (Exception ignored) { - } - } - } - } - if (getClusterVersionInfo != null) { - try { - String version = (String) getClusterVersionInfo.invoke(target); - if (version == null) { - return "UNKNOWN_VERSION"; - } else { - return version; - } - - } catch (Exception e) { - return "UNKNOWN_VERSION"; - } - } else { - return "UNKNOWN_VERSION"; - } - } - } - - private String getEndPoint(Object[] args) { - String url = (String) args[0]; - //http://xxx:9200/ - int idx = url.indexOf("://"); - String endPoint = null; - if (idx > 0) { - int sub = url.indexOf('/', idx + 3); - if (sub > 0) { - endPoint = url.substring(idx + 3, sub); - } else { - endPoint = url.substring(idx + 3); - } - } else { - endPoint = "Unknown"; - } - return endPoint; - - } - - @Override - protected void doInAfterTrace(SpanEventRecorder recorder, Object target, Object[] args, Object result, - Throwable throwable) { - - recorder.recordApi(getMethodDescriptor()); - recorder.recordDestinationId("ElasticsearchBBoss"); - if (ArrayUtils.hasLength(args)) { - recorder.recordEndPoint(getEndPoint(args)); - } - if (recordESVersion) { - // Each target(ClientInstance) has a specific version of Elasticsearch Datasource in one application, - // and each Elasticsearch Datasource retains its corresponding Elasticsearch cluster version information - // such as Elasticsearch 1.x or 2.x or 5.x or 6.x or 7.x or 8.x and so on. - // so we should get elasticsearchClusterVersionInfo in target everytime. - String elasticsearchClusterVersionInfo = getClusterVersionInfo(target); - recorder.recordAttribute(ElasticsearchConstants.ARGS_VERSION_ANNOTATION_KEY, elasticsearchClusterVersionInfo);//record elasticsearch version and cluster name. - } - recorder.recordException(throwable); - if (recordArgs && ArrayUtils.hasLength(args)) { - recordAttributes(recorder, methodDescriptor, args); - } - - if (recordResult) { - recorder.recordAttribute(AnnotationKey.RETURN_DATA, result); - } - } - - - private void recordAttributes(SpanEventRecorder recorder, MethodDescriptor methodDescriptor, Object[] args) { - if (methodDescriptor.getMethodName().equals("execute")) { - - recorder.recordAttribute(ElasticsearchConstants.ARGS_URL_ANNOTATION_KEY, args[0]); - if (recordDsl) { - recorder.recordAttribute(ElasticsearchConstants.ARGS_DSL_ANNOTATION_KEY, chunkDsl((String) args[1])); - } - recorder.recordAttribute(ElasticsearchConstants.ARGS_ACTION_ANNOTATION_KEY, "POST"); - if (recordResponseHandler) { - recorder.recordAttribute(ElasticsearchConstants.ARGS_RESPONSEHANDLE_ANNOTATION_KEY, args[2]); - } - } else if (methodDescriptor.getMethodName().equals("executeHttp")) { - recorder.recordAttribute(ElasticsearchConstants.ARGS_URL_ANNOTATION_KEY, args[0]); - if (recordDsl) { - recorder.recordAttribute(ElasticsearchConstants.ARGS_DSL_ANNOTATION_KEY, chunkDsl((String) args[1])); - } - recorder.recordAttribute(ElasticsearchConstants.ARGS_ACTION_ANNOTATION_KEY, args[2]); - if (recordResponseHandler) { - recorder.recordAttribute(ElasticsearchConstants.ARGS_RESPONSEHANDLE_ANNOTATION_KEY, args[3]); - } - } else if (methodDescriptor.getMethodName().equals("executeSimpleRequest")) { - recorder.recordAttribute(ElasticsearchConstants.ARGS_URL_ANNOTATION_KEY, args[0]); - if (recordDsl) { - recorder.recordAttribute(ElasticsearchConstants.ARGS_DSL_ANNOTATION_KEY, chunkDsl((String) args[1])); - } - recorder.recordAttribute(ElasticsearchConstants.ARGS_ACTION_ANNOTATION_KEY, "POST"); - if (recordResponseHandler) { - recorder.recordAttribute(ElasticsearchConstants.ARGS_RESPONSEHANDLE_ANNOTATION_KEY, args[2]); - } - - } else if (methodDescriptor.getMethodName().equals("executeRequest")) { - recorder.recordAttribute(ElasticsearchConstants.ARGS_URL_ANNOTATION_KEY, args[0]); - if (recordDsl) { - recorder.recordAttribute(ElasticsearchConstants.ARGS_DSL_ANNOTATION_KEY, chunkDsl((String) args[1])); - } - recorder.recordAttribute(ElasticsearchConstants.ARGS_ACTION_ANNOTATION_KEY, args[2]); - if (recordResponseHandler) { - recorder.recordAttribute(ElasticsearchConstants.ARGS_RESPONSEHANDLE_ANNOTATION_KEY, args[3]); - } - - } - } - - private String chunkDsl(String dsl) { - if (dsl == null) { - return null; - } - if (dsl.length() <= maxDslSize || maxDslSize <= 0) { - return dsl; - } else { - return dsl.substring(0, maxDslSize); - } - } - - -} diff --git a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchOperationAsyncInitiatorInterceptor.java b/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchOperationAsyncInitiatorInterceptor.java deleted file mode 100644 index c5e6c274cdaf..000000000000 --- a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchOperationAsyncInitiatorInterceptor.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss.interceptor; - -import com.navercorp.pinpoint.bootstrap.context.*; -import com.navercorp.pinpoint.bootstrap.interceptor.AroundInterceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.scope.InterceptorScope; -import com.navercorp.pinpoint.plugin.elasticsearchbboss.ElasticsearchConstants; - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ElasticsearchOperationAsyncInitiatorInterceptor implements AroundInterceptor { - - private final MethodDescriptor descriptor; - private final TraceContext traceContext; - private final InterceptorScope scope; - - public ElasticsearchOperationAsyncInitiatorInterceptor(TraceContext traceContext, MethodDescriptor descriptor, InterceptorScope scope) { - this.traceContext = traceContext; - this.descriptor = descriptor; - this.scope = scope; - } - - @Override - public void before(Object target, Object arg[]) { - Trace trace = traceContext.currentTraceObject(); - if (trace == null) { - return; - } - - SpanEventRecorder recorder = trace.traceBlockBegin(); - recorder.recordServiceType(ElasticsearchConstants.ELASTICSEARCH); - recorder.recordApi(descriptor); - - // To trace async invocations, you have to create AsyncContext like below, automatically attaching it to the current span event. - AsyncContext asyncContext = recorder.recordNextAsyncContext(); - - // Finally, you have to pass the AsyncContext to the thread which handles the async task. - // How to do this depends on the target library implementation. - // - // In this sample, we set the id as scope invocation attachment like below to pass it to the constructor interceptor of TargetClass12_Worker which has run() method that handles the async task. - // Then the constructor interceptor will get the attached AsyncContext and set to the initializing TargetClass12_Worker object. - scope.getCurrentInvocation().setAttachment(asyncContext); - } - - @Override - public void after(Object target, Object arg[], Object result, Throwable throwable) { - Trace trace = traceContext.currentTraceObject(); - if (trace == null) { - return; - } - - try { - if (throwable != null) { - SpanEventRecorder recorder = trace.currentSpanEventRecorder(); - recorder.recordException(throwable); - } - } finally { - trace.traceBlockEnd(); - } - } -} diff --git a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchOperationInterceptor.java b/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchOperationInterceptor.java deleted file mode 100644 index 62a2a18ebf34..000000000000 --- a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchOperationInterceptor.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss.interceptor; - -import com.navercorp.pinpoint.bootstrap.context.MethodDescriptor; -import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; -import com.navercorp.pinpoint.bootstrap.context.TraceContext; -import com.navercorp.pinpoint.bootstrap.interceptor.SpanEventSimpleAroundInterceptorForPlugin; -import com.navercorp.pinpoint.common.trace.AnnotationKey; -import com.navercorp.pinpoint.plugin.elasticsearchbboss.ElasticsearchConstants; - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ElasticsearchOperationInterceptor extends SpanEventSimpleAroundInterceptorForPlugin { - protected boolean recordResult = false; - protected boolean recordArgs = false; - public ElasticsearchOperationInterceptor(TraceContext context, MethodDescriptor descriptor) { - super(context, descriptor); - recordResult = this.getTraceContext().getProfilerConfig().readBoolean("profiler.elasticsearchbboss.recordResult",false); - recordArgs = this.getTraceContext().getProfilerConfig().readBoolean("profiler.elasticsearchbboss.recordArgs",true); - } - - @Override - protected void doInBeforeTrace(SpanEventRecorder recorder, Object target, Object[] args) { - - } - - - protected void doInAfterTrace(SpanEventRecorder recorder, Object target, Object[] args, Object result, Throwable throwable) { - recorder.recordServiceType(ElasticsearchConstants.ELASTICSEARCH); - recorder.recordException(throwable); - recorder.recordApi(getMethodDescriptor()); -// if (recordArgs && ArrayUtils.hasLength(args)) { -//// recorder.recordAttribute(ElasticsearchConstants.ARGS_ANNOTATION_KEY,convertParams(args)); -// } - - if (recordResult) { - recorder.recordAttribute(AnnotationKey.RETURN_DATA,result); - } - } - -} diff --git a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ParallelWorkerConstructorInterceptor.java b/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ParallelWorkerConstructorInterceptor.java deleted file mode 100644 index e5e983d581c2..000000000000 --- a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ParallelWorkerConstructorInterceptor.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss.interceptor; - -import com.navercorp.pinpoint.bootstrap.async.AsyncContextAccessor; -import com.navercorp.pinpoint.bootstrap.context.AsyncContext; -import com.navercorp.pinpoint.bootstrap.interceptor.AroundInterceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.annotation.IgnoreMethod; -import com.navercorp.pinpoint.bootstrap.interceptor.scope.InterceptorScope; - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ParallelWorkerConstructorInterceptor implements AroundInterceptor { - private final InterceptorScope scope; - - public ParallelWorkerConstructorInterceptor(InterceptorScope scope) { - this.scope = scope; - } - - @IgnoreMethod - public void before(Object target, Object arg[]) { - - } - - - public void after(Object target, Object arg[], Object result, Throwable throwable) { - AsyncContext asyncContext = (AsyncContext) scope.getCurrentInvocation().getAttachment(); - ((AsyncContextAccessor) target)._$PINPOINT$_setAsyncContext(asyncContext); - } -} diff --git a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ParallelWorkerRunInterceptor.java b/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ParallelWorkerRunInterceptor.java deleted file mode 100644 index 342ec10a64b2..000000000000 --- a/plugins/elasticsearch-bboss/src/main/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ParallelWorkerRunInterceptor.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss.interceptor; - -import com.navercorp.pinpoint.bootstrap.context.AsyncContext; -import com.navercorp.pinpoint.bootstrap.context.MethodDescriptor; -import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; -import com.navercorp.pinpoint.bootstrap.context.TraceContext; -import com.navercorp.pinpoint.bootstrap.interceptor.AsyncContextSpanEventSimpleAroundInterceptor; -import com.navercorp.pinpoint.plugin.elasticsearchbboss.ElasticsearchConstants; - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ParallelWorkerRunInterceptor extends AsyncContextSpanEventSimpleAroundInterceptor { - - public ParallelWorkerRunInterceptor(TraceContext traceContext, MethodDescriptor methodDescriptor) { - super(traceContext, methodDescriptor); - } - - @Override - protected void doInBeforeTrace(SpanEventRecorder recorder, AsyncContext asyncContext, Object target, Object[] args) { - // do nothing - } - - @Override - protected void doInAfterTrace(SpanEventRecorder recorder, Object target, Object[] args, Object result, Throwable throwable) { - recorder.recordServiceType(ElasticsearchConstants.ELASTICSEARCH); - recorder.recordApi(methodDescriptor); - recorder.recordException(throwable); - } -} diff --git a/plugins/elasticsearch-bboss/src/main/resources/META-INF/services/com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin b/plugins/elasticsearch-bboss/src/main/resources/META-INF/services/com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin deleted file mode 100644 index b96bd9989d54..000000000000 --- a/plugins/elasticsearch-bboss/src/main/resources/META-INF/services/com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin +++ /dev/null @@ -1 +0,0 @@ -com.navercorp.pinpoint.plugin.elasticsearchbboss.ElasticsearchPlugin \ No newline at end of file diff --git a/plugins/elasticsearch-bboss/src/main/resources/META-INF/services/com.navercorp.pinpoint.common.trace.TraceMetadataProvider b/plugins/elasticsearch-bboss/src/main/resources/META-INF/services/com.navercorp.pinpoint.common.trace.TraceMetadataProvider deleted file mode 100644 index 8087c5eb8354..000000000000 --- a/plugins/elasticsearch-bboss/src/main/resources/META-INF/services/com.navercorp.pinpoint.common.trace.TraceMetadataProvider +++ /dev/null @@ -1 +0,0 @@ -com.navercorp.pinpoint.plugin.elasticsearchbboss.ElasticsearchMetadataProvider \ No newline at end of file diff --git a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchCustomMethodFilterTest.java b/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchCustomMethodFilterTest.java deleted file mode 100644 index 5bd2c6cb4c8d..000000000000 --- a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchCustomMethodFilterTest.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss; - - -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentMethod; -import org.junit.Assert; -import org.junit.Test; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ElasticsearchCustomMethodFilterTest { - - @Test - public void testReject() { - InstrumentMethod instrumentMethod = mock(InstrumentMethod.class); - when(instrumentMethod.getName()).thenReturn("runSliceTask"); - ElasticsearchCustomMethodFilter elasticsearchCustomMethodFilter = new ElasticsearchCustomMethodFilter(); - Assert.assertFalse(elasticsearchCustomMethodFilter.accept(instrumentMethod)); - } - - @Test - public void testAccept() { - ElasticsearchCustomMethodFilter elasticsearchCustomMethodFilter = new ElasticsearchCustomMethodFilter(); - InstrumentMethod instrumentMethod = mock(InstrumentMethod.class); - when(instrumentMethod.getName()).thenReturn("execute"); - Assert.assertTrue(elasticsearchCustomMethodFilter.accept(instrumentMethod)); - instrumentMethod = mock(InstrumentMethod.class); - when(instrumentMethod.getName()).thenReturn("runSliceTask"); - Assert.assertFalse(elasticsearchCustomMethodFilter.accept(instrumentMethod)); - } - -} diff --git a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchMetadataProviderTest.java b/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchMetadataProviderTest.java deleted file mode 100644 index bb5d7a267247..000000000000 --- a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchMetadataProviderTest.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss; - -import com.navercorp.pinpoint.common.trace.TraceMetadataSetupContext; -import org.junit.Test; - -import static org.mockito.Mockito.mock; - - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ElasticsearchMetadataProviderTest{ - - @Test - public void setup() { - ElasticsearchMetadataProvider elasticsearchMetadataProvider = new ElasticsearchMetadataProvider(); - TraceMetadataSetupContext traceMetadataSetupContext = mock( TraceMetadataSetupContext.class); - elasticsearchMetadataProvider.setup(traceMetadataSetupContext); - - } - -} diff --git a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchPluginConfigTest.java b/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchPluginConfigTest.java deleted file mode 100644 index 8412ed255555..000000000000 --- a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchPluginConfigTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ElasticsearchPluginConfigTest { - private ElasticsearchPluginConfig elasticsearchPluginConfig = null; - - @Before - public void setUp() { - elasticsearchPluginConfig = new ElasticsearchPluginConfig(null); - } - - @Test - public void testIsEnabled() { - Assert.assertFalse(elasticsearchPluginConfig.isEnabled()); - } - - @Test - public void testToString() { - Assert.assertNotNull(elasticsearchPluginConfig.toString()); - } -} diff --git a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchPluginTest.java b/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchPluginTest.java deleted file mode 100644 index 178522610a4a..000000000000 --- a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/ElasticsearchPluginTest.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss; - -import com.navercorp.pinpoint.bootstrap.config.DefaultProfilerConfig; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentContext; -import com.navercorp.pinpoint.bootstrap.instrument.Instrumentor; -import com.navercorp.pinpoint.bootstrap.instrument.transformer.TransformTemplate; -import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPluginSetupContext; -import org.junit.Assert; -import org.junit.Test; - -import java.security.ProtectionDomain; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ElasticsearchPluginTest { - private ElasticsearchPlugin elasticsearchPlugin = new ElasticsearchPlugin(); - - @Test - public void testSetup() { - ProfilerPluginSetupContext profilerPluginSetupContext = mock(ProfilerPluginSetupContext.class); - when(profilerPluginSetupContext.getConfig()).thenReturn(new DefaultProfilerConfig()); - InstrumentContext instrumentContext = mock(InstrumentContext.class); - elasticsearchPlugin.setTransformTemplate(new TransformTemplate(instrumentContext)); - try { - elasticsearchPlugin.setup(profilerPluginSetupContext); - } - catch (Exception e){ - e.printStackTrace(); - } - } - @Test - public void setTransformTemplate() { - InstrumentContext instrumentContext = mock(InstrumentContext.class); - elasticsearchPlugin.setTransformTemplate(new TransformTemplate(instrumentContext)); - } - - - @Test - public void testBaseClientTransformCallback() { - ElasticsearchPlugin.BaseClientTransformCallback baseClientTransformCallback = mock(ElasticsearchPlugin.BaseClientTransformCallback.class); - InstrumentClass instrumentClass = mock(InstrumentClass.class); - try { - baseClientTransformCallback.toBytecode(instrumentClass); - } - catch (Exception e){ - e.printStackTrace(); - Assert.assertNotNull(e); - } - } - - @Test - public void testConfigRestClientTransformCallback() { - ElasticsearchPlugin.ConfigRestClientTransformCallback configRestClientTransformCallback = mock(ElasticsearchPlugin.ConfigRestClientTransformCallback.class); - Instrumentor instrumentor = mock(Instrumentor.class); - Class classBeingRedefined = this.getClass(); - byte[] classfileBuffer = new byte[]{}; - ProtectionDomain protectionDomain = mock(ProtectionDomain.class); - try { - configRestClientTransformCallback.doInTransform( instrumentor, this.getClass().getClassLoader(), - "org.frameworkset.elasticsearch.client.ConfigRestClientUtil", classBeingRedefined, protectionDomain, - classfileBuffer) ; - } - catch (Exception e){ - e.printStackTrace(); - Assert.assertNotNull(e); - } - } - - @Test - public void testRestClientTransformCallback() { - ElasticsearchPlugin.RestClientTransformCallback restClientTransformCallback = mock(ElasticsearchPlugin.RestClientTransformCallback.class); - Instrumentor instrumentor = mock(Instrumentor.class); - Class classBeingRedefined = this.getClass(); - byte[] classfileBuffer = new byte[]{}; - ProtectionDomain protectionDomain = mock(ProtectionDomain.class); - try { - restClientTransformCallback.doInTransform( instrumentor, this.getClass().getClassLoader(), - "org.frameworkset.elasticsearch.client.RestClientUtil", classBeingRedefined, protectionDomain, - classfileBuffer) ; - } - catch (Exception e){ - e.printStackTrace(); - Assert.assertNotNull(e); - } - } - @Test - public void testRestSearchExecutorTransformCallback() { - ElasticsearchPlugin.RestSearchExecutorTransformCallback restSearchExecutorTransformCallback = mock(ElasticsearchPlugin.RestSearchExecutorTransformCallback.class); - Instrumentor instrumentor = mock(Instrumentor.class); - Class classBeingRedefined = this.getClass(); - byte[] classfileBuffer = new byte[]{}; - ProtectionDomain protectionDomain = mock(ProtectionDomain.class); - try { - restSearchExecutorTransformCallback.doInTransform( instrumentor, this.getClass().getClassLoader(), - "org.frameworkset.elasticsearch.client.RestSearchExecutor", classBeingRedefined, protectionDomain, - classfileBuffer) ; - } - catch (Exception e){ - e.printStackTrace(); - Assert.assertNotNull(e); - } - } - @Test - public void testSliceRunTaskTransformCallback() { - ElasticsearchPlugin.ParallelRunTaskTransformCallback sliceRunTaskTransformCallback = mock(ElasticsearchPlugin.ParallelRunTaskTransformCallback.class); - Instrumentor instrumentor = mock(Instrumentor.class); - Class classBeingRedefined = this.getClass(); - byte[] classfileBuffer = new byte[]{}; - ProtectionDomain protectionDomain = mock(ProtectionDomain.class); - try { - sliceRunTaskTransformCallback.doInTransform( instrumentor, this.getClass().getClassLoader(), - "org.frameworkset.elasticsearch.SliceRunTask", classBeingRedefined, protectionDomain, - classfileBuffer) ; - } - catch (Exception e){ - e.printStackTrace(); - Assert.assertNotNull(e); - } - } - - @Test - public void testScrollRunTaskTransformCallback() { - ElasticsearchPlugin.ParallelRunTaskTransformCallback sliceRunTaskTransformCallback = mock(ElasticsearchPlugin.ParallelRunTaskTransformCallback.class); - Instrumentor instrumentor = mock(Instrumentor.class); - Class classBeingRedefined = this.getClass(); - byte[] classfileBuffer = new byte[]{}; - ProtectionDomain protectionDomain = mock(ProtectionDomain.class); - try { - sliceRunTaskTransformCallback.doInTransform( instrumentor, this.getClass().getClassLoader(), - "org.frameworkset.elasticsearch.scroll.thread.ScrollTask", classBeingRedefined, protectionDomain, - classfileBuffer) ; - } - catch (Exception e){ - e.printStackTrace(); - Assert.assertNotNull(e); - } - } -} diff --git a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/RestSeachExecutorMethodFilterTest.java b/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/RestSeachExecutorMethodFilterTest.java deleted file mode 100644 index b474c2191370..000000000000 --- a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/RestSeachExecutorMethodFilterTest.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss; - -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentMethod; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - - -/** - * @author yinbp[yin-bp@163.com] - */ -public class RestSeachExecutorMethodFilterTest { - private RestSeachExecutorMethodFilter restSeachExecutorMethodFilter; - - @Before - public void setUp() { - restSeachExecutorMethodFilter = new RestSeachExecutorMethodFilter(); - } - - @Test - public void testAccept() { - InstrumentMethod instrumentMethod = mock(InstrumentMethod.class); - when(instrumentMethod.getName()).thenReturn("executeSimpleRequest"); - Assert.assertTrue(restSeachExecutorMethodFilter.accept(instrumentMethod)); - } -} diff --git a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchExecutorOperationInterceptorTest.java b/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchExecutorOperationInterceptorTest.java deleted file mode 100644 index c8e2c551cf71..000000000000 --- a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchExecutorOperationInterceptorTest.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss.interceptor; - -import com.navercorp.pinpoint.bootstrap.config.ProfilerConfig; -import com.navercorp.pinpoint.bootstrap.context.MethodDescriptor; -import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; -import com.navercorp.pinpoint.bootstrap.context.TraceContext; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ElasticsearchExecutorOperationInterceptorTest { - ElasticsearchExecutorOperationInterceptor elasticsearchExecutorOperationInterceptor = null; - Object[] args = null; - @Before - public void setUp(){ - MethodDescriptor methodDescriptor = mock(MethodDescriptor.class); - when(methodDescriptor.getClassName()).thenReturn(" "); - TraceContext traceContext = mock(TraceContext.class); - ProfilerConfig profilerConfig = mock(ProfilerConfig.class); - when(traceContext.getProfilerConfig()).thenReturn(profilerConfig); - - elasticsearchExecutorOperationInterceptor = new ElasticsearchExecutorOperationInterceptor( traceContext, methodDescriptor); - args = new Object[]{"1","2","3","4","5","6"}; - } - @Test - public void testConstruction(){ - MethodDescriptor methodDescriptor = mock(MethodDescriptor.class); - when(methodDescriptor.getClassName()).thenReturn(" "); - TraceContext traceContext = mock(TraceContext.class); - ProfilerConfig profilerConfig = mock(ProfilerConfig.class); - when(traceContext.getProfilerConfig()).thenReturn(profilerConfig); - ElasticsearchExecutorOperationInterceptor elasticsearchExecutorOperationInterceptor = new ElasticsearchExecutorOperationInterceptor(traceContext, methodDescriptor); - } - @Test - public void testBefore(){ - - - try { - elasticsearchExecutorOperationInterceptor.before(new Object(),args); - } - catch (Exception e){ - Assert.assertTrue(e instanceof NullPointerException); - } - - } - - @Test - public void testAfter(){ - - - try { - elasticsearchExecutorOperationInterceptor.after(new Object(), args, "ok", null); - } - catch (Exception e){ - Assert.assertTrue(e instanceof NullPointerException); - } - } - - - - @Test - public void doInEventAfterTrace() { - try { - elasticsearchExecutorOperationInterceptor.doInAfterTrace(mock(SpanEventRecorder.class),new Object(),args,"aa",null); - } - catch (Exception e){ - - } - - } - - -} diff --git a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchOperationAsyncInitiatorInterceptorTest.java b/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchOperationAsyncInitiatorInterceptorTest.java deleted file mode 100644 index f093dc9e751c..000000000000 --- a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchOperationAsyncInitiatorInterceptorTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss.interceptor; - -import com.navercorp.pinpoint.bootstrap.context.MethodDescriptor; -import com.navercorp.pinpoint.bootstrap.context.TraceContext; -import com.navercorp.pinpoint.bootstrap.interceptor.scope.InterceptorScope; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import static com.navercorp.pinpoint.plugin.elasticsearchbboss.ElasticsearchConstants.ELASTICSEARCH_Parallel_SCOPE; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ElasticsearchOperationAsyncInitiatorInterceptorTest { - - ElasticsearchOperationAsyncInitiatorInterceptor elasticsearchExecutorOperationInterceptor = null; - Object[] args = null; - @Before - public void setUp(){ - InterceptorScope interceptorScopeIT = mock(InterceptorScope.class); - when(interceptorScopeIT.getName()).thenReturn(ELASTICSEARCH_Parallel_SCOPE); - elasticsearchExecutorOperationInterceptor = new ElasticsearchOperationAsyncInitiatorInterceptor(mock(TraceContext.class), mock(MethodDescriptor.class),interceptorScopeIT); - args = new Object[]{"1","2","3","4","5","6"}; - } - - @Test - public void testConstruction(){ - InterceptorScope interceptorScopeIT = mock(InterceptorScope.class); - when(interceptorScopeIT.getName()).thenReturn(ELASTICSEARCH_Parallel_SCOPE); -// InterceptorScopeIT interceptorScopeIT = new InterceptorScopeIT(ELASTICSEARCH_Parallel_SCOPE); - ElasticsearchOperationAsyncInitiatorInterceptor elasticsearchExecutorOperationInterceptor = new ElasticsearchOperationAsyncInitiatorInterceptor(mock(TraceContext.class), mock(MethodDescriptor.class),interceptorScopeIT); - Assert.assertNotNull(elasticsearchExecutorOperationInterceptor); - } - @Test - public void beforeTest() { - try { - elasticsearchExecutorOperationInterceptor.before(new Object(),args); - } - catch (Exception e){ - Assert.assertTrue(e instanceof NullPointerException); - } - } - - @Test - public void afterTest() { - try { - elasticsearchExecutorOperationInterceptor.after(new Object(),args,null,null); - } - catch (Exception e){ - Assert.assertTrue(e instanceof NullPointerException); - } - } -} diff --git a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchOperationInterceptorTest.java b/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchOperationInterceptorTest.java deleted file mode 100644 index f7238fe7b914..000000000000 --- a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/ElasticsearchOperationInterceptorTest.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss.interceptor; - -import com.navercorp.pinpoint.bootstrap.config.ProfilerConfig; -import com.navercorp.pinpoint.bootstrap.context.MethodDescriptor; -import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; -import com.navercorp.pinpoint.bootstrap.context.TraceContext; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * @author yinbp[yin-bp@163.com] - */ -public class ElasticsearchOperationInterceptorTest { - ElasticsearchOperationInterceptor elasticsearchExecutorOperationInterceptor = null; - Object[] args = null; - @Before - public void setUp(){ - MethodDescriptor methodDescriptor = mock(MethodDescriptor.class); - when(methodDescriptor.getClassName()).thenReturn(" "); - TraceContext traceContext = mock(TraceContext.class); - ProfilerConfig profilerConfig = mock(ProfilerConfig.class); - when(traceContext.getProfilerConfig()).thenReturn(profilerConfig); - elasticsearchExecutorOperationInterceptor = new ElasticsearchOperationInterceptor(traceContext, methodDescriptor); - args = new Object[]{"1","2","3","4","5","6"}; - } - @Test - public void testConstruction(){ - MethodDescriptor methodDescriptor = mock(MethodDescriptor.class); - when(methodDescriptor.getClassName()).thenReturn(" "); - TraceContext traceContext = mock(TraceContext.class); - ProfilerConfig profilerConfig = mock(ProfilerConfig.class); - when(traceContext.getProfilerConfig()).thenReturn(profilerConfig); - ElasticsearchOperationInterceptor elasticsearchExecutorOperationInterceptor = new ElasticsearchOperationInterceptor(traceContext, methodDescriptor); - } - @Test - public void testBefore(){ - - - try { - elasticsearchExecutorOperationInterceptor.before(new Object(),args); - } - catch (Exception e) { - Assert.assertTrue(e instanceof NullPointerException); - } - - } - - @Test - public void testAfter(){ - - - try { - elasticsearchExecutorOperationInterceptor.after(new Object(), args, "ok", null); - } - catch (Exception e){ - Assert.assertTrue(e instanceof NullPointerException); - } - } - - - - - - - - @Test - public void doInEventAfterTrace() { - try { - - elasticsearchExecutorOperationInterceptor.doInAfterTrace(mock(SpanEventRecorder.class),new Object(),args,"aa",null); - } - catch (Exception ignored){ - - } - - } - - - -} diff --git a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/SliceWorkerConstructorInterceptorTest.java b/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/SliceWorkerConstructorInterceptorTest.java deleted file mode 100644 index de6476c7ab6a..000000000000 --- a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/SliceWorkerConstructorInterceptorTest.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss.interceptor; - -import com.navercorp.pinpoint.bootstrap.interceptor.scope.InterceptorScope; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import static com.navercorp.pinpoint.plugin.elasticsearchbboss.ElasticsearchConstants.ELASTICSEARCH_Parallel_SCOPE; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * @author yinbp[yin-bp@163.com] - */ -public class SliceWorkerConstructorInterceptorTest { - - ParallelWorkerConstructorInterceptor sliceWorkerConstructorInterceptor = null; - Object[] args = null; - @Before - public void setUp(){ - InterceptorScope interceptorScopeIT = mock(InterceptorScope.class); - when(interceptorScopeIT.getName()).thenReturn(ELASTICSEARCH_Parallel_SCOPE); - sliceWorkerConstructorInterceptor = new ParallelWorkerConstructorInterceptor(interceptorScopeIT); - args = new Object[]{"1","2","3","4","5","6"}; - } - - @Test - public void testConstruction(){ - InterceptorScope interceptorScopeIT = mock(InterceptorScope.class); - when(interceptorScopeIT.getName()).thenReturn(ELASTICSEARCH_Parallel_SCOPE); - ParallelWorkerConstructorInterceptor sliceWorkerConstructorInterceptor = new ParallelWorkerConstructorInterceptor(interceptorScopeIT); - Assert.assertNotNull(sliceWorkerConstructorInterceptor); - } - @Test - public void beforeTest() { - try { - sliceWorkerConstructorInterceptor.before(new Object(),args); - } - catch (Exception e){ - Assert.assertTrue(e instanceof NullPointerException); - } - } - - @Test - public void afterTest() { - try { - sliceWorkerConstructorInterceptor.after(new Object(),args,null,null); - } - catch (Exception e){ - Assert.assertTrue(e instanceof NullPointerException); - } - } -} diff --git a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/SliceWorkerRunInterceptorTest.java b/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/SliceWorkerRunInterceptorTest.java deleted file mode 100644 index 54070a58d8ca..000000000000 --- a/plugins/elasticsearch-bboss/src/test/java/com/navercorp/pinpoint/plugin/elasticsearchbboss/interceptor/SliceWorkerRunInterceptorTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2018 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.elasticsearchbboss.interceptor; - -import com.navercorp.pinpoint.bootstrap.context.AsyncContext; -import com.navercorp.pinpoint.bootstrap.context.MethodDescriptor; -import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; -import com.navercorp.pinpoint.bootstrap.context.TraceContext; -import com.navercorp.pinpoint.bootstrap.interceptor.scope.InterceptorScope; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import static com.navercorp.pinpoint.plugin.elasticsearchbboss.ElasticsearchConstants.ELASTICSEARCH_Parallel_SCOPE; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * @author yinbp[yin-bp@163.com] - */ -public class SliceWorkerRunInterceptorTest { - - ParallelWorkerRunInterceptor sliceWorkerRunInterceptor = null; - Object[] args = null; - @Before - public void setUp(){ - sliceWorkerRunInterceptor = new ParallelWorkerRunInterceptor(mock(TraceContext.class), mock(MethodDescriptor.class)); - args = new Object[]{"1","2","3","4","5","6"}; - } - - @Test - public void testConstruction(){ - InterceptorScope interceptorScopeIT = mock(InterceptorScope.class); - when(interceptorScopeIT.getName()).thenReturn(ELASTICSEARCH_Parallel_SCOPE ); - ParallelWorkerRunInterceptor sliceWorkerRunInterceptor = new ParallelWorkerRunInterceptor(mock(TraceContext.class), mock(MethodDescriptor.class)); - Assert.assertNotNull(sliceWorkerRunInterceptor); - } - @Test - public void beforeTest() { - try { - sliceWorkerRunInterceptor.before(new Object(),args); - } - catch (Exception e){ - Assert.assertTrue(e instanceof NullPointerException); - } - } - - @Test - public void afterTest() { - try { - sliceWorkerRunInterceptor.after(new Object(),args,null,null); - } - catch (Exception e){ - Assert.assertTrue(e instanceof NullPointerException); - } - } - - @Test - public void doInBeforeTrace() { - try { - sliceWorkerRunInterceptor.doInBeforeTrace(mock( SpanEventRecorder.class), mock(AsyncContext.class), new Object(),args); - } - catch (Exception e){ - - } - } - - @Test - public void doInAfterTrace() { - try { - sliceWorkerRunInterceptor.doInAfterTrace(mock( SpanEventRecorder.class), new Object(),args,null,null); - } - catch (Exception e){ - - } - } -} diff --git a/plugins/pom.xml b/plugins/pom.xml index d94c62722e9d..5cf72f2af048 100644 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -97,7 +97,6 @@ log4j2 openwhisk redis-redisson - elasticsearch-bboss apache-dubbo elasticsearch elasticsearch8