Skip to content

Commit 2f742d1

Browse files
authored
Merge pull request #38 from iot-dsa-v2/daniel-profiler
add profiler functionality to sys node
2 parents 9f00aca + bd6b888 commit 2f742d1

File tree

15 files changed

+822
-1
lines changed

15 files changed

+822
-1
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apply plugin: 'java'
22
apply plugin: 'maven'
33

44
group 'org.iot.dsa'
5-
version '0.22.0'
5+
version '0.23.0'
66

77
sourceCompatibility = 1.6
88
targetCompatibility = 1.6
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.acuity.iot.dsa.dslink.profiler;
2+
3+
import java.lang.management.ClassLoadingMXBean;
4+
import java.lang.management.ManagementFactory;
5+
import java.lang.management.PlatformManagedObject;
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
public class ClassLoadingNode extends MXBeanNode {
10+
11+
private ClassLoadingMXBean mxbean;
12+
13+
@Override
14+
public void setupMXBean() {
15+
mxbean = ManagementFactory.getClassLoadingMXBean();
16+
}
17+
18+
@Override
19+
public void refreshImpl() {}
20+
21+
@Override
22+
public PlatformManagedObject getMXBean() {
23+
return mxbean;
24+
}
25+
26+
@Override
27+
public Class<? extends PlatformManagedObject> getMXInterface() {
28+
return ClassLoadingMXBean.class;
29+
}
30+
31+
private static List<String> overriden = new ArrayList<String>();
32+
33+
@Override
34+
public List<String> getOverriden() {
35+
return overriden;
36+
}
37+
38+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.acuity.iot.dsa.dslink.profiler;
2+
3+
import java.lang.management.CompilationMXBean;
4+
import java.lang.management.ManagementFactory;
5+
import java.lang.management.PlatformManagedObject;
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
import org.iot.dsa.node.DSString;
9+
10+
public class CompilationNode extends MXBeanNode {
11+
12+
private CompilationMXBean mxbean;
13+
14+
@Override
15+
public void setupMXBean() {
16+
mxbean = ManagementFactory.getCompilationMXBean();
17+
}
18+
19+
@Override
20+
public void refreshImpl() {
21+
putProp("TotalCompilationTime",
22+
DSString.valueOf(ProfilerUtils.millisToString(mxbean.getTotalCompilationTime())));
23+
}
24+
25+
@Override
26+
public PlatformManagedObject getMXBean() {
27+
return mxbean;
28+
}
29+
30+
@Override
31+
public Class<? extends PlatformManagedObject> getMXInterface() {
32+
return CompilationMXBean.class;
33+
}
34+
35+
private static List<String> overriden = new ArrayList<String>();
36+
static {
37+
overriden.add("TotalCompilationTime");
38+
}
39+
40+
@Override
41+
public List<String> getOverriden() {
42+
return overriden;
43+
}
44+
45+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.acuity.iot.dsa.dslink.profiler;
2+
3+
import java.lang.management.GarbageCollectorMXBean;
4+
import java.lang.management.PlatformManagedObject;
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import org.iot.dsa.node.DSString;
8+
9+
public class GarbageCollectorNode extends MXBeanNode {
10+
11+
private GarbageCollectorMXBean mxbean;
12+
13+
public GarbageCollectorNode() {}
14+
15+
public GarbageCollectorNode(GarbageCollectorMXBean mxbean) {
16+
this.mxbean = mxbean;
17+
}
18+
19+
@Override
20+
public void setupMXBean() {
21+
if (mxbean == null) {
22+
getParent().remove(getInfo());
23+
}
24+
}
25+
26+
@Override
27+
public void refreshImpl() {
28+
putProp("CollectionTime",
29+
DSString.valueOf(ProfilerUtils.millisToString(mxbean.getCollectionTime())));
30+
}
31+
32+
@Override
33+
public PlatformManagedObject getMXBean() {
34+
return mxbean;
35+
}
36+
37+
@Override
38+
public Class<? extends PlatformManagedObject> getMXInterface() {
39+
return GarbageCollectorMXBean.class;
40+
}
41+
42+
private static List<String> overriden = new ArrayList<String>();
43+
static {
44+
overriden.add("CollectionTime");
45+
}
46+
47+
@Override
48+
public List<String> getOverriden() {
49+
return overriden;
50+
}
51+
52+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.acuity.iot.dsa.dslink.profiler;
2+
3+
import java.lang.management.PlatformManagedObject;
4+
import java.lang.reflect.InvocationTargetException;
5+
import java.lang.reflect.Method;
6+
import java.util.List;
7+
import org.iot.dsa.node.DSIObject;
8+
import org.iot.dsa.node.DSInfo;
9+
import org.iot.dsa.node.DSNode;
10+
import org.iot.dsa.node.DSString;
11+
import org.iot.dsa.node.action.ActionInvocation;
12+
import org.iot.dsa.node.action.ActionResult;
13+
import org.iot.dsa.node.action.DSAction;
14+
15+
public abstract class MXBeanNode extends DSNode {
16+
17+
private static DSAction refreshAction = new DSAction() {
18+
@Override
19+
public ActionResult invoke(DSInfo info, ActionInvocation invocation) {
20+
((MXBeanNode) info.getParent()).refresh();
21+
return null;
22+
}
23+
};
24+
25+
@Override
26+
protected void declareDefaults() {
27+
super.declareDefaults();
28+
declareDefault("Refresh", refreshAction);
29+
}
30+
31+
@Override
32+
protected void onStable() {
33+
setupMXBean();
34+
refresh();
35+
}
36+
37+
private void refresh() {
38+
refreshImpl();
39+
discover();
40+
}
41+
42+
public abstract void setupMXBean();
43+
44+
public abstract void refreshImpl();
45+
46+
public abstract PlatformManagedObject getMXBean();
47+
48+
public abstract Class<? extends PlatformManagedObject> getMXInterface();
49+
50+
public abstract List<String> getOverriden();
51+
52+
public void discover() {
53+
PlatformManagedObject bean = getMXBean();
54+
Class<? extends PlatformManagedObject> clazz = getMXInterface();
55+
for (Method meth : clazz.getMethods()) {
56+
String methName = meth.getName();
57+
if (meth.getParameterCount() == 0 && meth.getReturnType() != Void.TYPE) {
58+
String name;
59+
if (methName.startsWith("get")) {
60+
name = methName.substring(3);
61+
} else if (methName.startsWith("is")) {
62+
name = methName.substring(2);
63+
} else {
64+
continue;
65+
}
66+
if (!name.isEmpty() && !getOverriden().contains(name)) {
67+
try {
68+
Object o = meth.invoke(bean);
69+
putProp(name,
70+
o != null ? ProfilerUtils.objectToDSIValue(o) : DSString.EMPTY);
71+
} catch (Exception e) {
72+
warn(e);
73+
}
74+
}
75+
}
76+
}
77+
}
78+
79+
protected void putProp(String name, DSIObject obj) {
80+
put(name, obj).setReadOnly(true).setTransient(true);
81+
}
82+
83+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.acuity.iot.dsa.dslink.profiler;
2+
3+
import java.lang.management.MemoryManagerMXBean;
4+
import java.lang.management.PlatformManagedObject;
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
public class MemoryManagerNode extends MXBeanNode {
9+
10+
private MemoryManagerMXBean mxbean;
11+
12+
public MemoryManagerNode() {}
13+
14+
public MemoryManagerNode(MemoryManagerMXBean mxbean) {
15+
this.mxbean = mxbean;
16+
}
17+
18+
@Override
19+
public void setupMXBean() {
20+
if (mxbean == null) {
21+
getParent().remove(getInfo());
22+
}
23+
}
24+
25+
@Override
26+
public void refreshImpl() {
27+
// TODO Auto-generated method stub
28+
29+
}
30+
31+
@Override
32+
public PlatformManagedObject getMXBean() {
33+
return mxbean;
34+
}
35+
36+
@Override
37+
public Class<? extends PlatformManagedObject> getMXInterface() {
38+
return MemoryManagerMXBean.class;
39+
}
40+
41+
private static List<String> overriden = new ArrayList<String>();
42+
43+
@Override
44+
public List<String> getOverriden() {
45+
return overriden;
46+
}
47+
48+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.acuity.iot.dsa.dslink.profiler;
2+
3+
import java.lang.management.ManagementFactory;
4+
import java.lang.management.MemoryMXBean;
5+
import java.lang.management.PlatformManagedObject;
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
public class MemoryNode extends MXBeanNode {
10+
11+
private MemoryMXBean mxbean;
12+
13+
@Override
14+
public void setupMXBean() {
15+
mxbean = ManagementFactory.getMemoryMXBean();
16+
}
17+
18+
@Override
19+
public void refreshImpl() {
20+
// TODO Auto-generated method stub
21+
}
22+
23+
@Override
24+
public PlatformManagedObject getMXBean() {
25+
return mxbean;
26+
}
27+
28+
@Override
29+
public Class<? extends PlatformManagedObject> getMXInterface() {
30+
return MemoryMXBean.class;
31+
}
32+
33+
private static List<String> overriden = new ArrayList<String>();
34+
35+
@Override
36+
public List<String> getOverriden() {
37+
return overriden;
38+
}
39+
40+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.acuity.iot.dsa.dslink.profiler;
2+
3+
import java.lang.management.MemoryPoolMXBean;
4+
import java.lang.management.PlatformManagedObject;
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
public class MemoryPoolNode extends MXBeanNode {
9+
10+
private MemoryPoolMXBean mxbean;
11+
12+
public MemoryPoolNode() {}
13+
14+
public MemoryPoolNode(MemoryPoolMXBean mxbean) {
15+
this.mxbean = mxbean;
16+
}
17+
18+
@Override
19+
public void setupMXBean() {
20+
if (mxbean == null) {
21+
getParent().remove(getInfo());
22+
}
23+
}
24+
25+
@Override
26+
public void refreshImpl() {
27+
// TODO Auto-generated method stub
28+
29+
}
30+
31+
@Override
32+
public PlatformManagedObject getMXBean() {
33+
return mxbean;
34+
}
35+
36+
@Override
37+
public Class<? extends PlatformManagedObject> getMXInterface() {
38+
return MemoryPoolMXBean.class;
39+
}
40+
41+
private static List<String> overriden = new ArrayList<String>();
42+
43+
@Override
44+
public List<String> getOverriden() {
45+
return overriden;
46+
}
47+
48+
}

0 commit comments

Comments
 (0)