Skip to content

Commit 03f10e8

Browse files
authored
Merge pull request #258 from scouter-project/master
Merge for release
2 parents 35d406e + 7cedfaa commit 03f10e8

File tree

22 files changed

+676
-535
lines changed

22 files changed

+676
-535
lines changed

scouter.agent.host/src/scouter/agent/counter/task/HostNetDiskPerf.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,17 @@
3232
import scouter.lang.counters.CounterConstants;
3333

3434
import java.util.HashMap;
35+
import java.util.HashSet;
3536
import java.util.Map;
37+
import java.util.Set;
3638

3739
public class HostNetDiskPerf {
3840
static char ch_l = 'l';
3941
static char ch_o = 'o';
4042
static int SLEEP_TIME = 2000;
4143
static Sigar sigarImpl = new Sigar();
4244
static SigarProxy sigar = SigarProxyCache.newInstance(sigarImpl, SLEEP_TIME);
45+
private Set<String> fsExceptionOccured = new HashSet<String>();
4346

4447
private static String[] netIf = null;
4548
private static FileSystem[] fs = null;
@@ -150,10 +153,14 @@ private void diskIO(int checkIntervalSec) {
150153
try {
151154
usage = sigar.getFileSystemUsage(fs[i].getDirName());
152155
} catch (SigarException e) {
153-
// Ignore the exception when trying to stat file interface
154-
Logger.println("A145", 300, "SigarException trying to stat file system device " + fs[i], e);
156+
if(!fsExceptionOccured.contains(fs[i].getDirName())) {
157+
// Ignore the exception when trying to stat file interface
158+
Logger.println("A145", 300, "SigarException trying to stat file system device " + fs[i], e);
159+
fsExceptionOccured.add(fs[i].getDirName());
160+
}
155161
continue;
156162
}
163+
fsExceptionOccured.remove(fs[i].getDirName());
157164
Map<String, Long> fsMap = new HashMap<String, Long>();
158165
long readBytes = usage.getDiskReadBytes();
159166
long writeBytes = usage.getDiskWriteBytes();

scouter.agent.java/src/scouter/agent/AgentTransformer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
public class AgentTransformer implements ClassFileTransformer {
3636
public static final String JAVA_UTIL_MAP = "java/util/Map";
3737
public static ThreadLocal<ClassLoader> hookingCtx = new ThreadLocal<ClassLoader>();
38-
private static List<IASM> asms = new ArrayList<IASM>();
38+
protected static List<IASM> asms = new ArrayList<IASM>();
3939
// hook 관련 설정이 변경되면 자동으로 변경된다.
4040
private static int hook_signature;
4141

scouter.agent.java/src/scouter/agent/Configure.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,7 @@ public final static synchronized Configure getInstance() {
431431
public boolean __ip_dummy_test = false;
432432

433433
//internal variables
434+
private String objExtType = "";
434435
private int objHash;
435436
private String objName;
436437
private int objHostHash;
@@ -740,6 +741,14 @@ private void apply() {
740741
setStaticContents();
741742
}
742743

744+
public String getObjExtType() {
745+
return this.objExtType;
746+
}
747+
748+
public void setObjExtType(String objExtType) {
749+
this.objExtType = objExtType;
750+
}
751+
743752
public int getObjHash() {
744753
return this.objHash;
745754
}
@@ -810,6 +819,8 @@ public synchronized void resetObjInfo() {
810819
String detected = ObjTypeDetector.drivedType != null ? ObjTypeDetector.drivedType
811820
: ObjTypeDetector.objType != null ? ObjTypeDetector.objType : CounterConstants.JAVA;
812821
this.obj_type = getValue("obj_type", detected);
822+
this.objExtType = ObjTypeDetector.objExtType;
823+
813824
detected = CounterConstants.HOST;
814825
if (SystemUtil.IS_LINUX) {
815826
detected = CounterConstants.LINUX;

scouter.agent.java/src/scouter/agent/JavaAgent.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import scouter.util.StringSet;
2222
import scouter.util.logo.Logo;
2323

24+
import java.lang.instrument.ClassFileTransformer;
2425
import java.lang.instrument.Instrumentation;
2526

2627
import static scouter.agent.Logger.conf;
@@ -29,14 +30,18 @@ public class JavaAgent {
2930
private static Instrumentation instrumentation;
3031

3132
public static void premain(String options, Instrumentation instrum) {
33+
preStart(options, instrum, new AgentTransformer());
34+
}
35+
36+
public static void preStart(String options, Instrumentation instrum, ClassFileTransformer transformer) {
3237
if (JavaAgent.instrumentation != null) {
3338
return;
3439
}
3540
intro();
3641
Configure.getInstance();
3742
BackJobs.getInstance().put(Logger.class.getName(), 3000, Logger.initializer);
3843
JavaAgent.instrumentation = instrum;
39-
JavaAgent.instrumentation.addTransformer(new AgentTransformer());
44+
JavaAgent.instrumentation.addTransformer(transformer);
4045
// RequestAgent.getInstance();
4146

4247
addAsyncRedefineClasses();

scouter.agent.java/src/scouter/agent/ObjTypeDetector.java

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -17,46 +17,52 @@
1717

1818
package scouter.agent;
1919

20+
import scouter.lang.counters.CounterConstants;
21+
2022
import java.util.HashMap;
2123
import java.util.HashSet;
2224
import java.util.Map;
2325
import java.util.Set;
2426

25-
import scouter.lang.counters.CounterConstants;
26-
2727
public class ObjTypeDetector {
2828

29-
public static Map<String, String> bootClass = new HashMap<String, String>();
30-
public static Set<String> extClass = new HashSet<String>();
31-
static {
32-
bootClass.put("org/eclipse/jetty/server/Server", CounterConstants.JETTY);
33-
bootClass.put("org/jboss/Main", CounterConstants.JBOSS); // jboss as 6.1.0
34-
bootClass.put("org/jboss/as/server/Main", CounterConstants.JBOSS); // jboss as 7.2.0 final
35-
bootClass.put("org/apache/catalina/startup/Bootstrap", CounterConstants.TOMCAT);
36-
bootClass.put("org/apache/catalina/startup/Tomcat", CounterConstants.TOMCAT);
37-
bootClass.put("com/caucho/server/resin/Resin", CounterConstants.RESIN); // resin 4.x
38-
}
39-
40-
public static String objType = null;
41-
public static String drivedType = null;
42-
private static boolean initLog=false;
43-
public static void check(String className) {
44-
String type = bootClass.get(className);
45-
if (type == null)
46-
return;
47-
if(extClass.contains(type)){
48-
drivedType=type;
49-
}else{
50-
objType = type;
51-
}
52-
Configure.getInstance().resetObjInfo();
53-
if(initLog==false){
54-
Logger.initializer.run();
55-
initLog=true;
56-
}
57-
58-
dirtyConfig=true;
59-
}
60-
public static boolean dirtyConfig=false;
61-
29+
public static Map<String, String> bootClass = new HashMap<String, String>();
30+
public static Set<String> extClass = new HashSet<String>();
31+
32+
static {
33+
bootClass.put("org/eclipse/jetty/server/Server", CounterConstants.JETTY);
34+
bootClass.put("org/jboss/Main", CounterConstants.JBOSS); // jboss as 6.1.0
35+
bootClass.put("org/jboss/as/server/Main", CounterConstants.JBOSS); // jboss as 7.2.0 final
36+
bootClass.put("org/apache/catalina/startup/Bootstrap", CounterConstants.TOMCAT);
37+
bootClass.put("org/apache/catalina/startup/Tomcat", CounterConstants.TOMCAT);
38+
bootClass.put("com/caucho/server/resin/Resin", CounterConstants.RESIN); // resin 4.x
39+
}
40+
41+
public static String objType = null;
42+
public static String drivedType = null;
43+
public static String objExtType = null;
44+
45+
private static boolean initLog = false;
46+
47+
public static void check(String className) {
48+
String type = bootClass.get(className);
49+
if (type == null)
50+
return;
51+
if (extClass.contains(type)) {
52+
drivedType = type;
53+
} else {
54+
objType = type;
55+
}
56+
57+
Configure.getInstance().resetObjInfo();
58+
if (initLog == false) {
59+
Logger.initializer.run();
60+
initLog = true;
61+
}
62+
63+
dirtyConfig = true;
64+
}
65+
66+
public static boolean dirtyConfig = false;
67+
6268
}

scouter.agent.java/src/scouter/agent/asm/MethodASM.java

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,52 @@
1717

1818
package scouter.agent.asm;
1919

20-
import java.util.List;
21-
2220
import scouter.agent.ClassDesc;
2321
import scouter.agent.Configure;
2422
import scouter.agent.asm.util.AsmUtil;
2523
import scouter.agent.asm.util.HookingSet;
2624
import scouter.agent.netio.data.DataProxy;
2725
import scouter.agent.trace.TraceMain;
28-
import scouter.org.objectweb.asm.ClassVisitor;
29-
import scouter.org.objectweb.asm.Label;
30-
import scouter.org.objectweb.asm.MethodVisitor;
31-
import scouter.org.objectweb.asm.Opcodes;
32-
import scouter.org.objectweb.asm.Type;
26+
import scouter.org.objectweb.asm.*;
3327
import scouter.org.objectweb.asm.commons.LocalVariablesSorter;
28+
import scouter.util.StringUtil;
29+
30+
import java.util.ArrayList;
31+
import java.util.List;
3432

3533
public class MethodASM implements IASM, Opcodes {
34+
private static List<String> defaultPatterns = new ArrayList<String>();
35+
private static List<String> defaultExcludePatterns = new ArrayList<String>();
36+
37+
private Configure conf = Configure.getInstance();
38+
private List<HookingSet> target;
39+
private List<HookingSet> excludeTarget;
40+
41+
public MethodASM() {
42+
String patterns = buildPatterns(conf.hook_method_patterns, defaultPatterns);
43+
String excludPatterns = buildPatterns(conf.hook_method_exclude_patterns, defaultExcludePatterns);
44+
target = HookingSet.getHookingMethodSet(patterns);
45+
excludeTarget = HookingSet.getHookingMethodSet(excludPatterns);
46+
}
47+
48+
public static void addPatterns(String methodPattern) {
49+
defaultPatterns.add(methodPattern);
50+
}
3651

37-
private List<HookingSet> target = HookingSet.getHookingMethodSet(Configure.getInstance().hook_method_patterns);
38-
private List<HookingSet> excludeTarget = HookingSet.getHookingMethodSet(Configure.getInstance().hook_method_exclude_patterns);
52+
public static void addExcludePatterns(String methodPattern) {
53+
defaultExcludePatterns.add(methodPattern);
54+
}
3955

40-
Configure conf = Configure.getInstance();
56+
private String buildPatterns(String patterns, List<String> patternsList) {
57+
for(int i=0; i<patternsList.size(); i++) {
58+
if(StringUtil.isNotEmpty(StringUtil.trim(patterns))) {
59+
patterns = patterns + "," + patternsList.get(i);
60+
} else {
61+
patterns = patternsList.get(i);
62+
}
63+
}
64+
return patterns;
65+
}
4166

4267
public ClassVisitor transform(ClassVisitor cv, String className, ClassDesc classDesc) {
4368
if (conf._hook_methods_enabled == false) {

scouter.agent.java/src/scouter/agent/counter/task/AgentHeartBeat.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
* limitations under the License.
1616
*/
1717
package scouter.agent.counter.task;
18-
import java.io.File;
19-
import java.util.Enumeration;
2018
import scouter.Version;
2119
import scouter.agent.Configure;
2220
import scouter.agent.Logger;
@@ -29,7 +27,11 @@
2927
import scouter.lang.value.BooleanValue;
3028
import scouter.util.FileUtil;
3129
import scouter.util.StringKeyLinkedMap;
30+
import scouter.util.StringUtil;
3231
import scouter.util.SysJMX;
32+
33+
import java.io.File;
34+
import java.util.Enumeration;
3335
public class AgentHeartBeat {
3436
static {
3537
Logger.println("objType:" + Configure.getInstance().obj_type);
@@ -67,6 +69,9 @@ private ObjectPack getMainObject() {
6769
p.objName = conf.getObjName();
6870
p.version = Version.getAgentFullVersion();
6971
p.address = TcpWorker.localAddr;
72+
if(StringUtil.isNotEmpty(conf.getObjExtType())){
73+
p.tags.put("objExtType", conf.getObjExtType());
74+
}
7075
if (ToolsMainFactory.activeStack) {
7176
p.tags.put("ActiveStack", new BooleanValue(true));
7277
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package scouter.agent.trace;
2+
3+
import scouter.agent.proxy.IHttpTrace;
4+
import scouter.agent.trace.TraceMain.Stat;
5+
6+
public interface ILoadController {
7+
public void start(TraceContext ctx, Object req, Object res);
8+
public void end(TraceContext ctx, Object req, Object res);
9+
public boolean reject(TraceContext ctx, Object req, Object res, IHttpTrace http);
10+
11+
}

scouter.agent.java/src/scouter/agent/trace/TraceContext.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import scouter.util.IntKeyMap;
2323
import scouter.util.SysJMX;
2424

25+
import java.util.ArrayList;
2526
import java.util.Queue;
2627
import java.util.concurrent.LinkedBlockingQueue;
2728

@@ -111,6 +112,7 @@ public TraceContext(boolean profile_summary) {
111112
public Queue<DumpStep> temporaryDumpSteps = new LinkedBlockingQueue<DumpStep>(5);
112113
public boolean hasDumpStack;
113114

115+
public ArrayList<String> plcGroupList = new ArrayList<String>();
114116
public TraceContext createChild() {
115117
TraceContext child = new TraceContext(this.isSummary);
116118
child.parent = this;

scouter.agent.java/src/scouter/agent/trace/TraceMain.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ public Stat(TraceContext ctx) {
7070
private static Error resultSetLeakSuspect = new RESULTSET_LEAK_SUSPECT("ResultSet Leak suspected!");
7171
private static Error statementLeakSuspect = new STATEMENT_LEAK_SUSPECT("Statement Leak suspected!");
7272
private static DelayedServiceManager delayedServiceManager = DelayedServiceManager.getInstance();
73+
public static ILoadController plController;
7374

7475
public static Object startHttpService(Object req, Object res) {
7576
try {
@@ -105,6 +106,21 @@ public static Object startHttpFilter(Object req, Object res) {
105106

106107
public static Object reject(Object stat, Object req, Object res) {
107108
Configure conf = Configure.getInstance();
109+
if(plController != null) {
110+
if (stat == null || req == null || res == null)
111+
return null;
112+
if (http == null) {
113+
initHttp(req);
114+
}
115+
Stat stat0 = (Stat) stat;
116+
if (stat0.isStaticContents) {
117+
return null;
118+
}
119+
if(plController.reject(stat0.ctx, req, res,http)) {
120+
endHttpService(stat0, REJECT);
121+
return REJECT;
122+
}
123+
}
108124
if (conf.control_reject_service_enabled) {
109125
if (stat == null || req == null || res == null)
110126
return null;
@@ -114,6 +130,8 @@ public static Object reject(Object stat, Object req, Object res) {
114130
Stat stat0 = (Stat) stat;
115131
if (stat0.isStaticContents)
116132
return null;
133+
134+
117135
// reject by customized plugin
118136
if (PluginHttpServiceTrace.reject(stat0.ctx, req, res)
119137
// reject by control_reject_service_max_count
@@ -184,6 +202,7 @@ private static Object startHttp(Object req, Object res) {
184202
if (http == null) {
185203
initHttp(req);
186204
}
205+
187206
Configure conf = Configure.getInstance();
188207
TraceContext ctx = new TraceContext(conf.profile_summary_mode_enabled);
189208
ctx.thread = Thread.currentThread();
@@ -202,6 +221,9 @@ private static Object startHttp(Object req, Object res) {
202221

203222
if (stat.isStaticContents == false) {
204223
PluginHttpServiceTrace.start(ctx, req, res);
224+
if(plController != null) {
225+
plController.start(ctx, req, res);
226+
}
205227
}
206228
return stat;
207229
}
@@ -273,7 +295,9 @@ public static void endHttpService(Object stat, Throwable thr) {
273295
}
274296
// Plug-in end
275297
PluginHttpServiceTrace.end(ctx, stat0.req, stat0.res);
276-
298+
if(plController != null) {
299+
plController.end(ctx, stat0.req, stat0.res);
300+
}
277301
//profile rs
278302
if(conf.trace_rs_leak_enabled && ctx.unclosedRsMap.size() > 0) {
279303
MapValue mv = new MapValue();
@@ -685,9 +709,6 @@ public static Object startMethod(int hash, String classMethod) {
685709
if (ctx == null) {
686710
if (conf._trace_auto_service_enabled) {
687711
Object localContext = startService(classMethod, null, null, null, null, null, XLogTypes.APP_SERVICE);
688-
//startService내부에서 에러가 나는 경우(발생하면 안됨)
689-
//Null이 리턴될 수 있음(방어코드)
690-
//@PaulKen
691712
if (localContext != null) {
692713
//service start
693714
((LocalContext) localContext).service = true;

0 commit comments

Comments
 (0)