From ac89dc0235c896cc60264d2a2519562fc4faef54 Mon Sep 17 00:00:00 2001 From: Jongho Moon Date: Tue, 15 Sep 2015 12:33:53 +0900 Subject: [PATCH] Extract logback plugin --- agent/pom.xml | 2 + .../pinpoint/plugin/log4j/Log4jIT.java | 2 +- .../pinpoint/plugin/logback/LogbackIT.java | 40 +++++++++++ .../pinpoint/plugin/log4j/Log4jPlugin.java | 11 +-- plugins/logback/.gitignore | 5 ++ plugins/logback/clover.license | 5 ++ plugins/logback/pom.xml | 27 ++++++++ .../plugin/logback/LogbackPlugin.java | 68 +++++++++++++++++++ .../LoggingEventOfLogbackInterceptor.java | 53 +++++++-------- ...p.pinpoint.bootstrap.plugin.ProfilerPlugin | 1 + plugins/pom.xml | 6 ++ .../LoggingEventOfLogbackInterceptor.java | 57 ++++++++++++++++ 12 files changed, 240 insertions(+), 37 deletions(-) create mode 100644 agent/src/test/java/com/navercorp/pinpoint/plugin/logback/LogbackIT.java create mode 100644 plugins/logback/.gitignore create mode 100644 plugins/logback/clover.license create mode 100644 plugins/logback/pom.xml create mode 100644 plugins/logback/src/main/java/com/navercorp/pinpoint/plugin/logback/LogbackPlugin.java create mode 100644 plugins/logback/src/main/resources/META-INF/services/com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/log/logback/interceptor/LoggingEventOfLogbackInterceptor.java diff --git a/agent/pom.xml b/agent/pom.xml index a59627a21..a3e89eead 100644 --- a/agent/pom.xml +++ b/agent/pom.xml @@ -40,6 +40,7 @@ pinpoint-test test + org.springframework spring-test @@ -55,6 +56,7 @@ spring-webmvc test + javax.servlet javax.servlet-api diff --git a/agent/src/test/java/com/navercorp/pinpoint/plugin/log4j/Log4jIT.java b/agent/src/test/java/com/navercorp/pinpoint/plugin/log4j/Log4jIT.java index bdb9a3cd3..899d3db07 100644 --- a/agent/src/test/java/com/navercorp/pinpoint/plugin/log4j/Log4jIT.java +++ b/agent/src/test/java/com/navercorp/pinpoint/plugin/log4j/Log4jIT.java @@ -25,7 +25,7 @@ import com.navercorp.pinpoint.test.plugin.Dependency; import com.navercorp.pinpoint.test.plugin.PinpointPluginTestSuite; @RunWith(PinpointPluginTestSuite.class) -@Dependency({"log4j:log4j:[1.1.3],[1.2.17,)"}) +@Dependency({"log4j:log4j:[1.2.16,)"}) public class Log4jIT { @Test diff --git a/agent/src/test/java/com/navercorp/pinpoint/plugin/logback/LogbackIT.java b/agent/src/test/java/com/navercorp/pinpoint/plugin/logback/LogbackIT.java new file mode 100644 index 000000000..01033ea1f --- /dev/null +++ b/agent/src/test/java/com/navercorp/pinpoint/plugin/logback/LogbackIT.java @@ -0,0 +1,40 @@ +/** +z * Copyright 2014 NAVER Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.navercorp.pinpoint.plugin.logback; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; + +import com.navercorp.pinpoint.test.plugin.Dependency; +import com.navercorp.pinpoint.test.plugin.PinpointPluginTestSuite; + +@RunWith(PinpointPluginTestSuite.class) +@Dependency({"ch.qos.logback:logback-classic:[1.0.13],[1.1.3,)", "org.slf4j:slf4j-api:1.7.12"}) +public class LogbackIT { + + @Test + public void test() throws Exception { + Logger logger = LoggerFactory.getLogger(getClass()); + logger.error("maru"); + + Assert.assertNotNull(MDC.get("PtxId")); + Assert.assertNotNull(MDC.get("PspanId")); + } +} diff --git a/plugins/log4j/src/main/java/com/navercorp/pinpoint/plugin/log4j/Log4jPlugin.java b/plugins/log4j/src/main/java/com/navercorp/pinpoint/plugin/log4j/Log4jPlugin.java index 08d40addc..f5db7dec6 100644 --- a/plugins/log4j/src/main/java/com/navercorp/pinpoint/plugin/log4j/Log4jPlugin.java +++ b/plugins/log4j/src/main/java/com/navercorp/pinpoint/plugin/log4j/Log4jPlugin.java @@ -15,8 +15,6 @@ */ package com.navercorp.pinpoint.plugin.log4j; -import static com.navercorp.pinpoint.common.trace.HistogramSchema.*; - import java.security.ProtectionDomain; import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; @@ -27,15 +25,10 @@ import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin; import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPluginInstrumentContext; import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPluginSetupContext; import com.navercorp.pinpoint.bootstrap.plugin.transformer.PinpointClassFileTransformer; -import com.navercorp.pinpoint.common.trace.AnnotationKey; -import com.navercorp.pinpoint.common.trace.ServiceType; public class Log4jPlugin implements ProfilerPlugin { private final PLogger logger = PLoggerFactory.getLogger(getClass()); - public static final ServiceType GSON_SERVICE_TYPE = ServiceType.of(5010, "GSON", NORMAL_SCHEMA); - public static final AnnotationKey GSON_ANNOTATION_KEY_JSON_LENGTH = new AnnotationKey(9000, "gson.json.length"); - @Override public void setup(ProfilerPluginSetupContext context) { context.addClassFileTransformer("org.apache.log4j.spi.LoggingEvent", new PinpointClassFileTransformer() { @@ -49,11 +42,11 @@ public class Log4jPlugin implements ProfilerPlugin { return null; } - if (!mdcClass.hasMethod("put", new String[]{"java.lang.String", "java.lang.Object"})) { + if (!mdcClass.hasMethod("put", "java.lang.String", "java.lang.Object")) { logger.warn("modify fail. Because put method does not exist at org.apache.log4j.MDC class."); return null; } - if (!mdcClass.hasMethod("remove", new String[]{"java.lang.String"})) { + if (!mdcClass.hasMethod("remove", "java.lang.String")) { logger.warn("modify fail. Because remove method does not exist at org.apache.log4j.MDC class."); return null; } diff --git a/plugins/logback/.gitignore b/plugins/logback/.gitignore new file mode 100644 index 000000000..8c2d47305 --- /dev/null +++ b/plugins/logback/.gitignore @@ -0,0 +1,5 @@ +/target/ +/.settings/ +/.classpath +/.project +/*.iml diff --git a/plugins/logback/clover.license b/plugins/logback/clover.license new file mode 100644 index 000000000..569fa6175 --- /dev/null +++ b/plugins/logback/clover.license @@ -0,0 +1,5 @@ +RMRqrdbgbKFhbaVnDxHUdDQvrOQXxIBklnvcmahheubVC +mh2KM35CLkwUHS4DH7QVhxy52J5hnWbyEm6Cyd3KkF + 4.0.0 + + com.navercorp.pinpoint + pom + ../.. + 1.5.0-SNAPSHOT + + + pinpoint-logback-plugin + pinpoint-logback-plugin + jar + + + + com.navercorp.pinpoint + pinpoint-bootstrap-core + provided + + + org.slf4j + slf4j-api + provided + + + diff --git a/plugins/logback/src/main/java/com/navercorp/pinpoint/plugin/logback/LogbackPlugin.java b/plugins/logback/src/main/java/com/navercorp/pinpoint/plugin/logback/LogbackPlugin.java new file mode 100644 index 000000000..ed2243819 --- /dev/null +++ b/plugins/logback/src/main/java/com/navercorp/pinpoint/plugin/logback/LogbackPlugin.java @@ -0,0 +1,68 @@ +/** + * Copyright 2014 NAVER Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.navercorp.pinpoint.plugin.logback; + +import static com.navercorp.pinpoint.common.trace.HistogramSchema.*; + +import java.security.ProtectionDomain; + +import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; +import com.navercorp.pinpoint.bootstrap.instrument.InstrumentException; +import com.navercorp.pinpoint.bootstrap.logging.PLogger; +import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; +import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin; +import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPluginInstrumentContext; +import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPluginSetupContext; +import com.navercorp.pinpoint.bootstrap.plugin.transformer.PinpointClassFileTransformer; +import com.navercorp.pinpoint.common.trace.AnnotationKey; +import com.navercorp.pinpoint.common.trace.ServiceType; + +public class LogbackPlugin implements ProfilerPlugin { + private final PLogger logger = PLoggerFactory.getLogger(getClass()); + + public static final ServiceType GSON_SERVICE_TYPE = ServiceType.of(5010, "GSON", NORMAL_SCHEMA); + public static final AnnotationKey GSON_ANNOTATION_KEY_JSON_LENGTH = new AnnotationKey(9000, "gson.json.length"); + + @Override + public void setup(ProfilerPluginSetupContext context) { + context.addClassFileTransformer("ch.qos.logback.classic.spi.LoggingEvent", new PinpointClassFileTransformer() { + + @Override + public byte[] transform(ProfilerPluginInstrumentContext pluginContext, ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException { + InstrumentClass mdcClass = pluginContext.getInstrumentClass(loader, "org.slf4j.MDC", null); + + if (mdcClass == null) { + logger.warn("modify fail. Because org.slf4j.MDC does not exist."); + return null; + } + + if (!mdcClass.hasMethod("put", "java.lang.String", "java.lang.String")) { + logger.warn("modify fail. Because put method does not exist at org.slf4j.MDC class."); + return null; + } + if (!mdcClass.hasMethod("remove", "java.lang.String")) { + logger.warn("modify fail. Because remove method does not exist at org.slf4j.MDC class."); + return null; + } + + InstrumentClass target = pluginContext.getInstrumentClass(loader, className, classfileBuffer); + target.addInterceptor("com.navercorp.pinpoint.plugin.logback.interceptor.LoggingEventOfLogbackInterceptor"); + + return target.toBytecode(); + } + }); + } +} diff --git a/plugins/logback/src/main/java/com/navercorp/pinpoint/plugin/logback/interceptor/LoggingEventOfLogbackInterceptor.java b/plugins/logback/src/main/java/com/navercorp/pinpoint/plugin/logback/interceptor/LoggingEventOfLogbackInterceptor.java index c7b46c827..ba85fe608 100644 --- a/plugins/logback/src/main/java/com/navercorp/pinpoint/plugin/logback/interceptor/LoggingEventOfLogbackInterceptor.java +++ b/plugins/logback/src/main/java/com/navercorp/pinpoint/plugin/logback/interceptor/LoggingEventOfLogbackInterceptor.java @@ -13,45 +13,44 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.navercorp.pinpoint.profiler.modifier.log.logback.interceptor; +package com.navercorp.pinpoint.plugin.logback.interceptor; import org.slf4j.MDC; import com.navercorp.pinpoint.bootstrap.context.Trace; import com.navercorp.pinpoint.bootstrap.context.TraceContext; -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.navercorp.pinpoint.bootstrap.interceptor.TraceContextSupport; -import com.navercorp.pinpoint.profiler.modifier.log.MdcKey; +import com.navercorp.pinpoint.bootstrap.interceptor.BeforeInterceptor0; +import com.navercorp.pinpoint.bootstrap.plugin.annotation.TargetConstructor; +import com.navercorp.pinpoint.bootstrap.plugin.annotation.Targets; /** * @author minwoo.jung */ -public class LoggingEventOfLogbackInterceptor implements SimpleAroundInterceptor, TraceContextSupport, TargetClassLoader { +@Targets(constructors={ + @TargetConstructor({}), + @TargetConstructor({"java.lang.String", "ch.qos.logback.classic.Logger", "ch.qos.logback.classic.Level", "java.lang.String", "java.lang.Throwable", "java.lang.Object[]"}) +}) +public class LoggingEventOfLogbackInterceptor implements BeforeInterceptor0 { + private static final String TRANSACTION_ID = "PtxId"; + private static final String SPAN_ID = "PspanId"; - private TraceContext traceContext; + private final TraceContext traceContext; - @Override - public void before(Object target, Object[] args) { - Trace trace = traceContext.currentTraceObject(); - - if (trace == null) { - MDC.remove(MdcKey.TRANSACTION_ID); - MDC.remove(MdcKey.SPAN_ID); - return; - } else { - MDC.put(MdcKey.TRANSACTION_ID, trace.getTraceId().getTransactionId()); - MDC.put(MdcKey.SPAN_ID, String.valueOf(trace.getTraceId().getSpanId())); - } - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - } - - @Override - public void setTraceContext(TraceContext traceContext) { + public LoggingEventOfLogbackInterceptor(TraceContext traceContext) { this.traceContext = traceContext; } + @Override + public void before(Object target) { + Trace trace = traceContext.currentTraceObject(); + + if (trace == null) { + MDC.remove(TRANSACTION_ID); + MDC.remove(SPAN_ID); + return; + } else { + MDC.put(TRANSACTION_ID, trace.getTraceId().getTransactionId()); + MDC.put(SPAN_ID, String.valueOf(trace.getTraceId().getSpanId())); + } + } } diff --git a/plugins/logback/src/main/resources/META-INF/services/com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin b/plugins/logback/src/main/resources/META-INF/services/com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin new file mode 100644 index 000000000..69d0586bd --- /dev/null +++ b/plugins/logback/src/main/resources/META-INF/services/com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin @@ -0,0 +1 @@ +com.navercorp.pinpoint.plugin.logback.LogbackPlugin \ No newline at end of file diff --git a/plugins/pom.xml b/plugins/pom.xml index 0655ab09a..a5e464352 100644 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -37,6 +37,7 @@ mybatis okhttp log4j + logback @@ -165,6 +166,11 @@ pinpoint-log4j-plugin ${project.version} + + com.navercorp.pinpoint + pinpoint-logback-plugin + ${project.version} + diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/log/logback/interceptor/LoggingEventOfLogbackInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/log/logback/interceptor/LoggingEventOfLogbackInterceptor.java new file mode 100644 index 000000000..c7b46c827 --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/log/logback/interceptor/LoggingEventOfLogbackInterceptor.java @@ -0,0 +1,57 @@ +/* + * Copyright 2014 NAVER Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.navercorp.pinpoint.profiler.modifier.log.logback.interceptor; + +import org.slf4j.MDC; + +import com.navercorp.pinpoint.bootstrap.context.Trace; +import com.navercorp.pinpoint.bootstrap.context.TraceContext; +import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; +import com.navercorp.pinpoint.bootstrap.interceptor.TargetClassLoader; +import com.navercorp.pinpoint.bootstrap.interceptor.TraceContextSupport; +import com.navercorp.pinpoint.profiler.modifier.log.MdcKey; + +/** + * @author minwoo.jung + */ +public class LoggingEventOfLogbackInterceptor implements SimpleAroundInterceptor, TraceContextSupport, TargetClassLoader { + + private TraceContext traceContext; + + @Override + public void before(Object target, Object[] args) { + Trace trace = traceContext.currentTraceObject(); + + if (trace == null) { + MDC.remove(MdcKey.TRANSACTION_ID); + MDC.remove(MdcKey.SPAN_ID); + return; + } else { + MDC.put(MdcKey.TRANSACTION_ID, trace.getTraceId().getTransactionId()); + MDC.put(MdcKey.SPAN_ID, String.valueOf(trace.getTraceId().getSpanId())); + } + } + + @Override + public void after(Object target, Object[] args, Object result, Throwable throwable) { + } + + @Override + public void setTraceContext(TraceContext traceContext) { + this.traceContext = traceContext; + } + +}