From 02dae0fbcd8b7cf4e9e24aa7602a6c7e426df758 Mon Sep 17 00:00:00 2001 From: Jonas Kunz Date: Fri, 3 Jul 2020 09:03:10 +0200 Subject: [PATCH] Closes #794 - Added support for JBoss LogManager MDC (#800) --- .../tracing/TraceIdMDCInjectionSettings.java | 5 ++ .../ocelot/config/default/basics.yml | 2 + .../correlation/log/MDCAccess.java | 6 +-- .../adapters/JBossLogmanagerMDCAdapter.java | 44 +++++++++++++++++ .../log/adapters/Log4J1MDCAdapter.java | 2 +- .../log/adapters/Log4J2MDCAdapter.java | 2 +- .../log/adapters/Slf4jMDCAdapter.java | 2 +- .../JBossLogmanagerMDCAdapterTest.java | 48 +++++++++++++++++++ .../docs/tracing/log-correlation.md | 1 + 9 files changed, 105 insertions(+), 7 deletions(-) create mode 100644 inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/JBossLogmanagerMDCAdapter.java create mode 100644 inspectit-ocelot-core/src/test/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/JBossLogmanagerMDCAdapterTest.java diff --git a/inspectit-ocelot-config/src/main/java/rocks/inspectit/ocelot/config/model/tracing/TraceIdMDCInjectionSettings.java b/inspectit-ocelot-config/src/main/java/rocks/inspectit/ocelot/config/model/tracing/TraceIdMDCInjectionSettings.java index f4d8f8448f..4443687600 100644 --- a/inspectit-ocelot-config/src/main/java/rocks/inspectit/ocelot/config/model/tracing/TraceIdMDCInjectionSettings.java +++ b/inspectit-ocelot-config/src/main/java/rocks/inspectit/ocelot/config/model/tracing/TraceIdMDCInjectionSettings.java @@ -36,4 +36,9 @@ public class TraceIdMDCInjectionSettings { * Slf4j injection will only take place, if this field and {@link #enabled} are true. */ private boolean slf4jEnabled; + + /** + * JBoss LogManager injection will only take place, if this field and {@link #enabled} are true. + */ + private boolean jbossLogmanagerEnabled; } diff --git a/inspectit-ocelot-config/src/main/resources/rocks/inspectit/ocelot/config/default/basics.yml b/inspectit-ocelot-config/src/main/resources/rocks/inspectit/ocelot/config/default/basics.yml index 819243df75..f197826d80 100644 --- a/inspectit-ocelot-config/src/main/resources/rocks/inspectit/ocelot/config/default/basics.yml +++ b/inspectit-ocelot-config/src/main/resources/rocks/inspectit/ocelot/config/default/basics.yml @@ -44,6 +44,8 @@ inspectit: log4j1-enabled: true # Opt-out option for Log4J2 log4j2-enabled: true + # Opt-out option for JBoss Logmanager + jboss-logmanager-enabled: true trace-id-auto-injection: # whether the trace id should automatically injected into log statements enabled: false diff --git a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/MDCAccess.java b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/MDCAccess.java index bc9aab7474..dc5d861987 100644 --- a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/MDCAccess.java +++ b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/MDCAccess.java @@ -10,10 +10,7 @@ import rocks.inspectit.ocelot.core.AgentImpl; import rocks.inspectit.ocelot.core.config.InspectitConfigChangedEvent; import rocks.inspectit.ocelot.core.config.InspectitEnvironment; -import rocks.inspectit.ocelot.core.instrumentation.correlation.log.adapters.Log4J1MDCAdapter; -import rocks.inspectit.ocelot.core.instrumentation.correlation.log.adapters.Log4J2MDCAdapter; -import rocks.inspectit.ocelot.core.instrumentation.correlation.log.adapters.MDCAdapter; -import rocks.inspectit.ocelot.core.instrumentation.correlation.log.adapters.Slf4jMDCAdapter; +import rocks.inspectit.ocelot.core.instrumentation.correlation.log.adapters.*; import rocks.inspectit.ocelot.core.instrumentation.event.IClassDiscoveryListener; import javax.annotation.PostConstruct; @@ -73,6 +70,7 @@ void registerAdapters() { mdcAdapterBuilders.put(Slf4jMDCAdapter.MDC_CLASS, Slf4jMDCAdapter::get); mdcAdapterBuilders.put(Log4J2MDCAdapter.THREAD_CONTEXT_CLASS, Log4J2MDCAdapter::get); mdcAdapterBuilders.put(Log4J1MDCAdapter.MDC_CLASS, Log4J1MDCAdapter::get); + mdcAdapterBuilders.put(JBossLogmanagerMDCAdapter.MDC_CLASS, JBossLogmanagerMDCAdapter::get); } /** diff --git a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/JBossLogmanagerMDCAdapter.java b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/JBossLogmanagerMDCAdapter.java new file mode 100644 index 0000000000..6c6cde7941 --- /dev/null +++ b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/JBossLogmanagerMDCAdapter.java @@ -0,0 +1,44 @@ +package rocks.inspectit.ocelot.core.instrumentation.correlation.log.adapters; + +import rocks.inspectit.ocelot.config.model.tracing.TraceIdMDCInjectionSettings; +import rocks.inspectit.ocelot.core.utils.WeakMethodReference; + +/** + * Provides access to JBoss Logmanagers ThreadContext. + * + * @author boris_unckel + */ +public class JBossLogmanagerMDCAdapter extends AbstractStaticMapMDCAdapter { + + /** + * The name of the MDC class of JBoss Logmanager. + */ + public static final String MDC_CLASS = "org.jboss.logmanager.MDC"; + + private JBossLogmanagerMDCAdapter(WeakMethodReference put, WeakMethodReference get, WeakMethodReference remove) { + super(put, get, remove); + } + + /** + * Creates an Adapater given a JBoss Logmanager MDC class. + * + * @param mdcClazz the org.jboss.logmanager.MDC class + * + * @return an adapter for setting values on the given MDC. + */ + public static JBossLogmanagerMDCAdapter get(Class mdcClazz) { + try { + WeakMethodReference put = WeakMethodReference.create(mdcClazz, "put", String.class, String.class); + WeakMethodReference get = WeakMethodReference.create(mdcClazz, "get", String.class); + WeakMethodReference remove = WeakMethodReference.create(mdcClazz, "remove", String.class); + return new JBossLogmanagerMDCAdapter(put, get, remove); + } catch (NoSuchMethodException e) { + throw new IllegalArgumentException("JBoss MDC class did not contain expected methods", e); + } + } + + @Override + public boolean isEnabledForConfig(TraceIdMDCInjectionSettings settings) { + return settings.isJbossLogmanagerEnabled(); + } +} \ No newline at end of file diff --git a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/Log4J1MDCAdapter.java b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/Log4J1MDCAdapter.java index 210dd9beaa..c3c3bb663d 100644 --- a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/Log4J1MDCAdapter.java +++ b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/Log4J1MDCAdapter.java @@ -39,6 +39,6 @@ public static Log4J1MDCAdapter get(Class mdcClazz) { @Override public boolean isEnabledForConfig(TraceIdMDCInjectionSettings settings) { - return settings.isLog4j1Enabled() && settings.isEnabled(); + return settings.isLog4j1Enabled(); } } diff --git a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/Log4J2MDCAdapter.java b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/Log4J2MDCAdapter.java index c5af559e9c..bea106515a 100644 --- a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/Log4J2MDCAdapter.java +++ b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/Log4J2MDCAdapter.java @@ -39,6 +39,6 @@ public static Log4J2MDCAdapter get(Class mdcClazz) { @Override public boolean isEnabledForConfig(TraceIdMDCInjectionSettings settings) { - return settings.isLog4j2Enabled() && settings.isEnabled(); + return settings.isLog4j2Enabled(); } } diff --git a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/Slf4jMDCAdapter.java b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/Slf4jMDCAdapter.java index 4599725e3f..aa84d80a0c 100644 --- a/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/Slf4jMDCAdapter.java +++ b/inspectit-ocelot-core/src/main/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/Slf4jMDCAdapter.java @@ -40,6 +40,6 @@ public static Slf4jMDCAdapter get(Class mdcClazz) { @Override public boolean isEnabledForConfig(TraceIdMDCInjectionSettings settings) { - return settings.isSlf4jEnabled() && settings.isEnabled(); + return settings.isSlf4jEnabled(); } } diff --git a/inspectit-ocelot-core/src/test/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/JBossLogmanagerMDCAdapterTest.java b/inspectit-ocelot-core/src/test/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/JBossLogmanagerMDCAdapterTest.java new file mode 100644 index 0000000000..256e9e078e --- /dev/null +++ b/inspectit-ocelot-core/src/test/java/rocks/inspectit/ocelot/core/instrumentation/correlation/log/adapters/JBossLogmanagerMDCAdapterTest.java @@ -0,0 +1,48 @@ +package rocks.inspectit.ocelot.core.instrumentation.correlation.log.adapters; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import rocks.inspectit.ocelot.core.instrumentation.correlation.log.MDCAccess; + +import java.util.HashMap; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +public class JBossLogmanagerMDCAdapterTest { + + private static class DummyMDC { + + private static Map backingMap = new HashMap<>(); + + public static String get(String key) { + return backingMap.get(key); + } + + public static String put(String key, String value) { + return backingMap.put(key, value); + } + + public static String remove(String key) { + return backingMap.remove(key); + } + } + + @Nested + public static class Set { + + @Test + void verifyMDCAccess() { + DummyMDC.put("my_key", "default"); + JBossLogmanagerMDCAdapter adapter = JBossLogmanagerMDCAdapter.get(DummyMDC.class); + + MDCAccess.Undo undo = adapter.set("my_key", "overridden"); + assertThat(DummyMDC.get("my_key")).isEqualTo("overridden"); + + undo.close(); + assertThat(DummyMDC.get("my_key")).isEqualTo("default"); + + } + } + +} diff --git a/inspectit-ocelot-documentation/docs/tracing/log-correlation.md b/inspectit-ocelot-documentation/docs/tracing/log-correlation.md index 6d16ffed33..324310cd37 100644 --- a/inspectit-ocelot-documentation/docs/tracing/log-correlation.md +++ b/inspectit-ocelot-documentation/docs/tracing/log-correlation.md @@ -56,6 +56,7 @@ inspectit: slf4j-enabled: true # Set to "false" to disable slf4J-Support log4j1-enabled: true # Set to "false" to disable Log4J Version 1 Support log4j2-enabled: true # Set to "false" to disable Log4J Version 2 Support + jboss-logmanager-enabled: true # Set to "false" to disable JBoss Logmanager support ```