From ace2e638878a25e7885aaa2bc9a593bd954ca5f7 Mon Sep 17 00:00:00 2001 From: ascrutae Date: Mon, 26 Jun 2017 11:23:19 +0800 Subject: [PATCH 1/2] Add mechanism to set default status(on/off) of plugin --- .../apm/agent/core/conf/Config.java | 6 +++++ .../apm/agent/core/plugin/PluginDefine.java | 27 ++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/conf/Config.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/conf/Config.java index 0dbd4f44a..92b7f9fba 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/conf/Config.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/conf/Config.java @@ -101,6 +101,12 @@ public class Config { */ public static List DISABLED_PLUGINS = new LinkedList(); + /** + * Name of force enable plugin, The value spilt by , + * if you have multiple plugins need to enable. + */ + public static List FORCE_ENABLE_PLUGINS = new LinkedList(); + public static class MongoDB { /** * If true, trace all the parameters, default is false. diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginDefine.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginDefine.java index 96a82f896..5ccd13b70 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginDefine.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginDefine.java @@ -15,9 +15,15 @@ public class PluginDefine { */ private String defineClass; - private PluginDefine(String name, String defineClass) { + /** + * The sate of plugin. + */ + private State state; + + private PluginDefine(String name, String defineClass, State state) { this.name = name; this.defineClass = defineClass; + this.state = state; } public static PluginDefine build(String define) throws IllegalPluginDefineException { @@ -30,16 +36,31 @@ public class PluginDefine { throw new IllegalPluginDefineException(define); } - return new PluginDefine(pluginDefine[0], pluginDefine[1]); + String pluginName = pluginDefine[0]; + String defineClass = pluginDefine[1]; + if (pluginName.toUpperCase().startsWith("[OFF]")) { + return new PluginDefine(pluginName.substring(5), defineClass, State.OFF); + } else { + return new PluginDefine(pluginName, defineClass, State.ON); + } } public boolean enable() { - return !Config.Plugin.DISABLED_PLUGINS.contains(name); + return !Config.Plugin.DISABLED_PLUGINS.contains(name) || forceEnable(); + } + + + private boolean forceEnable() { + return state == State.OFF && Config.Plugin.FORCE_ENABLE_PLUGINS.contains(name); } public String getDefineClass() { return defineClass; } + + private enum State { + OFF, ON; + } } From 6e1d0d602fb63f2394bf1b1d42930c84ecc22767 Mon Sep 17 00:00:00 2001 From: ascrutae Date: Mon, 26 Jun 2017 22:52:27 +0800 Subject: [PATCH 2/2] add test case and fix logical error --- .../apm/agent/core/plugin/PluginDefine.java | 10 ++-- .../agent/core/plugin/PluginDefineTest.java | 48 +++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/plugin/PluginDefineTest.java diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginDefine.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginDefine.java index 5ccd13b70..307139574 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginDefine.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginDefine.java @@ -5,6 +5,7 @@ import org.skywalking.apm.agent.core.plugin.exception.IllegalPluginDefineExcepti import org.skywalking.apm.util.StringUtil; public class PluginDefine { + public static final String PLUGIN_OFF_PREFIX = "[OFF]"; /** * Plugin name. */ @@ -38,17 +39,20 @@ public class PluginDefine { String pluginName = pluginDefine[0]; String defineClass = pluginDefine[1]; - if (pluginName.toUpperCase().startsWith("[OFF]")) { - return new PluginDefine(pluginName.substring(5), defineClass, State.OFF); + if (pluginName.toUpperCase().startsWith(PLUGIN_OFF_PREFIX)) { + return new PluginDefine(pluginName.substring(PLUGIN_OFF_PREFIX.length()), defineClass, State.OFF); } else { return new PluginDefine(pluginName, defineClass, State.ON); } } public boolean enable() { - return !Config.Plugin.DISABLED_PLUGINS.contains(name) || forceEnable(); + return !forceDisable() || forceEnable(); } + private boolean forceDisable() { + return state != State.ON || Config.Plugin.DISABLED_PLUGINS.contains(name); + } private boolean forceEnable() { return state == State.OFF && Config.Plugin.FORCE_ENABLE_PLUGINS.contains(name); diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/plugin/PluginDefineTest.java b/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/plugin/PluginDefineTest.java new file mode 100644 index 000000000..1f0a69dd9 --- /dev/null +++ b/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/plugin/PluginDefineTest.java @@ -0,0 +1,48 @@ +package org.skywalking.apm.agent.core.plugin; + +import org.junit.Test; +import org.skywalking.apm.agent.core.conf.Config; +import org.skywalking.apm.agent.core.plugin.exception.IllegalPluginDefineException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class PluginDefineTest { + + private static final String TEST_PLUGIN = "test_plugin"; + private static final String TEST_DEFINE_CLASS = "test_define_class"; + + @Test(expected = IllegalPluginDefineException.class) + public void testIllegalPluginDefine() throws IllegalPluginDefineException { + PluginDefine.build("illegal_plugin_define"); + } + + @Test(expected = IllegalPluginDefineException.class) + public void testEmptyPluginDefine() throws IllegalPluginDefineException { + PluginDefine.build(""); + } + + @Test + public void testOffStatePlugin() throws IllegalPluginDefineException { + PluginDefine pluginDefine = PluginDefine.build(PluginDefine.PLUGIN_OFF_PREFIX + TEST_PLUGIN + "=" + TEST_DEFINE_CLASS); + assertFalse(pluginDefine.enable()); + assertEquals(TEST_DEFINE_CLASS, pluginDefine.getDefineClass()); + } + + @Test + public void testDefaultStatePlugin() throws IllegalPluginDefineException { + PluginDefine pluginDefine = PluginDefine.build(TEST_PLUGIN + "=" + TEST_DEFINE_CLASS); + assertTrue(pluginDefine.enable()); + assertEquals(TEST_DEFINE_CLASS, pluginDefine.getDefineClass()); + } + + @Test + public void testForceEnablePlugin() throws IllegalPluginDefineException { + Config.Plugin.FORCE_ENABLE_PLUGINS.add(TEST_PLUGIN); + PluginDefine pluginDefine = PluginDefine.build(PluginDefine.PLUGIN_OFF_PREFIX + TEST_PLUGIN + "=" + TEST_DEFINE_CLASS); + assertTrue(pluginDefine.enable()); + assertEquals(TEST_DEFINE_CLASS, pluginDefine.getDefineClass()); + Config.Plugin.FORCE_ENABLE_PLUGINS.clear(); + } +}