diff --git a/java-agent/build.gradle.kts b/java-agent/build.gradle.kts index b3bd753f..fd0dfaa8 100644 --- a/java-agent/build.gradle.kts +++ b/java-agent/build.gradle.kts @@ -131,6 +131,7 @@ kotlin { implementation(project(":jvmapi")) implementation(project(":knasm")) implementation(project(":konform")) + implementation(project(":agent-instrumentation")) if (nativeAgentHookEnabled == "true") implementation(project(":interceptor-http")) else diff --git a/java-agent/src/commonMain/kotlin/com/epam/drill/agent/configuration/ParameterDefinitions.kt b/java-agent/src/commonMain/kotlin/com/epam/drill/agent/configuration/ParameterDefinitions.kt index be139714..8472b1aa 100644 --- a/java-agent/src/commonMain/kotlin/com/epam/drill/agent/configuration/ParameterDefinitions.kt +++ b/java-agent/src/commonMain/kotlin/com/epam/drill/agent/configuration/ParameterDefinitions.kt @@ -37,15 +37,7 @@ object ParameterDefinitions: AgentParameterDefinitionCollection() { val LOG_LEVEL = AgentParameterDefinition.forString(name = "logLevel", defaultValue = "INFO").register() val LOG_FILE = NullableAgentParameterDefinition.forString(name = "logFile").register() val LOG_LIMIT = AgentParameterDefinition.forInt(name = "logLimit", defaultValue = 512).register() - val IS_WEB_APP = AgentParameterDefinition.forBoolean(name = "isWebApp", defaultValue = false).register() - val IS_KAFKA = AgentParameterDefinition.forBoolean(name = "isKafka", defaultValue = false).register() - val IS_CADENCE = AgentParameterDefinition.forBoolean(name = "isCadence", defaultValue = false).register() - val IS_TLS_APP = AgentParameterDefinition.forBoolean(name = "isTlsApp", defaultValue = false).register() - val IS_ASYNC_APP = AgentParameterDefinition.forBoolean(name = "isAsyncApp", defaultValue = false).register() - val IS_COMPATIBILITY_TESTS = - AgentParameterDefinition.forBoolean(name = "isCompatibilityTests", defaultValue = false).register() val USE_PROTOBUF_SERIALIZER = AgentParameterDefinition.forBoolean(name = "useProtobufSerializer", defaultValue = true).register() val USE_GZIP_COMPRESSION = AgentParameterDefinition.forBoolean(name = "useGzipCompression", defaultValue = true).register() - val IS_WS_MESSAGES = AgentParameterDefinition.forBoolean(name = "isWsMsg", defaultValue = true).register() } diff --git a/java-agent/src/commonMain/kotlin/com/epam/drill/agent/instrument/ApplicationClassTransformer.kt b/java-agent/src/commonMain/kotlin/com/epam/drill/agent/instrument/ApplicationClassTransformer.kt new file mode 100644 index 00000000..6287331d --- /dev/null +++ b/java-agent/src/commonMain/kotlin/com/epam/drill/agent/instrument/ApplicationClassTransformer.kt @@ -0,0 +1,18 @@ +/** + * Copyright 2020 - 2022 EPAM Systems + * + * 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.epam.drill.agent.instrument + +expect object ApplicationClassTransformer: TransformerObject \ No newline at end of file diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/ApplicationClassTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/ApplicationClassTransformer.kt new file mode 100644 index 00000000..1fdd4de9 --- /dev/null +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/ApplicationClassTransformer.kt @@ -0,0 +1,55 @@ +/** + * Copyright 2020 - 2022 EPAM Systems + * + * 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.epam.drill.agent.instrument + +import com.epam.drill.agent.common.classloading.ClassSource +import com.epam.drill.agent.common.module.Instrumenter +import com.epam.drill.agent.configuration.Configuration +import com.epam.drill.agent.module.JvmModuleStorage +import javassist.CtClass +import mu.KLogger +import mu.KotlinLogging + +actual object ApplicationClassTransformer : + TransformerObject, + AbstractTransformerObject(Configuration), + HeadersProcessor by DefaultHeadersProcessor, + ClassPathProvider by RuntimeClassPathProvider { + + override val logger: KLogger = KotlinLogging.logger {} + + override fun permit( + className: String, + superName: String?, + interfaces: Array + ): Boolean = ClassSource(className, superName ?: "") + .prefixMatches(Configuration.agentMetadata.packagesPrefixes) + + override fun transform( + className: String, + classFileBuffer: ByteArray, + loader: Any?, + protectionDomain: Any? + ): ByteArray = JvmModuleStorage.values() + .filterIsInstance() + .fold(classFileBuffer) { bytes, plugin -> + plugin.instrument(className, bytes) ?: bytes + } + + override fun transform(className: String, ctClass: CtClass) { + throw UnsupportedOperationException("Use transform with ByteArray") + } +} \ No newline at end of file diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/DefaultPayloadProcessor.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/DefaultPayloadProcessor.kt index 5431c011..aabee553 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/DefaultPayloadProcessor.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/DefaultPayloadProcessor.kt @@ -19,6 +19,6 @@ import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.configuration.ParameterDefinitions object DefaultPayloadProcessor : DrillRequestPayloadProcessor( - { Configuration.parameters[ParameterDefinitions.IS_WS_MESSAGES] }, + { true }, DefaultHeadersProcessor ) diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/clients/ApacheHttpClientTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/clients/ApacheHttpClientTransformer.kt index 56842f8e..c6f18222 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/clients/ApacheHttpClientTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/clients/ApacheHttpClientTransformer.kt @@ -15,6 +15,7 @@ */ package com.epam.drill.agent.instrument.clients +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.DefaultHeadersProcessor import com.epam.drill.agent.instrument.HeadersProcessor @@ -23,6 +24,6 @@ import com.epam.drill.agent.instrument.TransformerObject actual object ApacheHttpClientTransformer : TransformerObject, - ApacheHttpClientTransformerObject(), + ApacheHttpClientTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/clients/JavaHttpClientTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/clients/JavaHttpClientTransformer.kt index 81c95f19..3a4a845a 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/clients/JavaHttpClientTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/clients/JavaHttpClientTransformer.kt @@ -15,6 +15,7 @@ */ package com.epam.drill.agent.instrument.clients +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.DefaultHeadersProcessor import com.epam.drill.agent.instrument.HeadersProcessor @@ -23,6 +24,6 @@ import com.epam.drill.agent.instrument.TransformerObject actual object JavaHttpClientTransformer : TransformerObject, - JavaHttpClientTransformerObject(), + JavaHttpClientTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/clients/OkHttp3ClientTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/clients/OkHttp3ClientTransformer.kt index 0630ea45..8cbace7b 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/clients/OkHttp3ClientTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/clients/OkHttp3ClientTransformer.kt @@ -15,6 +15,7 @@ */ package com.epam.drill.agent.instrument.clients +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.DefaultHeadersProcessor import com.epam.drill.agent.instrument.HeadersProcessor @@ -23,6 +24,6 @@ import com.epam.drill.agent.instrument.TransformerObject actual object OkHttp3ClientTransformer : TransformerObject, - OkHttp3ClientTransformerObject(), + OkHttp3ClientTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/clients/SpringWebClientTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/clients/SpringWebClientTransformer.kt index 30917f3d..918aba52 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/clients/SpringWebClientTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/clients/SpringWebClientTransformer.kt @@ -15,10 +15,11 @@ */ package com.epam.drill.agent.instrument.clients +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.* actual object SpringWebClientTransformer: TransformerObject, - SpringWebClientTransformerObject(), + SpringWebClientTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty10WsMessagesTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty10WsMessagesTransformer.kt index be12cae5..9dca362a 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty10WsMessagesTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty10WsMessagesTransformer.kt @@ -15,11 +15,13 @@ */ package com.epam.drill.agent.instrument.jetty +import com.epam.drill.agent.common.configuration.AgentParameters +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.* actual object Jetty10WsMessagesTransformer : TransformerObject, - Jetty10WsMessagesTransformerObject(), + Jetty10WsMessagesTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, PayloadProcessor by DefaultPayloadProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty11WsMessagesTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty11WsMessagesTransformer.kt index 2f3304b6..7caae792 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty11WsMessagesTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty11WsMessagesTransformer.kt @@ -15,11 +15,12 @@ */ package com.epam.drill.agent.instrument.jetty +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.* actual object Jetty11WsMessagesTransformer : TransformerObject, - Jetty11WsMessagesTransformerObject(), + Jetty11WsMessagesTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, PayloadProcessor by DefaultPayloadProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty9WsMessagesTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty9WsMessagesTransformer.kt index e55e350d..0e754bc5 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty9WsMessagesTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty9WsMessagesTransformer.kt @@ -15,11 +15,12 @@ */ package com.epam.drill.agent.instrument.jetty +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.* actual object Jetty9WsMessagesTransformer : TransformerObject, - Jetty9WsMessagesTransformerObject(), + Jetty9WsMessagesTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, PayloadProcessor by DefaultPayloadProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyHttpServerTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyHttpServerTransformer.kt index 7feaafa3..fac55cbd 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyHttpServerTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyHttpServerTransformer.kt @@ -15,11 +15,12 @@ */ package com.epam.drill.agent.instrument.jetty +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.* import com.epam.drill.agent.request.HeadersRetriever actual object JettyHttpServerTransformer : TransformerObject, - JettyHttpServerTransformerObject(HeadersRetriever), + JettyHttpServerTransformerObject(HeadersRetriever, Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyWsClientTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyWsClientTransformer.kt index ad7c0dd0..2b2d3f0c 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyWsClientTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyWsClientTransformer.kt @@ -15,10 +15,11 @@ */ package com.epam.drill.agent.instrument.jetty +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.* actual object JettyWsClientTransformer : TransformerObject, - JettyWsClientTransformerObject(), + JettyWsClientTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyWsServerTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyWsServerTransformer.kt index cd95da28..a5cdfb01 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyWsServerTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyWsServerTransformer.kt @@ -15,10 +15,11 @@ */ package com.epam.drill.agent.instrument.jetty +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.* actual object JettyWsServerTransformer : TransformerObject, - JettyWsServerTransformerObject(), + JettyWsServerTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/netty/NettyHttpServerTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/netty/NettyHttpServerTransformer.kt index aeeeb1eb..497e31fa 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/netty/NettyHttpServerTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/netty/NettyHttpServerTransformer.kt @@ -15,6 +15,7 @@ */ package com.epam.drill.agent.instrument.netty +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.DefaultHeadersProcessor import com.epam.drill.agent.instrument.HeadersProcessor @@ -24,6 +25,6 @@ import com.epam.drill.agent.request.HeadersRetriever actual object NettyHttpServerTransformer : TransformerObject, - NettyHttpServerTransformerObject(HeadersRetriever), + NettyHttpServerTransformerObject(HeadersRetriever, Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsClientTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsClientTransformer.kt index a2c51635..dae6ab09 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsClientTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsClientTransformer.kt @@ -15,6 +15,7 @@ */ package com.epam.drill.agent.instrument.netty +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.DefaultHeadersProcessor import com.epam.drill.agent.instrument.HeadersProcessor @@ -23,6 +24,6 @@ import com.epam.drill.agent.instrument.TransformerObject actual object NettyWsClientTransformer : TransformerObject, - NettyWsClientTransformerObject(), + NettyWsClientTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsMessagesTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsMessagesTransformer.kt index a02ccbc0..8dd3fbf0 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsMessagesTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsMessagesTransformer.kt @@ -15,6 +15,7 @@ */ package com.epam.drill.agent.instrument.netty +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.DefaultHeadersProcessor import com.epam.drill.agent.instrument.DefaultPayloadProcessor @@ -25,7 +26,7 @@ import com.epam.drill.agent.instrument.TransformerObject actual object NettyWsMessagesTransformer : TransformerObject, - NettyWsMessagesTransformerObject(), + NettyWsMessagesTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, PayloadProcessor by DefaultPayloadProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsServerTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsServerTransformer.kt index 6a9040da..b9eacf3e 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsServerTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsServerTransformer.kt @@ -15,6 +15,7 @@ */ package com.epam.drill.agent.instrument.netty +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.DefaultHeadersProcessor import com.epam.drill.agent.instrument.HeadersProcessor @@ -23,6 +24,6 @@ import com.epam.drill.agent.instrument.TransformerObject actual object NettyWsServerTransformer : TransformerObject, - NettyWsServerTransformerObject(), + NettyWsServerTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/reactor/transformers/FluxTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/reactor/transformers/FluxTransformer.kt index 539f99fc..afbc3828 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/reactor/transformers/FluxTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/reactor/transformers/FluxTransformer.kt @@ -15,12 +15,13 @@ */ package com.epam.drill.agent.instrument.reactor.transformers +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.RuntimeClassPathProvider import com.epam.drill.agent.instrument.TransformerObject import com.epam.drill.agent.request.DrillRequestHolder object FluxTransformer: TransformerObject, - FluxTransformerObject(), + FluxTransformerObject(Configuration), com.epam.drill.agent.common.request.RequestHolder by DrillRequestHolder, ClassPathProvider by RuntimeClassPathProvider \ No newline at end of file diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/reactor/transformers/MonoTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/reactor/transformers/MonoTransformer.kt index ca07f47b..1952bf00 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/reactor/transformers/MonoTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/reactor/transformers/MonoTransformer.kt @@ -15,12 +15,13 @@ */ package com.epam.drill.agent.instrument.reactor.transformers +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.RuntimeClassPathProvider import com.epam.drill.agent.instrument.TransformerObject import com.epam.drill.agent.request.DrillRequestHolder object MonoTransformer : TransformerObject, - MonoTransformerObject(), + MonoTransformerObject(Configuration), com.epam.drill.agent.common.request.RequestHolder by DrillRequestHolder, ClassPathProvider by RuntimeClassPathProvider \ No newline at end of file diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/reactor/transformers/ParallelFluxTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/reactor/transformers/ParallelFluxTransformer.kt index 2b2e6504..41c1acdb 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/reactor/transformers/ParallelFluxTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/reactor/transformers/ParallelFluxTransformer.kt @@ -15,12 +15,13 @@ */ package com.epam.drill.agent.instrument.reactor.transformers +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.RuntimeClassPathProvider import com.epam.drill.agent.instrument.TransformerObject import com.epam.drill.agent.request.DrillRequestHolder object ParallelFluxTransformer: TransformerObject, - ParallelFluxTransformerObject(), + ParallelFluxTransformerObject(Configuration), com.epam.drill.agent.common.request.RequestHolder by DrillRequestHolder, ClassPathProvider by RuntimeClassPathProvider \ No newline at end of file diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/reactor/transformers/SchedulersTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/reactor/transformers/SchedulersTransformer.kt index 457bc8dc..5883ce3e 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/reactor/transformers/SchedulersTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/reactor/transformers/SchedulersTransformer.kt @@ -15,12 +15,13 @@ */ package com.epam.drill.agent.instrument.reactor.transformers +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.TransformerObject import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.RuntimeClassPathProvider import com.epam.drill.agent.request.DrillRequestHolder object SchedulersTransformer: TransformerObject, - SchedulersTransformerObject(), + SchedulersTransformerObject(Configuration), com.epam.drill.agent.common.request.RequestHolder by DrillRequestHolder, ClassPathProvider by RuntimeClassPathProvider \ No newline at end of file diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/CadenceTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/CadenceTransformer.kt index 65151f14..f16af633 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/CadenceTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/CadenceTransformer.kt @@ -15,6 +15,7 @@ */ package com.epam.drill.agent.instrument.servers +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.DefaultHeadersProcessor import com.epam.drill.agent.instrument.HeadersProcessor @@ -23,6 +24,6 @@ import com.epam.drill.agent.instrument.TransformerObject actual object CadenceTransformer : TransformerObject, - CadenceTransformerObject(), + CadenceTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/CompatibilityTestsTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/CompatibilityTestsTransformer.kt index accbb802..3cb25ce0 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/CompatibilityTestsTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/CompatibilityTestsTransformer.kt @@ -15,6 +15,7 @@ */ package com.epam.drill.agent.instrument.servers +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.* import com.epam.drill.agent.instrument.test.CompatibilityTestsTransformerObject import com.epam.drill.agent.request.DrillRequestHolder @@ -22,5 +23,5 @@ import com.epam.drill.agent.request.DrillRequestHolder actual object CompatibilityTestsTransformer : TransformerObject, com.epam.drill.agent.common.request.RequestHolder by DrillRequestHolder, - CompatibilityTestsTransformerObject(), + CompatibilityTestsTransformerObject(Configuration), ClassPathProvider by RuntimeClassPathProvider \ No newline at end of file diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/KafkaTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/KafkaTransformer.kt index 95be7e56..82755906 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/KafkaTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/KafkaTransformer.kt @@ -15,6 +15,7 @@ */ package com.epam.drill.agent.instrument.servers +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.DefaultHeadersProcessor import com.epam.drill.agent.instrument.HeadersProcessor @@ -23,6 +24,6 @@ import com.epam.drill.agent.instrument.TransformerObject actual object KafkaTransformer : TransformerObject, - KafkaTransformerObject(), + KafkaTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/ReactorTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/ReactorTransformer.kt index 32d8a9d5..bd3c70e2 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/ReactorTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/ReactorTransformer.kt @@ -15,6 +15,7 @@ */ package com.epam.drill.agent.instrument.servers +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.AbstractTransformerObject import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.RuntimeClassPathProvider @@ -33,5 +34,5 @@ private val reactorTransformers = setOf( actual object ReactorTransformer : TransformerObject, - ReactorTransformerObject(reactorTransformers), + ReactorTransformerObject(reactorTransformers, Configuration), ClassPathProvider by RuntimeClassPathProvider \ No newline at end of file diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/SSLEngineTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/SSLEngineTransformer.kt index 2694b093..bbf9cbdc 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/SSLEngineTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/SSLEngineTransformer.kt @@ -15,6 +15,7 @@ */ package com.epam.drill.agent.instrument.servers +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.DefaultHeadersProcessor import com.epam.drill.agent.instrument.HeadersProcessor @@ -24,6 +25,6 @@ import com.epam.drill.agent.request.HeadersRetriever actual object SSLEngineTransformer : TransformerObject, - SSLEngineTransformerObject(HeadersRetriever), + SSLEngineTransformerObject(HeadersRetriever, Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/TTLTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/TTLTransformer.kt index d564c94b..3c300607 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/TTLTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/servers/TTLTransformer.kt @@ -15,11 +15,12 @@ */ package com.epam.drill.agent.instrument.servers +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.RuntimeClassPathProvider import com.epam.drill.agent.instrument.TransformerObject actual object TTLTransformer : TransformerObject, - TTLTransformerObject(), + TTLTransformerObject(Configuration), ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatHttpServerTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatHttpServerTransformer.kt index e16fabb5..8c3a60b2 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatHttpServerTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatHttpServerTransformer.kt @@ -15,6 +15,7 @@ */ package com.epam.drill.agent.instrument.tomcat +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.DefaultHeadersProcessor import com.epam.drill.agent.instrument.HeadersProcessor @@ -24,6 +25,6 @@ import com.epam.drill.agent.request.HeadersRetriever actual object TomcatHttpServerTransformer : TransformerObject, - TomcatHttpServerTransformerObject(HeadersRetriever), + TomcatHttpServerTransformerObject(HeadersRetriever, Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsClientTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsClientTransformer.kt index 9031b67a..9442959a 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsClientTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsClientTransformer.kt @@ -15,6 +15,7 @@ */ package com.epam.drill.agent.instrument.tomcat +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.DefaultHeadersProcessor import com.epam.drill.agent.instrument.HeadersProcessor @@ -23,6 +24,6 @@ import com.epam.drill.agent.instrument.TransformerObject actual object TomcatWsClientTransformer : TransformerObject, - TomcatWsClientTransformerObject(), + TomcatWsClientTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsMessagesTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsMessagesTransformer.kt index 5a9458f9..b27fb0ff 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsMessagesTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsMessagesTransformer.kt @@ -15,6 +15,7 @@ */ package com.epam.drill.agent.instrument.tomcat +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.DefaultHeadersProcessor import com.epam.drill.agent.instrument.DefaultPayloadProcessor @@ -25,7 +26,7 @@ import com.epam.drill.agent.instrument.TransformerObject actual object TomcatWsMessagesTransformer : TransformerObject, - TomcatWsMessagesTransformerObject(), + TomcatWsMessagesTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, PayloadProcessor by DefaultPayloadProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsServerTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsServerTransformer.kt index ba32835b..484145c7 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsServerTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsServerTransformer.kt @@ -15,6 +15,7 @@ */ package com.epam.drill.agent.instrument.tomcat +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.ClassPathProvider import com.epam.drill.agent.instrument.DefaultHeadersProcessor import com.epam.drill.agent.instrument.HeadersProcessor @@ -23,6 +24,6 @@ import com.epam.drill.agent.instrument.TransformerObject actual object TomcatWsServerTransformer : TransformerObject, - TomcatWsServerTransformerObject(), + TomcatWsServerTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowHttpServerTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowHttpServerTransformer.kt index 4625ccec..1793c479 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowHttpServerTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowHttpServerTransformer.kt @@ -15,11 +15,12 @@ */ package com.epam.drill.agent.instrument.undertow +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.* import com.epam.drill.agent.request.HeadersRetriever actual object UndertowHttpServerTransformer : TransformerObject, - UndertowHttpServerTransformerObject(HeadersRetriever), + UndertowHttpServerTransformerObject(HeadersRetriever, Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsClientTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsClientTransformer.kt index 23ea0e78..86b1d18a 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsClientTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsClientTransformer.kt @@ -15,11 +15,12 @@ */ package com.epam.drill.agent.instrument.undertow +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.* import com.epam.drill.agent.request.HeadersRetriever actual object UndertowWsClientTransformer : TransformerObject, - UndertowWsClientTransformerObject(), + UndertowWsClientTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsMessagesTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsMessagesTransformer.kt index 88c98580..a4890c89 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsMessagesTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsMessagesTransformer.kt @@ -15,12 +15,13 @@ */ package com.epam.drill.agent.instrument.undertow +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.* import com.epam.drill.agent.request.HeadersRetriever actual object UndertowWsMessagesTransformer : TransformerObject, - UndertowWsMessagesTransformerObject(), + UndertowWsMessagesTransformerObject(Configuration), HeadersProcessor by DefaultHeadersProcessor, PayloadProcessor by DefaultPayloadProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsServerTransformer.kt b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsServerTransformer.kt index fa558541..721c144e 100644 --- a/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsServerTransformer.kt +++ b/java-agent/src/jvmMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsServerTransformer.kt @@ -15,11 +15,12 @@ */ package com.epam.drill.agent.instrument.undertow +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.* import com.epam.drill.agent.request.HeadersRetriever actual object UndertowWsServerTransformer : TransformerObject, - UndertowWsServerTransformerObject(HeadersRetriever), + UndertowWsServerTransformerObject(HeadersRetriever, Configuration), HeadersProcessor by DefaultHeadersProcessor, ClassPathProvider by RuntimeClassPathProvider diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/Agent.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/Agent.kt index 0bee4440..9e8b6304 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/Agent.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/Agent.kt @@ -26,18 +26,44 @@ import mu.KotlinLogging import com.epam.drill.agent.configuration.AgentLoggingConfiguration import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.configuration.DefaultParameterDefinitions.INSTALLATION_DIR -import com.epam.drill.agent.configuration.ParameterDefinitions -import com.epam.drill.agent.interceptor.HttpInterceptorConfigurer +import com.epam.drill.agent.instrument.ApplicationClassTransformer import com.epam.drill.agent.jvmti.classFileLoadHook import com.epam.drill.agent.jvmti.vmDeathEvent import com.epam.drill.agent.jvmti.vmInitEvent import com.epam.drill.agent.module.JvmModuleLoader -import com.epam.drill.agent.request.HeadersRetriever -import com.epam.drill.agent.request.DrillRequestHolder import com.epam.drill.agent.transport.JvmModuleMessageSender import com.epam.drill.agent.jvmapi.gen.* import kotlinx.cinterop.ExperimentalForeignApi import kotlin.experimental.ExperimentalNativeApi +import com.epam.drill.agent.instrument.TransformerRegistrar +import com.epam.drill.agent.instrument.clients.ApacheHttpClientTransformer +import com.epam.drill.agent.instrument.clients.JavaHttpClientTransformer +import com.epam.drill.agent.instrument.clients.OkHttp3ClientTransformer +import com.epam.drill.agent.instrument.clients.SpringWebClientTransformer +import com.epam.drill.agent.instrument.jetty.Jetty10WsMessagesTransformer +import com.epam.drill.agent.instrument.jetty.Jetty11WsMessagesTransformer +import com.epam.drill.agent.instrument.jetty.Jetty9WsMessagesTransformer +import com.epam.drill.agent.instrument.jetty.JettyHttpServerTransformer +import com.epam.drill.agent.instrument.jetty.JettyWsClientTransformer +import com.epam.drill.agent.instrument.jetty.JettyWsServerTransformer +import com.epam.drill.agent.instrument.netty.NettyHttpServerTransformer +import com.epam.drill.agent.instrument.netty.NettyWsClientTransformer +import com.epam.drill.agent.instrument.netty.NettyWsMessagesTransformer +import com.epam.drill.agent.instrument.netty.NettyWsServerTransformer +import com.epam.drill.agent.instrument.servers.CadenceTransformer +import com.epam.drill.agent.instrument.servers.CompatibilityTestsTransformer +import com.epam.drill.agent.instrument.servers.KafkaTransformer +import com.epam.drill.agent.instrument.servers.ReactorTransformer +import com.epam.drill.agent.instrument.servers.SSLEngineTransformer +import com.epam.drill.agent.instrument.servers.TTLTransformer +import com.epam.drill.agent.instrument.tomcat.TomcatHttpServerTransformer +import com.epam.drill.agent.instrument.tomcat.TomcatWsClientTransformer +import com.epam.drill.agent.instrument.tomcat.TomcatWsMessagesTransformer +import com.epam.drill.agent.instrument.tomcat.TomcatWsServerTransformer +import com.epam.drill.agent.instrument.undertow.UndertowHttpServerTransformer +import com.epam.drill.agent.instrument.undertow.UndertowWsClientTransformer +import com.epam.drill.agent.instrument.undertow.UndertowWsMessagesTransformer +import com.epam.drill.agent.instrument.undertow.UndertowWsServerTransformer object Agent { @@ -53,6 +79,37 @@ object Agent { """.trimIndent() private val logger = KotlinLogging.logger("com.epam.drill.agent.Agent") + private val transformers = setOf( + ApplicationClassTransformer, + TomcatHttpServerTransformer, + JettyHttpServerTransformer, + UndertowHttpServerTransformer, + NettyHttpServerTransformer, + JavaHttpClientTransformer, + ApacheHttpClientTransformer, + OkHttp3ClientTransformer, + SpringWebClientTransformer, + KafkaTransformer, + CadenceTransformer, + TTLTransformer, + ReactorTransformer, + SSLEngineTransformer, + JettyWsClientTransformer, + JettyWsServerTransformer, + Jetty9WsMessagesTransformer, + Jetty10WsMessagesTransformer, + Jetty11WsMessagesTransformer, + NettyWsClientTransformer, + NettyWsServerTransformer, + NettyWsMessagesTransformer, + TomcatWsClientTransformer, + TomcatWsServerTransformer, + TomcatWsMessagesTransformer, + UndertowWsClientTransformer, + UndertowWsServerTransformer, + UndertowWsMessagesTransformer, + CompatibilityTestsTransformer, + ) @OptIn(ExperimentalNativeApi::class, ExperimentalForeignApi::class) fun agentOnLoad(options: String): Int { @@ -60,6 +117,7 @@ object Agent { AgentLoggingConfiguration.defaultNativeLoggingConfiguration() Configuration.initializeNative(options) AgentLoggingConfiguration.updateNativeLoggingConfiguration() + TransformerRegistrar.initialize(transformers) addCapabilities() setEventCallbacks() @@ -84,8 +142,6 @@ object Agent { AgentLoggingConfiguration.updateJvmLoggingConfiguration() Configuration.initializeJvm() - DrillRequestHolder.init(Configuration.parameters[ParameterDefinitions.IS_ASYNC_APP]) - HttpInterceptorConfigurer(HeadersRetriever, DrillRequestHolder) loadJvmModule("com.epam.drill.agent.test2code.Test2Code") JvmModuleMessageSender.sendAgentMetadata() diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/AbstractHttpTransformerObject.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/AbstractHttpTransformerObject.kt new file mode 100644 index 00000000..03eaaa8b --- /dev/null +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/AbstractHttpTransformerObject.kt @@ -0,0 +1,23 @@ +/** + * Copyright 2020 - 2022 EPAM Systems + * + * 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.epam.drill.agent.instrument + +import com.epam.drill.agent.configuration.Configuration +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_HTTP_ENABLED + +abstract class AbstractHttpTransformerObject: AbstractTransformerObject() { + override fun enabled() = super.enabled() && Configuration.parameters[INSTRUMENTATION_HTTP_ENABLED] +} \ No newline at end of file diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/AbstractReactTransformerObject.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/AbstractReactTransformerObject.kt new file mode 100644 index 00000000..1ecfaa2a --- /dev/null +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/AbstractReactTransformerObject.kt @@ -0,0 +1,23 @@ +/** + * Copyright 2020 - 2022 EPAM Systems + * + * 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.epam.drill.agent.instrument + +import com.epam.drill.agent.configuration.Configuration +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_REACTOR_ENABLED + +abstract class AbstractReactTransformerObject: AbstractTransformerObject() { + override fun enabled() = super.enabled() && Configuration.parameters[INSTRUMENTATION_REACTOR_ENABLED] +} \ No newline at end of file diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/AbstractTransformerObject.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/AbstractTransformerObject.kt new file mode 100644 index 00000000..db0b6e27 --- /dev/null +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/AbstractTransformerObject.kt @@ -0,0 +1,23 @@ +/** + * Copyright 2020 - 2022 EPAM Systems + * + * 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.epam.drill.agent.instrument + +import com.epam.drill.agent.configuration.Configuration +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_ENABLED + +abstract class AbstractTransformerObject: JvmTransformerObject() { + override fun enabled() = Configuration.parameters[INSTRUMENTATION_ENABLED] +} \ No newline at end of file diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/AbstractWsTransformerObject.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/AbstractWsTransformerObject.kt new file mode 100644 index 00000000..7bdccef2 --- /dev/null +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/AbstractWsTransformerObject.kt @@ -0,0 +1,23 @@ +/** + * Copyright 2020 - 2022 EPAM Systems + * + * 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.epam.drill.agent.instrument + +import com.epam.drill.agent.configuration.Configuration +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_WS_ENABLED + +abstract class AbstractWsTransformerObject: AbstractTransformerObject() { + override fun enabled() = super.enabled() && Configuration.parameters[INSTRUMENTATION_WS_ENABLED] +} \ No newline at end of file diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/ApplicationClassTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/ApplicationClassTransformer.kt new file mode 100644 index 00000000..dfae73bf --- /dev/null +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/ApplicationClassTransformer.kt @@ -0,0 +1,48 @@ +/** + * Copyright 2020 - 2022 EPAM Systems + * + * 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.epam.drill.agent.instrument + +import com.epam.drill.agent.common.classloading.ClassSource +import com.epam.drill.agent.configuration.Configuration +import com.epam.drill.agent.module.InstrumentationAgentModule +import com.epam.drill.agent.module.JvmModuleStorage + +actual object ApplicationClassTransformer : TransformerObject, AbstractTransformerObject() { + + override fun precheck( + className: String, + loader: Any?, + protectionDomain: Any? + ): Boolean = loader != null && protectionDomain != null && '$' !in className + + override fun permit( + className: String, + superName: String?, + interfaces: Array + ): Boolean = ClassSource(className, superName ?: "") + .prefixMatches(Configuration.agentMetadata.packagesPrefixes) + + override fun transform( + className: String, + classFileBuffer: ByteArray, + loader: Any?, + protectionDomain: Any? + ): ByteArray = JvmModuleStorage.values() + .filterIsInstance() + .fold(classFileBuffer) { bytes, plugin -> + plugin.instrument(className, bytes) ?: bytes + } +} \ No newline at end of file diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/clients/ApacheHttpClientTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/clients/ApacheHttpClientTransformer.kt index 80b8ec6a..c10008c0 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/clients/ApacheHttpClientTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/clients/ApacheHttpClientTransformer.kt @@ -15,7 +15,11 @@ */ package com.epam.drill.agent.instrument.clients +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_APACHE_HTTP_CLIENT_ENABLED import com.epam.drill.agent.instrument.TransformerObject -actual object ApacheHttpClientTransformer : TransformerObject, AbstractTransformerObject() +actual object ApacheHttpClientTransformer : TransformerObject, AbstractTransformerObject() { + override fun enabled() = super.enabled() && Configuration.parameters[INSTRUMENTATION_APACHE_HTTP_CLIENT_ENABLED] +} diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/clients/JavaHttpClientTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/clients/JavaHttpClientTransformer.kt index 964f5a0d..5fa1f25c 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/clients/JavaHttpClientTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/clients/JavaHttpClientTransformer.kt @@ -15,7 +15,16 @@ */ package com.epam.drill.agent.instrument.clients +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_JAVA_HTTP_CLIENT_ENABLED import com.epam.drill.agent.instrument.TransformerObject -actual object JavaHttpClientTransformer : TransformerObject, AbstractTransformerObject() +actual object JavaHttpClientTransformer : TransformerObject, AbstractTransformerObject() { + override fun enabled() = super.enabled() && Configuration.parameters[INSTRUMENTATION_JAVA_HTTP_CLIENT_ENABLED] + override fun precheck( + className: String, + loader: Any?, + protectionDomain: Any? + ): Boolean = loader != null && protectionDomain != null || className.contains("Http") +} diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/clients/OkHttp3ClientTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/clients/OkHttp3ClientTransformer.kt index a823acd2..4ecd338c 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/clients/OkHttp3ClientTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/clients/OkHttp3ClientTransformer.kt @@ -15,7 +15,11 @@ */ package com.epam.drill.agent.instrument.clients +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_OK_HTTP_CLIENT_ENABLED import com.epam.drill.agent.instrument.TransformerObject -actual object OkHttp3ClientTransformer : TransformerObject, AbstractTransformerObject() +actual object OkHttp3ClientTransformer : TransformerObject, AbstractTransformerObject() { + override fun enabled() = super.enabled() && Configuration.parameters[INSTRUMENTATION_OK_HTTP_CLIENT_ENABLED] +} diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/clients/SpringWebClientTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/clients/SpringWebClientTransformer.kt index 8e8a460b..4e1edb86 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/clients/SpringWebClientTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/clients/SpringWebClientTransformer.kt @@ -15,7 +15,13 @@ */ package com.epam.drill.agent.instrument.clients +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_APACHE_HTTP_CLIENT_ENABLED +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_SPRING_WEB_CLIENT_ENABLED +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object SpringWebClientTransformer : TransformerObject, AbstractTransformerObject() \ No newline at end of file +actual object SpringWebClientTransformer : TransformerObject, AbstractTransformerObject() { + override fun enabled() = super.enabled() && Configuration.parameters[INSTRUMENTATION_SPRING_WEB_CLIENT_ENABLED] +} \ No newline at end of file diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty10WsMessagesTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty10WsMessagesTransformer.kt index 796a3417..5cb074a9 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty10WsMessagesTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty10WsMessagesTransformer.kt @@ -15,7 +15,12 @@ */ package com.epam.drill.agent.instrument.jetty +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractWsTransformerObject +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_APACHE_HTTP_CLIENT_ENABLED +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_WS_ENABLED +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object Jetty10WsMessagesTransformer : TransformerObject, AbstractTransformerObject() +actual object Jetty10WsMessagesTransformer : TransformerObject, AbstractWsTransformerObject() \ No newline at end of file diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty11WsMessagesTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty11WsMessagesTransformer.kt index ecb89f1e..471b9b83 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty11WsMessagesTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty11WsMessagesTransformer.kt @@ -15,7 +15,8 @@ */ package com.epam.drill.agent.instrument.jetty -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractWsTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object Jetty11WsMessagesTransformer : TransformerObject, AbstractTransformerObject() +actual object Jetty11WsMessagesTransformer : TransformerObject, AbstractWsTransformerObject() diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty9WsMessagesTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty9WsMessagesTransformer.kt index 906630a5..cb9c1253 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty9WsMessagesTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/Jetty9WsMessagesTransformer.kt @@ -15,7 +15,12 @@ */ package com.epam.drill.agent.instrument.jetty +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractWsTransformerObject +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_APACHE_HTTP_CLIENT_ENABLED +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_WS_ENABLED +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object Jetty9WsMessagesTransformer : TransformerObject, AbstractTransformerObject() +actual object Jetty9WsMessagesTransformer : TransformerObject, AbstractWsTransformerObject() diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyHttpServerTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyHttpServerTransformer.kt index 757f2992..b9d8c319 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyHttpServerTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyHttpServerTransformer.kt @@ -15,7 +15,11 @@ */ package com.epam.drill.agent.instrument.jetty -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractHttpTransformerObject +import com.epam.drill.agent.instrument.JETTY_SERVER_HANDLER import com.epam.drill.agent.instrument.TransformerObject -actual object JettyHttpServerTransformer : TransformerObject, AbstractTransformerObject() +actual object JettyHttpServerTransformer : TransformerObject, AbstractHttpTransformerObject() { + override fun permit(className: String, superName: String?, interfaces: Array) = + JETTY_SERVER_HANDLER == className +} diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyWsClientTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyWsClientTransformer.kt index 1f9e220b..1166e255 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyWsClientTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyWsClientTransformer.kt @@ -15,7 +15,8 @@ */ package com.epam.drill.agent.instrument.jetty -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractWsTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object JettyWsClientTransformer : TransformerObject, AbstractTransformerObject() +actual object JettyWsClientTransformer : TransformerObject, AbstractWsTransformerObject() diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyWsServerTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyWsServerTransformer.kt index e177416a..8159e9d9 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyWsServerTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/jetty/JettyWsServerTransformer.kt @@ -15,7 +15,8 @@ */ package com.epam.drill.agent.instrument.jetty -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractWsTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object JettyWsServerTransformer : TransformerObject, AbstractTransformerObject() +actual object JettyWsServerTransformer : TransformerObject, AbstractWsTransformerObject() diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/netty/NettyHttpServerTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/netty/NettyHttpServerTransformer.kt index 24fc20ec..9dff80d8 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/netty/NettyHttpServerTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/netty/NettyHttpServerTransformer.kt @@ -15,9 +15,16 @@ */ package com.epam.drill.agent.instrument.netty -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractHttpTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject +import com.epam.drill.agent.instrument.NETTY_CHANNEL_HANDLER_CONTEXT import com.epam.drill.agent.instrument.TransformerObject -actual object NettyHttpServerTransformer : TransformerObject, AbstractTransformerObject() { - const val HANDLER_CONTEXT = "io/netty/channel/AbstractChannelHandlerContext" +actual object NettyHttpServerTransformer : TransformerObject, AbstractHttpTransformerObject() { + + override fun permit( + className: String, + superName: String?, + interfaces: Array + ): Boolean = '$' !in className && className.startsWith(NETTY_CHANNEL_HANDLER_CONTEXT) } diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsClientTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsClientTransformer.kt index 1581eef3..aee92da0 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsClientTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsClientTransformer.kt @@ -15,7 +15,8 @@ */ package com.epam.drill.agent.instrument.netty -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractWsTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object NettyWsClientTransformer : TransformerObject, AbstractTransformerObject() +actual object NettyWsClientTransformer : TransformerObject, AbstractWsTransformerObject() diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsMessagesTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsMessagesTransformer.kt index d7be5c4b..90e32c00 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsMessagesTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsMessagesTransformer.kt @@ -15,7 +15,8 @@ */ package com.epam.drill.agent.instrument.netty -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractWsTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object NettyWsMessagesTransformer : TransformerObject, AbstractTransformerObject() +actual object NettyWsMessagesTransformer : TransformerObject, AbstractWsTransformerObject() diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsServerTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsServerTransformer.kt index eaed5025..0a21b76c 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsServerTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/netty/NettyWsServerTransformer.kt @@ -15,7 +15,8 @@ */ package com.epam.drill.agent.instrument.netty -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractWsTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object NettyWsServerTransformer : TransformerObject, AbstractTransformerObject() +actual object NettyWsServerTransformer : TransformerObject, AbstractWsTransformerObject() diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/CadenceTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/CadenceTransformer.kt index e0e05ce1..eb57d01e 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/CadenceTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/CadenceTransformer.kt @@ -15,7 +15,17 @@ */ package com.epam.drill.agent.instrument.servers +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject +import com.epam.drill.agent.instrument.CADENCE_CONSUMER +import com.epam.drill.agent.instrument.CADENCE_PRODUCER +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_CADENCE_ENABLED -actual object CadenceTransformer : TransformerObject, AbstractTransformerObject() + +actual object CadenceTransformer : TransformerObject, AbstractTransformerObject() { + override fun enabled() = super.enabled() && Configuration.parameters[INSTRUMENTATION_CADENCE_ENABLED] + override fun permit(className: String, superName: String?, interfaces: Array) = + CADENCE_PRODUCER == className || CADENCE_CONSUMER == className +} diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/CompatibilityTestsTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/CompatibilityTestsTransformer.kt index 6694a0c9..bd1c5784 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/CompatibilityTestsTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/CompatibilityTestsTransformer.kt @@ -15,7 +15,14 @@ */ package com.epam.drill.agent.instrument.servers +import com.epam.drill.agent.configuration.Configuration +import com.epam.drill.agent.configuration.ParameterDefinitions import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_COMPATIBILITY_TESTS_ENABLED +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_WS_ENABLED +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object CompatibilityTestsTransformer : TransformerObject, AbstractTransformerObject() \ No newline at end of file +actual object CompatibilityTestsTransformer : TransformerObject, AbstractTransformerObject() { + override fun enabled() = super.enabled() && Configuration.parameters[INSTRUMENTATION_COMPATIBILITY_TESTS_ENABLED] +} \ No newline at end of file diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/KafkaTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/KafkaTransformer.kt index 2e8e9221..e44e2793 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/KafkaTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/KafkaTransformer.kt @@ -15,7 +15,15 @@ */ package com.epam.drill.agent.instrument.servers +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_KAFKA_ENABLED +import com.epam.drill.agent.instrument.KAFKA_CONSUMER_SPRING +import com.epam.drill.agent.instrument.KAFKA_PRODUCER_INTERFACE import com.epam.drill.agent.instrument.TransformerObject -actual object KafkaTransformer : TransformerObject, AbstractTransformerObject() +actual object KafkaTransformer : TransformerObject, AbstractTransformerObject() { + override fun enabled() = super.enabled() && Configuration.parameters[INSTRUMENTATION_KAFKA_ENABLED] + override fun permit(className: String, superName: String?, interfaces: Array) = + KAFKA_CONSUMER_SPRING == className || interfaces.contains(KAFKA_PRODUCER_INTERFACE) +} diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/ReactorTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/ReactorTransformer.kt index 472b1c03..4fbebdab 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/ReactorTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/ReactorTransformer.kt @@ -15,7 +15,8 @@ */ package com.epam.drill.agent.instrument.servers -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractReactTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object ReactorTransformer: TransformerObject, AbstractTransformerObject() \ No newline at end of file +actual object ReactorTransformer: TransformerObject, AbstractReactTransformerObject() \ No newline at end of file diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/SSLEngineTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/SSLEngineTransformer.kt index dac71dd1..265ea35a 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/SSLEngineTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/SSLEngineTransformer.kt @@ -15,9 +15,20 @@ */ package com.epam.drill.agent.instrument.servers +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_SSL_ENABLED +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_WS_ENABLED +import com.epam.drill.agent.instrument.JvmTransformerObject +import com.epam.drill.agent.instrument.SSL_ENGINE_CLASS_NAME import com.epam.drill.agent.instrument.TransformerObject actual object SSLEngineTransformer : TransformerObject, AbstractTransformerObject() { - const val SSL_ENGINE_CLASS_NAME = "javax/net/ssl/SSLEngine" + + override fun enabled() = super.enabled() && Configuration.parameters[INSTRUMENTATION_SSL_ENABLED] + override fun permit( + className: String, + superName: String?, + interfaces: Array + ): Boolean = superName == SSL_ENGINE_CLASS_NAME } diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/TTLTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/TTLTransformer.kt index 664576bf..84891034 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/TTLTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/servers/TTLTransformer.kt @@ -15,7 +15,11 @@ */ package com.epam.drill.agent.instrument.servers +import com.epam.drill.agent.configuration.Configuration import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_TTL_ENABLED +import com.epam.drill.agent.instrument.InstrumentationParameterDefinitions.INSTRUMENTATION_WS_ENABLED +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject actual object TTLTransformer : TransformerObject, AbstractTransformerObject() { @@ -29,4 +33,21 @@ actual object TTLTransformer : TransformerObject, AbstractTransformerObject() { const val runnableInterface = "java/lang/Runnable" const val poolExecutor = "java/util/concurrent/ThreadPoolExecutor" const val jdkInternal = "jdk/internal" + + override fun enabled() = super.enabled() && Configuration.parameters[INSTRUMENTATION_TTL_ENABLED] + override fun precheck( + className: String, + loader: Any?, + protectionDomain: Any? + ): Boolean = loader != null && protectionDomain != null || className in directTtlClasses + + override fun permit( + className: String, + superName: String?, + interfaces: Array + ): Boolean = className in directTtlClasses + || (className != timerTaskClass + && (runnableInterface in interfaces.filterNotNull() + || superName == poolExecutor)) + && !className.startsWith(jdkInternal) } diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatHttpServerTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatHttpServerTransformer.kt index 81f3a1bd..ae8b2069 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatHttpServerTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatHttpServerTransformer.kt @@ -15,7 +15,12 @@ */ package com.epam.drill.agent.instrument.tomcat -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractHttpTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject +import com.epam.drill.agent.instrument.TOMCAT_HTTP_FILTER import com.epam.drill.agent.instrument.TransformerObject -actual object TomcatHttpServerTransformer : TransformerObject, AbstractTransformerObject() +actual object TomcatHttpServerTransformer : TransformerObject, AbstractHttpTransformerObject() { + override fun permit(className: String, superName: String?, interfaces: Array) = + TOMCAT_HTTP_FILTER == className +} diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsClientTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsClientTransformer.kt index 049a09ac..f5d8c039 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsClientTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsClientTransformer.kt @@ -15,7 +15,8 @@ */ package com.epam.drill.agent.instrument.tomcat -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractWsTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object TomcatWsClientTransformer : TransformerObject, AbstractTransformerObject() +actual object TomcatWsClientTransformer : TransformerObject, AbstractWsTransformerObject() diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsMessagesTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsMessagesTransformer.kt index 39cd79d7..8a863048 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsMessagesTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsMessagesTransformer.kt @@ -15,7 +15,8 @@ */ package com.epam.drill.agent.instrument.tomcat -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractWsTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object TomcatWsMessagesTransformer : TransformerObject, AbstractTransformerObject() +actual object TomcatWsMessagesTransformer : TransformerObject, AbstractWsTransformerObject() diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsServerTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsServerTransformer.kt index bf3d4e41..31095dc3 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsServerTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/tomcat/TomcatWsServerTransformer.kt @@ -15,7 +15,8 @@ */ package com.epam.drill.agent.instrument.tomcat -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractWsTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object TomcatWsServerTransformer : TransformerObject, AbstractTransformerObject() +actual object TomcatWsServerTransformer : TransformerObject, AbstractWsTransformerObject() diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowHttpServerTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowHttpServerTransformer.kt index ca39fee8..3d006b81 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowHttpServerTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowHttpServerTransformer.kt @@ -15,7 +15,12 @@ */ package com.epam.drill.agent.instrument.undertow -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractHttpTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject +import com.epam.drill.agent.instrument.UNDERTOW_SERVER_CONNECTORS -actual object UndertowHttpServerTransformer : TransformerObject, AbstractTransformerObject() +actual object UndertowHttpServerTransformer : TransformerObject, AbstractHttpTransformerObject() { + override fun permit(className: String, superName: String?, interfaces: Array) = + UNDERTOW_SERVER_CONNECTORS == className +} diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsClientTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsClientTransformer.kt index 121ae64b..f7dec9a2 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsClientTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsClientTransformer.kt @@ -15,7 +15,8 @@ */ package com.epam.drill.agent.instrument.undertow -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractWsTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object UndertowWsClientTransformer : TransformerObject, AbstractTransformerObject() +actual object UndertowWsClientTransformer : TransformerObject, AbstractWsTransformerObject() diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsMessagesTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsMessagesTransformer.kt index f99ebe2a..67f99e63 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsMessagesTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsMessagesTransformer.kt @@ -15,7 +15,8 @@ */ package com.epam.drill.agent.instrument.undertow -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractWsTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object UndertowWsMessagesTransformer : TransformerObject, AbstractTransformerObject() +actual object UndertowWsMessagesTransformer : TransformerObject, AbstractWsTransformerObject() diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsServerTransformer.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsServerTransformer.kt index 1980e91a..f8923a52 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsServerTransformer.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/instrument/undertow/UndertowWsServerTransformer.kt @@ -15,7 +15,8 @@ */ package com.epam.drill.agent.instrument.undertow -import com.epam.drill.agent.instrument.AbstractTransformerObject +import com.epam.drill.agent.instrument.AbstractWsTransformerObject +import com.epam.drill.agent.instrument.JvmTransformerObject import com.epam.drill.agent.instrument.TransformerObject -actual object UndertowWsServerTransformer : TransformerObject, AbstractTransformerObject() +actual object UndertowWsServerTransformer : TransformerObject, AbstractWsTransformerObject() diff --git a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/jvmti/ClassFileLoadHook.kt b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/jvmti/ClassFileLoadHook.kt index 111af679..affe5f93 100644 --- a/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/jvmti/ClassFileLoadHook.kt +++ b/java-agent/src/nativeMain/kotlin/com/epam/drill/agent/jvmti/ClassFileLoadHook.kt @@ -15,26 +15,8 @@ */ package com.epam.drill.agent.jvmti -import com.epam.drill.agent.configuration.Configuration -import com.epam.drill.agent.configuration.ParameterDefinitions -import com.epam.drill.agent.instrument.CADENCE_CONSUMER -import com.epam.drill.agent.instrument.CADENCE_PRODUCER -import com.epam.drill.agent.instrument.KAFKA_CONSUMER_SPRING -import com.epam.drill.agent.instrument.KAFKA_PRODUCER_INTERFACE -import com.epam.drill.agent.instrument.clients.ApacheHttpClientTransformer -import com.epam.drill.agent.instrument.clients.JavaHttpClientTransformer -import com.epam.drill.agent.instrument.clients.OkHttp3ClientTransformer -import com.epam.drill.agent.instrument.clients.SpringWebClientTransformer -import com.epam.drill.agent.instrument.servers.ReactorTransformer import com.epam.drill.agent.instrument.servers.* -import com.epam.drill.agent.instrument.jetty.* -import com.epam.drill.agent.instrument.netty.* -import com.epam.drill.agent.instrument.tomcat.* -import com.epam.drill.agent.instrument.undertow.* -import com.epam.drill.agent.interceptor.HttpInterceptorConfigurer -import com.epam.drill.agent.module.InstrumentationAgentModule -import com.epam.drill.agent.module.JvmModuleStorage -import com.epam.drill.agent.common.classloading.ClassSource +import com.epam.drill.agent.instrument.TransformerRegistrar import com.epam.drill.agent.jvmapi.gen.Allocate import com.epam.drill.agent.jvmapi.gen.jint import com.epam.drill.agent.jvmapi.gen.jintVar @@ -51,35 +33,6 @@ object ClassFileLoadHook { private const val DRILL_PACKAGE = "com/epam/drill/agent" private val logger = KotlinLogging.logger("com.epam.drill.agent.jvmti.ClassFileLoadHook") - - private val strategies = listOf( - JavaHttpClientTransformer, ApacheHttpClientTransformer, OkHttp3ClientTransformer, - ReactorTransformer, SpringWebClientTransformer - ) - private val wsStrategies = listOf( - JettyWsClientTransformer, - JettyWsServerTransformer, - Jetty9WsMessagesTransformer, - Jetty10WsMessagesTransformer, - Jetty11WsMessagesTransformer, - NettyWsClientTransformer, - NettyWsServerTransformer, - NettyWsMessagesTransformer, - TomcatWsClientTransformer, - TomcatWsServerTransformer, - TomcatWsMessagesTransformer, - UndertowWsClientTransformer, - UndertowWsServerTransformer, - UndertowWsMessagesTransformer - ) - - private val isAsyncApp = Configuration.parameters[ParameterDefinitions.IS_ASYNC_APP] - private val isTlsApp = Configuration.parameters[ParameterDefinitions.IS_TLS_APP] - private val isWebApp = Configuration.parameters[ParameterDefinitions.IS_WEB_APP] - private val isKafka = Configuration.parameters[ParameterDefinitions.IS_KAFKA] - private val isCadence = Configuration.parameters[ParameterDefinitions.IS_CADENCE] - private val isCompatibilityTests = Configuration.parameters[ParameterDefinitions.IS_COMPATIBILITY_TESTS] - private val totalTransformClass = AtomicInt(0) @OptIn(ExperimentalForeignApi::class) @@ -94,112 +47,48 @@ object ClassFileLoadHook { ) { initRuntimeIfNeeded() val kClassName = clsName?.toKString() ?: return - if (isBootstrapClassLoading(loader, protectionDomain) && !when { - kClassName.contains("Http") -> true // raw hack for Http(s) URL Connection classes - kClassName in TTLTransformer.directTtlClasses -> true - else -> false - } - ) return - if (classData == null || kClassName.startsWith(DRILL_PACKAGE)) return - try { + val kClassData = classData ?: return + + val precheckedTransformers = TransformerRegistrar.enabledTransformers + .filterNot { kClassName.startsWith(DRILL_PACKAGE) } + .filter { it.precheck(kClassName, loader, protectionDomain) } + .takeIf { it.any() } + ?: return + + val (oldClassBytes, reader) = runCatching { val classBytes = ByteArray(classDataLen).apply { - Memory.of(classData, classDataLen).loadByteArray(0, this) - } - val transformers = mutableListOf<(ByteArray) -> ByteArray?>() - val classReader = ClassReader(classBytes) - val superName = classReader.superName ?: "" - val interfaces = classReader.interfaces.filterNotNull() - //TODO needs refactoring EPMDJ-8528 - if (isAsyncApp || isWebApp) { - if (isAsyncApp && isTTLCandidate(kClassName, superName, interfaces)) { - transformers += { bytes -> - TTLTransformer.transform( - kClassName, - bytes, - loader, - protectionDomain - ) - } - } - if (superName == SSLEngineTransformer.SSL_ENGINE_CLASS_NAME) { - transformers += { bytes -> SSLEngineTransformer.transform(kClassName, bytes, loader, protectionDomain) } - } + Memory.of(kClassData, classDataLen).loadByteArray(0, this) } + classBytes to ClassReader(classBytes) + }.onFailure { + logger.error(it) { "Can't read class: $kClassName" } + }.getOrNull() ?: return - if (isKafka) { - if (KAFKA_PRODUCER_INTERFACE in interfaces) { - transformers += { bytes -> - KafkaTransformer.transform(KAFKA_PRODUCER_INTERFACE, bytes, loader, protectionDomain) - } - } - if (kClassName == KAFKA_CONSUMER_SPRING) { - transformers += { bytes -> - KafkaTransformer.transform(KAFKA_CONSUMER_SPRING, bytes, loader, protectionDomain) - } - } - } - if (isCadence) { - if (CADENCE_PRODUCER == kClassName || CADENCE_CONSUMER == kClassName) { - transformers += { bytes -> CadenceTransformer.transform(kClassName, bytes, loader, protectionDomain ) } - } - } - if (isCompatibilityTests) { - /** - * Uses for compatibility tests https://github.com/Drill4J/internal-compatibility-matrix-tests. - */ - if (CompatibilityTestsTransformer.permit(classReader.className, classReader.superName, classReader.interfaces)) { - transformers += { bytes -> CompatibilityTestsTransformer.transform(kClassName, bytes, loader, protectionDomain) } - } - } - val classSource = ClassSource(kClassName, classReader.superName ?: "", classBytes) - if ('$' !in kClassName && classSource.prefixMatches(Configuration.agentMetadata.packagesPrefixes)) { - JvmModuleStorage.values().filterIsInstance().forEach { plugin -> - transformers += { bytes -> plugin.instrument(kClassName, bytes) } - } - } - if (!HttpInterceptorConfigurer.enabled) { - if (kClassName.startsWith("org/apache/catalina/core/ApplicationFilterChain")) { - transformers += { bytes -> TomcatHttpServerTransformer.transform(kClassName, bytes, loader, protectionDomain) } - } - if (kClassName == "org/eclipse/jetty/server/handler/HandlerWrapper") { - transformers += { bytes -> JettyHttpServerTransformer.transform(kClassName, bytes, loader, protectionDomain) } - } - if (kClassName == "io/undertow/server/Connectors") { - transformers += { bytes -> UndertowHttpServerTransformer.transform(kClassName, bytes, loader, protectionDomain) } - } - strategies.forEach { strategy -> - if (strategy.permit(classReader.className, classReader.superName, classReader.interfaces)) { - transformers += { bytes -> strategy.transform(kClassName, bytes, loader, protectionDomain) } - } - } - wsStrategies.forEach { strategy -> - if (strategy.permit(classReader.className, classReader.superName, classReader.interfaces)) { - transformers += { bytes -> strategy.transform(kClassName, bytes, loader, protectionDomain) } - } - } - } - // TODO Http hook does not work for Netty on linux system - if ('$' !in kClassName && kClassName.startsWith(NettyHttpServerTransformer.HANDLER_CONTEXT)) { - logger.info { "Starting transform Netty class kClassName $kClassName..." } - transformers += { bytes -> - NettyHttpServerTransformer.transform(kClassName, bytes, loader, protectionDomain) - } - } - if (transformers.any()) { - transformers.fold(classBytes) { bytes, transformer -> - transformer(bytes) ?: bytes - }.takeIf { it !== classBytes }?.let { newBytes -> - logger.trace { "$kClassName transformed" } - totalTransformClass.addAndGet(1).takeIf { it % 100 == 0 }?.let { - logger.trace { "$it classes are transformed" } - } - convertToNativePointers(newBytes, newData, newClassDataLen) - } - } - } catch (throwable: Throwable) { - logger.error(throwable) { - "Can't retransform class: $kClassName, ${classData.readBytes(classDataLen).contentToString()}" + val permittedTransformers = precheckedTransformers.filter { + it.permit( + kClassName, + reader.superName, + reader.interfaces + ) + } + + val newClassBytes = permittedTransformers.fold(oldClassBytes) { bytes, transformer -> + runCatching { + transformer.transform(kClassName, bytes, loader, protectionDomain) + }.onFailure { + logger.warn(it) { "Can't transform class: $kClassName with ${transformer::class.simpleName}" } + }.getOrNull() + ?.takeIf { it !== bytes } + ?.also { + logger.debug { "$kClassName was transformed by ${transformer::class.simpleName}" } + } ?: bytes + } + + if (newClassBytes !== oldClassBytes) { + totalTransformClass.addAndGet(1).takeIf { it % 100 == 0 }?.let { + logger.debug { "At least $it classes were transformed" } } + convertToNativePointers(newClassBytes, newData, newClassDataLen) } } diff --git a/java-agent/src/nativeTest/kotlin/com/epam/drill/agent/configuration/ValidationBuilderTest.kt b/java-agent/src/nativeTest/kotlin/com/epam/drill/agent/configuration/ValidationBuilderTest.kt index 3aa04f01..51046185 100644 --- a/java-agent/src/nativeTest/kotlin/com/epam/drill/agent/configuration/ValidationBuilderTest.kt +++ b/java-agent/src/nativeTest/kotlin/com/epam/drill/agent/configuration/ValidationBuilderTest.kt @@ -146,6 +146,11 @@ class ValidationBuilderTest { assertTrue { validPackage.validate(SomeObject("/com/example")) is Invalid } } + @Test + fun `given exclamation sign ahead of package validator must be valid`() { + assertTrue { validPackage.validate(SomeObject("!com/example")) is Valid } + } + private val logLevel = Validation { SomeObject::strToList onEach { isValidLogLevel() diff --git a/test2code/src/main/kotlin/com/epam/drill/agent/test2code/Test2Code.kt b/test2code/src/main/kotlin/com/epam/drill/agent/test2code/Test2Code.kt index bc19e215..db279ef9 100644 --- a/test2code/src/main/kotlin/com/epam/drill/agent/test2code/Test2Code.kt +++ b/test2code/src/main/kotlin/com/epam/drill/agent/test2code/Test2Code.kt @@ -36,6 +36,7 @@ import com.epam.drill.agent.test2code.classloading.ClassLoadersScanner import com.epam.drill.agent.test2code.classloading.ClassScanner import com.epam.drill.agent.test2code.classparsing.parseAstClass import com.epam.drill.agent.test2code.configuration.Test2CodeParameterDefinitions +import com.epam.drill.agent.test2code.configuration.Test2CodeParameterDefinitions.COVERAGE_COLLECTION_ENABLED import com.epam.drill.agent.test2code.coverage.* private const val DRILL_TEST_ID_HEADER = "drill-test-id" @@ -65,13 +66,17 @@ class Test2Code( sender = sender, collectProbes = { coverageManager.pollRecorded() } ) + private val coverageCollectionEnabled = configuration.parameters[COVERAGE_COLLECTION_ENABLED] + private val classScanningEnabled = configuration.parameters[Test2CodeParameterDefinitions.CLASS_SCANNING_ENABLED] override fun onConnect() {} override fun instrument( className: String, initialBytes: ByteArray, - ): ByteArray? = instrumenter.instrument(className, initialBytes) + ): ByteArray? = takeIf { coverageCollectionEnabled }?.let { + instrumenter.instrument(className, initialBytes) + } override fun load() { AgentParametersValidator(configuration.parameters).validate( @@ -81,8 +86,12 @@ class Test2Code( thread { scanAndSendMetadataClasses() } - coverageSender.startSendingCoverage() - Runtime.getRuntime().addShutdownHook(Thread { coverageSender.stopSendingCoverage() }) + if (coverageCollectionEnabled) { + coverageSender.startSendingCoverage() + Runtime.getRuntime().addShutdownHook(Thread { coverageSender.stopSendingCoverage() }) + } else { + logger.info { "Coverage collection is disabled" } + } } /** @@ -131,6 +140,10 @@ class Test2Code( * Scan, parse and send metadata classes to the admin side */ fun scanAndSendMetadataClasses() { + if (!classScanningEnabled) { + logger.info { "Class scanning is disabled" } + return + } var classCount = 0 var methodCount = 0 scanClasses { classes -> diff --git a/test2code/src/main/kotlin/com/epam/drill/agent/test2code/configuration/Test2CodeParameterDefinitions.kt b/test2code/src/main/kotlin/com/epam/drill/agent/test2code/configuration/Test2CodeParameterDefinitions.kt index 43d031db..fdc5547c 100644 --- a/test2code/src/main/kotlin/com/epam/drill/agent/test2code/configuration/Test2CodeParameterDefinitions.kt +++ b/test2code/src/main/kotlin/com/epam/drill/agent/test2code/configuration/Test2CodeParameterDefinitions.kt @@ -23,7 +23,7 @@ import com.epam.drill.agent.common.configuration.ValidationType import com.epam.drill.agent.configuration.isNotBlank import com.epam.drill.agent.configuration.minDuration -object Test2CodeParameterDefinitions: AgentParameterDefinitionCollection() { +object Test2CodeParameterDefinitions : AgentParameterDefinitionCollection() { val SCAN_CLASS_PATH = AgentParameterDefinition.forList( name = "scanClassPath", @@ -58,5 +58,15 @@ object Test2CodeParameterDefinitions: AgentParameterDefinitionCollection() { name = "methodsSendPageSize", defaultValue = 1000 ).register() + val COVERAGE_COLLECTION_ENABLED = AgentParameterDefinition.forBoolean( + name = "coverageCollectionEnabled", + description = "Enable/disable application code coverage collection", + defaultValue = true + ).register() + val CLASS_SCANNING_ENABLED = AgentParameterDefinition.forBoolean( + name = "classScanningEnabled", + description = "Enable/disable application classes scanning", + defaultValue = true + ).register() } diff --git a/test2code/src/main/kotlin/com/epam/drill/agent/test2code/coverage/CoverageSender.kt b/test2code/src/main/kotlin/com/epam/drill/agent/test2code/coverage/CoverageSender.kt index f4e5a8c5..cc60dd88 100644 --- a/test2code/src/main/kotlin/com/epam/drill/agent/test2code/coverage/CoverageSender.kt +++ b/test2code/src/main/kotlin/com/epam/drill/agent/test2code/coverage/CoverageSender.kt @@ -49,7 +49,7 @@ class IntervalCoverageSender( intervalMs, TimeUnit.MILLISECONDS ) - logger.debug { "Coverage sending job is started." } + logger.info { "Coverage sending job is started." } } override fun stopSendingCoverage() {