From ce639872f383a372c456b709a30ba6b8a8338e84 Mon Sep 17 00:00:00 2001 From: SkyWorker Date: Tue, 10 Nov 2015 20:12:08 +0900 Subject: [PATCH 1/4] update options --- .../src/scouter/agent/Configure.java | 4 +-- .../scouter/agent/asm/SpringReqMapASM.java | 2 +- .../src/scouter/server/db/TextPermWR.scala | 23 ++++++------- .../scouter/server/plugin/PlugInLoader.java | 3 +- .../server/plugin/alert/AlertRuleLoader.java | 32 ++++++++++--------- 5 files changed, 34 insertions(+), 30 deletions(-) diff --git a/scouter.agent.java/src/scouter/agent/Configure.java b/scouter.agent.java/src/scouter/agent/Configure.java index 5d63f3fde..dafcd3c37 100644 --- a/scouter.agent.java/src/scouter/agent/Configure.java +++ b/scouter.agent.java/src/scouter/agent/Configure.java @@ -258,7 +258,7 @@ public final static synchronized Configure getInstance() { public int heap_perm_warning_pct = 90; public long heap_perm_alert_interval = 30000; - public boolean enable_spring_request_mapping = true; + public boolean hook_spring_request_mapping = false; public boolean debug_sql_call = false; public int socket_open_fullstack_port = 0; @@ -546,7 +546,7 @@ private void apply() { this.heap_perm_alert_interval = getLong("heap_perm_alert_interval", 30000); this.heap_perm_warning_pct = getInt("heap_perm_warning_pct", 90); - this.enable_spring_request_mapping = getBoolean("enable_spring_request_mapping", true); + this.hook_spring_request_mapping = getBoolean("hook_spring_request_mapping", false); this.alert_message_length = getInt("alert_message_length", 3000); this.alert_send_interval = getInt("alert_send_interval", 3000); diff --git a/scouter.agent.java/src/scouter/agent/asm/SpringReqMapASM.java b/scouter.agent.java/src/scouter/agent/asm/SpringReqMapASM.java index c41fc5bde..289d9b064 100644 --- a/scouter.agent.java/src/scouter/agent/asm/SpringReqMapASM.java +++ b/scouter.agent.java/src/scouter/agent/asm/SpringReqMapASM.java @@ -42,7 +42,7 @@ public boolean isTarget(String className) { Configure conf = Configure.getInstance(); public ClassVisitor transform(ClassVisitor cv, String className, ClassDesc classDesc) { - if (conf.enable_spring_request_mapping == false) + if (conf.hook_spring_request_mapping == false) return cv; if (classDesc.anotation != null) { diff --git a/scouter.server/src/scouter/server/db/TextPermWR.scala b/scouter.server/src/scouter/server/db/TextPermWR.scala index 5c1c1f549..13e413bd9 100644 --- a/scouter.server/src/scouter/server/db/TextPermWR.scala +++ b/scouter.server/src/scouter/server/db/TextPermWR.scala @@ -41,18 +41,19 @@ object TextPermWR { val queue = new RequestQueue[Data](DBCtr.LARGE_MAX_QUE_SIZE); - val common = new IntSet(); - common.add(HashUtil.hash(TextTypes.METHOD)); - common.add(HashUtil.hash(TextTypes.GROUP)); - common.add(HashUtil.hash(TextTypes.CITY)); - //move to perm db - common.add(HashUtil.hash(TextTypes.LOGIN)); - common.add(HashUtil.hash(TextTypes.DESC)); - common.add(HashUtil.hash(TextTypes.GROUP)); - common.add(HashUtil.hash(TextTypes.USER_AGENT)); - +// val common = new IntSet(); +// common.add(HashUtil.hash(TextTypes.METHOD)); +// common.add(HashUtil.hash(TextTypes.GROUP)); +// common.add(HashUtil.hash(TextTypes.CITY)); +// //move to perm db +// common.add(HashUtil.hash(TextTypes.LOGIN)); +// common.add(HashUtil.hash(TextTypes.DESC)); +// common.add(HashUtil.hash(TextTypes.GROUP)); +// common.add(HashUtil.hash(TextTypes.USER_AGENT)); + + //에러만 날짜별로 저장한다.-20151110 def isA(divs: Int): Boolean = { - return common.contains(divs); + return divs != TextTypes.ERROR; } ThreadScala.start("scouter.server.db.TextPermWR") { diff --git a/scouter.server/src/scouter/server/plugin/PlugInLoader.java b/scouter.server/src/scouter/server/plugin/PlugInLoader.java index 95c8fb251..b36b2aa6a 100644 --- a/scouter.server/src/scouter/server/plugin/PlugInLoader.java +++ b/scouter.server/src/scouter/server/plugin/PlugInLoader.java @@ -167,7 +167,8 @@ private IPlugIn create(File file, String className, Class superClass, Class para method = CtNewMethod.make("public void " + methodName + "(" + parameter + " p){}", impl); impl.addMethod(method); } - method.setBody("{" + parameter + " $p=$1;" + body + "}"); + + method.setBody("{" + parameter + " $pack=$1;" + body + "}"); c = impl.toClass(new URLClassLoader(new URL[0], this.getClass().getClassLoader()), null); IPlugIn plugin = (IPlugIn) c.newInstance(); diff --git a/scouter.server/src/scouter/server/plugin/alert/AlertRuleLoader.java b/scouter.server/src/scouter/server/plugin/alert/AlertRuleLoader.java index 3ca478a21..3af15c48a 100644 --- a/scouter.server/src/scouter/server/plugin/alert/AlertRuleLoader.java +++ b/scouter.server/src/scouter/server/plugin/alert/AlertRuleLoader.java @@ -49,7 +49,7 @@ public synchronized static AlertRuleLoader getInstance() { if (instance == null) { instance = new AlertRuleLoader(); instance.setDaemon(true); - instance.setName("FxAlertRuleLoader"); + instance.setName("AlertRuleLoader"); instance.start(); } return instance; @@ -125,6 +125,7 @@ private void checkModified(File root) { if (conf.lastModified != ruleConf.lastModified()) { conf = createConf(name, ruleConf); alertConfTable.put(name, conf); + } } } @@ -144,20 +145,22 @@ private File getConfFile(String f) { return null; } - //각 룰에 대한 기본 설정을 로딩한다. + // 각 룰에 대한 기본 설정을 로딩한다. // 각 설정은 스크립트에서 변경할 수 있다. private AlertConf createConf(String name, File confFile) { AlertConf conf = new AlertConf(); - if (confFile != null) { + if (confFile != null && confFile.canRead()) { conf.lastModified = confFile.lastModified(); byte[] body = FileUtil.readAll(confFile); - Properties p = new Properties(); - try { - p.load(new ByteArrayInputStream(body)); - } catch (IOException e) { + if (body != null) { + Properties p = new Properties(); + try { + p.load(new ByteArrayInputStream(body)); + } catch (Exception e) { + } + conf.history_size = getInt(p, "history_size", 0); + conf.silent_time = getInt(p, "silent_time", 0); } - conf.history_size = getInt(p, "history_size", 0); - conf.silent_time = getInt(p, "silent_time", 0); } return conf; } @@ -182,19 +185,18 @@ private AlertRule createRule(String name, File ruleFile) { Class c = null; CtClass cc = cp.get(AlertRule.class.getName()); CtClass impl = null; + CtMethod method = null; try { impl = cp.get(name); impl.defrost(); - CtMethod method = impl.getMethod("process", "(" + nativeName(RealCounter.class) + ")V"); - method.setBody("{" + RealCounter.class.getName() + " $c=$1;" + body + "}"); - c = impl.toClass(new URLClassLoader(new URL[0], this.getClass().getClassLoader()), null); + method = impl.getMethod("process", "(" + nativeName(RealCounter.class) + ")V"); } catch (javassist.NotFoundException e) { impl = cp.makeClass(name, cc); - CtMethod method = CtNewMethod.make("public void process(" + RealCounter.class.getName() + " c){}", impl); + method = CtNewMethod.make("public void process(" + RealCounter.class.getName() + " c){}", impl); impl.addMethod(method); - method.setBody("{" + RealCounter.class.getName() + " $c=$1;" + body + "}"); - c = impl.toClass(new URLClassLoader(new URL[0], this.getClass().getClassLoader()), null); } + method.setBody("{" + RealCounter.class.getName() + " $counter=$1;" + body + "}"); + c = impl.toClass(new URLClassLoader(new URL[0], this.getClass().getClassLoader()), null); AlertRule rule = (AlertRule) c.newInstance(); rule.lastModified = ruleFile.lastModified(); From d91f5d490cdac385028c49673f95325dc0dff928 Mon Sep 17 00:00:00 2001 From: KimEunsu Date: Tue, 10 Nov 2015 20:22:50 +0900 Subject: [PATCH 2/4] minor version up --- scouter.deploy/build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scouter.deploy/build.xml b/scouter.deploy/build.xml index cb4b66128..c264f351d 100644 --- a/scouter.deploy/build.xml +++ b/scouter.deploy/build.xml @@ -4,7 +4,7 @@ - + From 193e4b613fc09a252fcd2b3fabf76d42d78d4876 Mon Sep 17 00:00:00 2001 From: KimEunsu Date: Tue, 10 Nov 2015 20:26:39 +0900 Subject: [PATCH 3/4] bug fix --- scouter.server/src/scouter/server/db/TextPermWR.scala | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scouter.server/src/scouter/server/db/TextPermWR.scala b/scouter.server/src/scouter/server/db/TextPermWR.scala index 13e413bd9..d8df9fbcf 100644 --- a/scouter.server/src/scouter/server/db/TextPermWR.scala +++ b/scouter.server/src/scouter/server/db/TextPermWR.scala @@ -51,9 +51,10 @@ object TextPermWR { // common.add(HashUtil.hash(TextTypes.GROUP)); // common.add(HashUtil.hash(TextTypes.USER_AGENT)); - //에러만 날짜별로 저장한다.-20151110 + //에러만 날짜별로 저장한다.-20151110 + val errorHash = HashUtil.hash(TextTypes.ERROR); def isA(divs: Int): Boolean = { - return divs != TextTypes.ERROR; + return divs != errorHash; } ThreadScala.start("scouter.server.db.TextPermWR") { From e5bb29185b97f92aaff6675564ddda1b9c7669a3 Mon Sep 17 00:00:00 2001 From: Gunhee Lee Date: Tue, 10 Nov 2015 20:28:07 +0900 Subject: [PATCH 4/4] change splash image --- scouter.client/splash.bmp | Bin 377058 -> 502098 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/scouter.client/splash.bmp b/scouter.client/splash.bmp index 873d555b7ffded31b4f08e85a6320d8240918f23..922f8ecb08d41aacf55cd5c76aa7abccf0187655 100644 GIT binary patch literal 502098 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 XAOaQvaxg~%5g-CYV0H+6@WKBA_*E4i