From 5d94a4c5502b82de622c0084af9c684ceacfe9f2 Mon Sep 17 00:00:00 2001 From: Rajiv Date: Wed, 12 Dec 2018 15:38:49 +0530 Subject: [PATCH 1/4] Reorder setEncoder and setOutputStream logback v1.0.13 compatibility --- .../modules/logback/LogbackInstrumentationTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/ai/apptuit/metrics/jinsight/modules/logback/LogbackInstrumentationTest.java b/src/test/java/ai/apptuit/metrics/jinsight/modules/logback/LogbackInstrumentationTest.java index 497b840..88b6eb8 100644 --- a/src/test/java/ai/apptuit/metrics/jinsight/modules/logback/LogbackInstrumentationTest.java +++ b/src/test/java/ai/apptuit/metrics/jinsight/modules/logback/LogbackInstrumentationTest.java @@ -100,8 +100,7 @@ private Logger getLogger(String loggerName) { logEncoder.setPattern("%-12date{YYYY-MM-dd HH:mm:ss.SSS} %-5level - %msg%n"); logEncoder.start(); - testAppender = new TestAppender(logCtx); - testAppender.setEncoder(logEncoder); + testAppender = new TestAppender(logCtx, logEncoder); testAppender.start(); Logger log = logCtx.getLogger(loggerName); @@ -221,10 +220,11 @@ private static class TestAppender extends OutputStreamAppender { private ByteArrayOutputStream logBuffer = new ByteArrayOutputStream(); private String fingerprint; - public TestAppender(LoggerContext logCtx) { + public TestAppender(LoggerContext logCtx, PatternLayoutEncoder logEncoder) { super(); setContext(logCtx); setName("test"); + setEncoder(logEncoder); setOutputStream(logBuffer); } From 222a42a9dd84f385a07e2e123ac8fb6845b9f905 Mon Sep 17 00:00:00 2001 From: Rajiv Date: Wed, 12 Dec 2018 16:03:58 +0530 Subject: [PATCH 2/4] User reflection to access the non-relocated version of org.slf4j.MDC --- .../modules/logback/LogbackRuleHelper.java | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/main/java/ai/apptuit/metrics/jinsight/modules/logback/LogbackRuleHelper.java b/src/main/java/ai/apptuit/metrics/jinsight/modules/logback/LogbackRuleHelper.java index 5491a4b..a6cc54e 100644 --- a/src/main/java/ai/apptuit/metrics/jinsight/modules/logback/LogbackRuleHelper.java +++ b/src/main/java/ai/apptuit/metrics/jinsight/modules/logback/LogbackRuleHelper.java @@ -20,8 +20,8 @@ import ai.apptuit.metrics.jinsight.modules.logback.LogEventTracker.LogLevel; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.IThrowableProxy; +import java.lang.reflect.Method; import org.jboss.byteman.rule.Rule; -import org.slf4j.MDC; /** * @author Rajiv Shivane @@ -50,7 +50,7 @@ public void beforeBuildEvent(Throwable throwable) { ErrorFingerprint fingerprint = ErrorFingerprint.fromThrowable(throwable); if (fingerprint != null) { CURRENT_FINGERPRINT.set(fingerprint); - MDC.put(LogEventTracker.FINGERPRINT_PROPERTY_NAME, fingerprint.getChecksum()); + MdcProxy.setMDC(LogEventTracker.FINGERPRINT_PROPERTY_NAME, fingerprint.getChecksum()); } } @@ -59,7 +59,7 @@ public void afterBuildEvent(Throwable throwable) { return; } CURRENT_FINGERPRINT.remove(); - MDC.remove(LogEventTracker.FINGERPRINT_PROPERTY_NAME); + MdcProxy.removeMDC(LogEventTracker.FINGERPRINT_PROPERTY_NAME); } public String convertMessage(ILoggingEvent event, String origMessage) { @@ -70,4 +70,34 @@ public String convertMessage(ILoggingEvent event, String origMessage) { return "[error:" + fingerprint + "] " + origMessage; } + /** + * Wrapper to access slf4f.MDC + * We use reflection to access MDC as the slf4j package is being relocated and we want these properties to be set + * on the MDC loaded by the application and not on the relocated MDC packaged with JInsight + */ + static class MdcProxy { + + private static final String CLASS_NAME = new StringBuilder().append("org.").append("slf4j.").append("MDC") + .toString(); + + public static void setMDC(String propertyName, String propertyValue) { + try { + Class mdcClass = Class.forName(CLASS_NAME); + Method putMethod = mdcClass.getMethod("put", String.class, String.class); + putMethod.invoke(null, propertyName, propertyValue); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void removeMDC(String propertyName) { + try { + Class mdcClass = Class.forName(CLASS_NAME); + Method removeMethod = mdcClass.getMethod("remove", String.class); + removeMethod.invoke(null, propertyName); + } catch (Exception e) { + e.printStackTrace(); + } + } + } } From c5633c55015020a66b80729b42d74bdee620f4ed Mon Sep 17 00:00:00 2001 From: Rajiv Date: Wed, 12 Dec 2018 16:41:03 +0530 Subject: [PATCH 3/4] User bytecode to update org.slf4j.MDC to avoid relocation issues --- .../modules/logback/LogbackRuleHelper.java | 44 ++----------------- .../jinsight/modules/logback/logback.btm | 14 +++--- 2 files changed, 11 insertions(+), 47 deletions(-) diff --git a/src/main/java/ai/apptuit/metrics/jinsight/modules/logback/LogbackRuleHelper.java b/src/main/java/ai/apptuit/metrics/jinsight/modules/logback/LogbackRuleHelper.java index a6cc54e..32c766a 100644 --- a/src/main/java/ai/apptuit/metrics/jinsight/modules/logback/LogbackRuleHelper.java +++ b/src/main/java/ai/apptuit/metrics/jinsight/modules/logback/LogbackRuleHelper.java @@ -20,7 +20,6 @@ import ai.apptuit.metrics.jinsight.modules.logback.LogEventTracker.LogLevel; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.IThrowableProxy; -import java.lang.reflect.Method; import org.jboss.byteman.rule.Rule; /** @@ -43,23 +42,17 @@ public void appendersCalled(ILoggingEvent event) { tracker.track(level, (throwableProxy != null), throwable, fingerprint); } - public void beforeBuildEvent(Throwable throwable) { - if (throwable == null) { - return; - } + public String beforeBuildEvent(Throwable throwable) { ErrorFingerprint fingerprint = ErrorFingerprint.fromThrowable(throwable); if (fingerprint != null) { CURRENT_FINGERPRINT.set(fingerprint); - MdcProxy.setMDC(LogEventTracker.FINGERPRINT_PROPERTY_NAME, fingerprint.getChecksum()); + return fingerprint.getChecksum(); } + return null; } public void afterBuildEvent(Throwable throwable) { - if (throwable == null) { - return; - } CURRENT_FINGERPRINT.remove(); - MdcProxy.removeMDC(LogEventTracker.FINGERPRINT_PROPERTY_NAME); } public String convertMessage(ILoggingEvent event, String origMessage) { @@ -69,35 +62,4 @@ public String convertMessage(ILoggingEvent event, String origMessage) { } return "[error:" + fingerprint + "] " + origMessage; } - - /** - * Wrapper to access slf4f.MDC - * We use reflection to access MDC as the slf4j package is being relocated and we want these properties to be set - * on the MDC loaded by the application and not on the relocated MDC packaged with JInsight - */ - static class MdcProxy { - - private static final String CLASS_NAME = new StringBuilder().append("org.").append("slf4j.").append("MDC") - .toString(); - - public static void setMDC(String propertyName, String propertyValue) { - try { - Class mdcClass = Class.forName(CLASS_NAME); - Method putMethod = mdcClass.getMethod("put", String.class, String.class); - putMethod.invoke(null, propertyName, propertyValue); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static void removeMDC(String propertyName) { - try { - Class mdcClass = Class.forName(CLASS_NAME); - Method removeMethod = mdcClass.getMethod("remove", String.class); - removeMethod.invoke(null, propertyName); - } catch (Exception e) { - e.printStackTrace(); - } - } - } } diff --git a/src/main/java/ai/apptuit/metrics/jinsight/modules/logback/logback.btm b/src/main/java/ai/apptuit/metrics/jinsight/modules/logback/logback.btm index 6b873c9..76519e7 100644 --- a/src/main/java/ai/apptuit/metrics/jinsight/modules/logback/logback.btm +++ b/src/main/java/ai/apptuit/metrics/jinsight/modules/logback/logback.btm @@ -28,8 +28,8 @@ CLASS ch.qos.logback.classic.Logger METHOD buildLoggingEventAndAppend HELPER ai.apptuit.metrics.jinsight.modules.logback.LogbackRuleHelper AT ENTRY -IF TRUE -DO beforeBuildEvent($6) +IF $6 != null +DO org.slf4j.MDC.put(ai.apptuit.metrics.jinsight.modules.logback.LogEventTracker.FINGERPRINT_PROPERTY_NAME, beforeBuildEvent($6)) ENDRULE RULE Logback Logger buildLoggingEventAndAppend exit @@ -37,8 +37,9 @@ CLASS ch.qos.logback.classic.Logger METHOD buildLoggingEventAndAppend HELPER ai.apptuit.metrics.jinsight.modules.logback.LogbackRuleHelper AT EXIT -IF TRUE -DO afterBuildEvent($6) +IF $6 != null +DO afterBuildEvent($6); +org.slf4j.MDC.remove(ai.apptuit.metrics.jinsight.modules.logback.LogEventTracker.FINGERPRINT_PROPERTY_NAME) ENDRULE RULE Logback Logger buildLoggingEventAndAppend exception exit @@ -46,8 +47,9 @@ CLASS ch.qos.logback.classic.Logger METHOD buildLoggingEventAndAppend HELPER ai.apptuit.metrics.jinsight.modules.logback.LogbackRuleHelper AT EXCEPTION EXIT -IF TRUE -DO afterBuildEvent($6) +IF $6 != null +DO afterBuildEvent($6); +org.slf4j.MDC.remove(ai.apptuit.metrics.jinsight.modules.logback.LogEventTracker.FINGERPRINT_PROPERTY_NAME) ENDRULE RULE Logback MessageConverter convert exit From 051c96c46157a492311dca398563eb4cedaa730e Mon Sep 17 00:00:00 2001 From: Rajiv Date: Wed, 12 Dec 2018 16:54:14 +0530 Subject: [PATCH 4/4] Move param count check to byte code for better performance --- .../metrics/jinsight/modules/log4j2/Log4J2RuleHelper.java | 4 ++-- .../ai/apptuit/metrics/jinsight/modules/log4j2/log4j2.btm | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/ai/apptuit/metrics/jinsight/modules/log4j2/Log4J2RuleHelper.java b/src/main/java/ai/apptuit/metrics/jinsight/modules/log4j2/Log4J2RuleHelper.java index 98199b1..469068c 100644 --- a/src/main/java/ai/apptuit/metrics/jinsight/modules/log4j2/Log4J2RuleHelper.java +++ b/src/main/java/ai/apptuit/metrics/jinsight/modules/log4j2/Log4J2RuleHelper.java @@ -45,10 +45,10 @@ public void appendersCalled(LogEvent event) { } public void beforeLogMessage(Object[] params) { - if (params == null || params.length < 6 || !(params[5] instanceof Throwable)) { + if (ThreadContext.containsKey(LogEventTracker.FINGERPRINT_PROPERTY_NAME)) { return; } - if (ThreadContext.containsKey(LogEventTracker.FINGERPRINT_PROPERTY_NAME)) { + if (!(params[5] instanceof Throwable)) { return; } Throwable throwable = (Throwable) params[5]; diff --git a/src/main/java/ai/apptuit/metrics/jinsight/modules/log4j2/log4j2.btm b/src/main/java/ai/apptuit/metrics/jinsight/modules/log4j2/log4j2.btm index 380923f..f5279d3 100644 --- a/src/main/java/ai/apptuit/metrics/jinsight/modules/log4j2/log4j2.btm +++ b/src/main/java/ai/apptuit/metrics/jinsight/modules/log4j2/log4j2.btm @@ -28,7 +28,7 @@ CLASS org.apache.logging.log4j.spi.AbstractLogger METHOD logMessage HELPER ai.apptuit.metrics.jinsight.modules.log4j2.Log4J2RuleHelper AT ENTRY -IF TRUE +IF $# GE 5 DO beforeLogMessage($*) ENDRULE @@ -37,7 +37,7 @@ CLASS org.apache.logging.log4j.spi.AbstractLogger METHOD logMessage HELPER ai.apptuit.metrics.jinsight.modules.log4j2.Log4J2RuleHelper AT EXIT -IF TRUE +IF $# GE 5 DO afterLogMessage($*) ENDRULE @@ -46,7 +46,7 @@ CLASS org.apache.logging.log4j.spi.AbstractLogger METHOD logMessage HELPER ai.apptuit.metrics.jinsight.modules.log4j2.Log4J2RuleHelper AT EXCEPTION EXIT -IF TRUE +IF $# GE 5 DO afterLogMessage($*) ENDRULE