Skip to content

Commit 48881fc

Browse files
authored
0.38.0
- Set Profiler to auto-refresh subscribed properties on a 5 second interval - Add "Get Thread Dump" action to sys/Profiler/Thread, which returns a full thread dump - Remove dependency on Java 1.7 (by removing references to PlatformManagedObject) - Suppress expected InvocationTargetExceptions during profiler setup - Add unit test for basic profiler features - Add jacoco - Doc updates - Incorporate some v2 into the unit tests
2 parents c93414a + 07beab8 commit 48881fc

25 files changed

+300
-663
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# sdk-dslink-java-v2
22
[![](https://jitpack.io/v/iot-dsa-v2/sdk-dslink-java-v2.svg)](https://jitpack.io/#iot-dsa-v2/sdk-dslink-java-v2)
33

4-
* [Developer Guide](https://iot-dsa-v2.github.io/sdk-dslink-java-v2/)
4+
* [Documentation](https://github.com/iot-dsa-v2/sdk-dslink-java-v2/wiki)
55
* [Javadoc](https://jitpack.io/com/github/iot-dsa-v2/sdk-dslink-java-v2/dslink-v2/master-SNAPSHOT/javadoc/)
66
* JDK 1.6+
77

@@ -21,7 +21,7 @@ the DSA architecture, please visit
2121

2222
## Link Development
2323

24-
Please read the [developer guide](https://iot-dsa-v2.github.io/sdk-dslink-java-v2/).
24+
Please read the [developer guide](https://github.com/iot-dsa-v2/sdk-dslink-java-v2/wiki/DSLink-Development-Guide).
2525

2626
## Acknowledgements
2727

build.gradle

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
subprojects {
22

33
apply plugin: 'java'
4+
apply plugin: 'jacoco'
45
apply plugin: 'maven'
56

67
group 'org.iot-dsa'
7-
version '0.36.0'
8+
version '0.38.0'
89

910
sourceCompatibility = 1.6
1011
targetCompatibility = 1.6
@@ -23,6 +24,17 @@ subprojects {
2324
classifier = 'javadoc'
2425
from javadoc.destinationDir
2526
}
27+
28+
/*
29+
jacocoTestReport {
30+
reports {
31+
xml.enabled false
32+
csv.enabled false
33+
html.enabled true
34+
}
35+
}
36+
*/
37+
2638
}
2739

2840
wrapper {

dslink-v2/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ dependencies {
1010
javadoc {
1111
exclude("**/com/**")
1212
}
13+

dslink-v2/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/DS2Session.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ protected boolean hasPingToSend() {
131131
@Override
132132
protected void onConnected() {
133133
super.onConnected();
134+
setRequesterAllowed(true); //TODO - currently used for testing
134135
messageReader = null;
135136
messageWriter = null;
136137
requester.onConnected();
@@ -140,11 +141,11 @@ protected void onConnected() {
140141
@Override
141142
protected void onDisconnected() {
142143
super.onDisconnected();
144+
requester.onDisconnected();
145+
responder.onDisconnected();
143146
messageReader = null;
144147
messageWriter = null;
145148
multiparts.clear();
146-
requester.onDisconnected();
147-
responder.onDisconnected();
148149
}
149150

150151
@Override

dslink-v2/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2Responder.java

-6
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,6 @@ public void handleRequest(DS2MessageReader reader) {
8686
}
8787
}
8888

89-
public void onConnected() {
90-
}
91-
92-
public void onConnectFail() {
93-
}
94-
9589
/**
9690
* Handles an invoke request.
9791
*/

dslink-v2/src/main/java/com/acuity/iot/dsa/dslink/sys/profiler/ClassLoadingNode.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.lang.management.ClassLoadingMXBean;
44
import java.lang.management.ManagementFactory;
5-
import java.lang.management.PlatformManagedObject;
65
import java.util.ArrayList;
76
import java.util.List;
87

@@ -20,12 +19,12 @@ public void refreshImpl() {
2019
}
2120

2221
@Override
23-
public PlatformManagedObject getMXBean() {
22+
public Object getMXBean() {
2423
return mxbean;
2524
}
2625

2726
@Override
28-
public Class<? extends PlatformManagedObject> getMXInterface() {
27+
public Class<? extends Object> getMXInterface() {
2928
return ClassLoadingMXBean.class;
3029
}
3130

dslink-v2/src/main/java/com/acuity/iot/dsa/dslink/sys/profiler/CompilationNode.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.lang.management.CompilationMXBean;
44
import java.lang.management.ManagementFactory;
5-
import java.lang.management.PlatformManagedObject;
65
import java.util.ArrayList;
76
import java.util.List;
87
import org.iot.dsa.node.DSString;
@@ -23,12 +22,12 @@ public void refreshImpl() {
2322
}
2423

2524
@Override
26-
public PlatformManagedObject getMXBean() {
25+
public Object getMXBean() {
2726
return mxbean;
2827
}
2928

3029
@Override
31-
public Class<? extends PlatformManagedObject> getMXInterface() {
30+
public Class<? extends Object> getMXInterface() {
3231
return CompilationMXBean.class;
3332
}
3433

dslink-v2/src/main/java/com/acuity/iot/dsa/dslink/sys/profiler/GarbageCollectorNode.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.acuity.iot.dsa.dslink.sys.profiler;
22

33
import java.lang.management.GarbageCollectorMXBean;
4-
import java.lang.management.PlatformManagedObject;
54
import java.util.ArrayList;
65
import java.util.List;
76
import org.iot.dsa.node.DSString;
@@ -31,12 +30,12 @@ public void refreshImpl() {
3130
}
3231

3332
@Override
34-
public PlatformManagedObject getMXBean() {
33+
public Object getMXBean() {
3534
return mxbean;
3635
}
3736

3837
@Override
39-
public Class<? extends PlatformManagedObject> getMXInterface() {
38+
public Class<? extends Object> getMXInterface() {
4039
return GarbageCollectorMXBean.class;
4140
}
4241

dslink-v2/src/main/java/com/acuity/iot/dsa/dslink/sys/profiler/MXBeanNode.java

+32-8
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.acuity.iot.dsa.dslink.sys.profiler;
22

3-
import java.lang.management.PlatformManagedObject;
3+
import java.lang.management.MemoryPoolMXBean;
44
import java.lang.reflect.Method;
55
import java.util.List;
6+
import org.iot.dsa.DSRuntime;
7+
import org.iot.dsa.DSRuntime.Timer;
68
import org.iot.dsa.node.DSIObject;
79
import org.iot.dsa.node.DSInfo;
810
import org.iot.dsa.node.DSNode;
@@ -11,7 +13,9 @@
1113
import org.iot.dsa.node.action.ActionResult;
1214
import org.iot.dsa.node.action.DSAction;
1315

14-
public abstract class MXBeanNode extends DSNode {
16+
public abstract class MXBeanNode extends DSNode implements Runnable {
17+
18+
private Timer pollTimer;
1519

1620
private static DSAction refreshAction = new DSAction() {
1721
@Override
@@ -31,6 +35,23 @@ protected void declareDefaults() {
3135
protected void onStable() {
3236
setupMXBean();
3337
refresh();
38+
setupPolling();
39+
}
40+
41+
private void setupPolling() {
42+
pollTimer = DSRuntime.run(this, 0, 5000);
43+
}
44+
45+
@Override
46+
public void run() {
47+
if (isTreeSubscribed()) {
48+
refresh();
49+
}
50+
}
51+
52+
@Override
53+
protected void onStopped() {
54+
pollTimer.cancel();
3455
}
3556

3657
private void refresh() {
@@ -42,15 +63,15 @@ private void refresh() {
4263

4364
public abstract void refreshImpl();
4465

45-
public abstract PlatformManagedObject getMXBean();
66+
public abstract Object getMXBean();
4667

47-
public abstract Class<? extends PlatformManagedObject> getMXInterface();
68+
public abstract Class<? extends Object> getMXInterface();
4869

4970
public abstract List<String> getOverriden();
5071

5172
public void discover() {
52-
PlatformManagedObject bean = getMXBean();
53-
Class<? extends PlatformManagedObject> clazz = getMXInterface();
73+
Object bean = getMXBean();
74+
Class<? extends Object> clazz = getMXInterface();
5475
for (Method meth : clazz.getMethods()) {
5576
String methName = meth.getName();
5677
if (meth.getParameterCount() == 0 && meth.getReturnType() != Void.TYPE) {
@@ -68,7 +89,11 @@ public void discover() {
6889
putProp(name,
6990
o != null ? ProfilerUtils.objectToDSIValue(o) : DSString.EMPTY);
7091
} catch (Exception e) {
71-
debug(e);
92+
if (bean instanceof MemoryPoolMXBean && (name.startsWith("UsageThreshold") || name.startsWith("CollectionUsageThreshold"))) {
93+
// ignore
94+
} else {
95+
debug("Exception when invoking " + clazz.getName() + "." + meth.getName() + " on " + getName() + ": ", e);
96+
}
7297
}
7398
}
7499
}
@@ -78,5 +103,4 @@ public void discover() {
78103
protected void putProp(String name, DSIObject obj) {
79104
put(name, obj).setReadOnly(true).setTransient(true);
80105
}
81-
82106
}

dslink-v2/src/main/java/com/acuity/iot/dsa/dslink/sys/profiler/MemoryManagerNode.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.acuity.iot.dsa.dslink.sys.profiler;
22

33
import java.lang.management.MemoryManagerMXBean;
4-
import java.lang.management.PlatformManagedObject;
54
import java.util.ArrayList;
65
import java.util.List;
76

@@ -30,12 +29,12 @@ public void refreshImpl() {
3029
}
3130

3231
@Override
33-
public PlatformManagedObject getMXBean() {
32+
public Object getMXBean() {
3433
return mxbean;
3534
}
3635

3736
@Override
38-
public Class<? extends PlatformManagedObject> getMXInterface() {
37+
public Class<? extends Object> getMXInterface() {
3938
return MemoryManagerMXBean.class;
4039
}
4140

dslink-v2/src/main/java/com/acuity/iot/dsa/dslink/sys/profiler/MemoryNode.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.lang.management.ManagementFactory;
44
import java.lang.management.MemoryMXBean;
5-
import java.lang.management.PlatformManagedObject;
65
import java.util.ArrayList;
76
import java.util.List;
87

@@ -21,12 +20,12 @@ public void refreshImpl() {
2120
}
2221

2322
@Override
24-
public PlatformManagedObject getMXBean() {
23+
public Object getMXBean() {
2524
return mxbean;
2625
}
2726

2827
@Override
29-
public Class<? extends PlatformManagedObject> getMXInterface() {
28+
public Class<? extends Object> getMXInterface() {
3029
return MemoryMXBean.class;
3130
}
3231

dslink-v2/src/main/java/com/acuity/iot/dsa/dslink/sys/profiler/MemoryPoolNode.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.acuity.iot.dsa.dslink.sys.profiler;
22

33
import java.lang.management.MemoryPoolMXBean;
4-
import java.lang.management.PlatformManagedObject;
54
import java.util.ArrayList;
65
import java.util.List;
76

@@ -25,17 +24,15 @@ public void setupMXBean() {
2524

2625
@Override
2726
public void refreshImpl() {
28-
// TODO Auto-generated method stub
29-
3027
}
3128

3229
@Override
33-
public PlatformManagedObject getMXBean() {
30+
public Object getMXBean() {
3431
return mxbean;
3532
}
3633

3734
@Override
38-
public Class<? extends PlatformManagedObject> getMXInterface() {
35+
public Class<? extends Object> getMXInterface() {
3936
return MemoryPoolMXBean.class;
4037
}
4138

dslink-v2/src/main/java/com/acuity/iot/dsa/dslink/sys/profiler/OperatingSystemNode.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.lang.management.ManagementFactory;
44
import java.lang.management.OperatingSystemMXBean;
5-
import java.lang.management.PlatformManagedObject;
65
import java.util.ArrayList;
76
import java.util.List;
87

@@ -22,12 +21,12 @@ public void refreshImpl() {
2221
}
2322

2423
@Override
25-
public PlatformManagedObject getMXBean() {
24+
public Object getMXBean() {
2625
return mxbean;
2726
}
2827

2928
@Override
30-
public Class<? extends PlatformManagedObject> getMXInterface() {
29+
public Class<? extends Object> getMXInterface() {
3130
return OperatingSystemMXBean.class;
3231
}
3332

dslink-v2/src/main/java/com/acuity/iot/dsa/dslink/sys/profiler/RuntimeNode.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.acuity.iot.dsa.dslink.sys.profiler;
22

33
import java.lang.management.ManagementFactory;
4-
import java.lang.management.PlatformManagedObject;
54
import java.lang.management.RuntimeMXBean;
65
import java.time.Instant;
76
import java.util.ArrayList;
@@ -46,12 +45,12 @@ public void refreshImpl() {
4645
}
4746

4847
@Override
49-
public PlatformManagedObject getMXBean() {
48+
public Object getMXBean() {
5049
return mxbean;
5150
}
5251

5352
@Override
54-
public Class<? extends PlatformManagedObject> getMXInterface() {
53+
public Class<? extends Object> getMXInterface() {
5554
return RuntimeMXBean.class;
5655
}
5756

dslink-v2/src/main/java/com/acuity/iot/dsa/dslink/sys/profiler/SysProfiler.java

+14-9
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ public class SysProfiler extends DSNode {
1515
@Override
1616
protected void declareDefaults() {
1717
super.declareDefaults();
18-
declareDefault("Runtime", new RuntimeNode());
19-
declareDefault("Class Loading", new ClassLoadingNode());
20-
declareDefault("Compilation", new CompilationNode());
21-
declareDefault("Memory", new MemoryNode());
22-
declareDefault("Operating System", new OperatingSystemNode());
23-
declareDefault("Thread", new ThreadNode());
24-
declareDefault("Garbage Collectors", new DSNode());
25-
declareDefault("Memory Managers", new DSNode());
26-
declareDefault("Memory Pools", new DSNode());
18+
declareDefault("Runtime", new RuntimeNode()).setTransient(true);
19+
declareDefault("Class Loading", new ClassLoadingNode()).setTransient(true);
20+
declareDefault("Compilation", new CompilationNode()).setTransient(true);
21+
declareDefault("Memory", new MemoryNode()).setTransient(true);
22+
declareDefault("Operating System", new OperatingSystemNode()).setTransient(true);
23+
declareDefault("Thread", new ThreadNode()).setTransient(true);
24+
declareDefault("Garbage Collectors", new DSNode()).setTransient(true);
25+
declareDefault("Memory Managers", new DSNode()).setTransient(true);
26+
declareDefault("Memory Pools", new DSNode()).setTransient(true);
2727
}
2828

2929
@Override
@@ -41,5 +41,10 @@ protected void onStable() {
4141
mpNode.put(mxbean.getName(), new MemoryPoolNode(mxbean)).setTransient(true);
4242
}
4343
}
44+
45+
@Override
46+
public String getLogName() {
47+
return getLogName("profiler");
48+
}
4449

4550
}

0 commit comments

Comments
 (0)