Groovy support
Enhance the developer experience by scripting the Live API and make proof of concepts even faster

Last updated
Enhance the developer experience by scripting the Live API and make proof of concepts even faster

Last updated
import java.lang.management.LockInfo;
import java.lang.management.ManagementFactory;
import java.lang.management.MonitorInfo;
import java.lang.management.ThreadInfo;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
live.web().addService("threaddump", new ThreadDumpService());
@Path("/")
@Produces("text/plain")
public class ThreadDumpService {
@GET
public String threadDump() {
return formatStackTraces() +
"\n---------------------------------------------------\n" +
memoryInformation() +
"\n---------------------------------------------------\n" +
garbageCollectorInformation()
}
String formatStackTraces() {
ThreadInfo[] allThreads = ManagementFactory.getThreadMXBean().dumpAllThreads(true, true);
StringBuilder dump = new StringBuilder();
for (ThreadInfo threadInfo : allThreads) {
dump.append("Thread: [").append(threadInfo.getThreadName())
.append("] state=").append(threadInfo.getThreadState()).append("\n");
if (threadInfo.getLockInfo() != null) {
dump.append("Waiting ").append(threadInfo.getLockInfo()).append("\n");
}
if (threadInfo.getLockedMonitors() != null && threadInfo.getLockedMonitors().length > 0) {
dump.append("Currently locking monitors:\n");
for(MonitorInfo monitor : threadInfo.getLockedMonitors()) {
dump.append(" - ").append(monitor).append("\n");
}
}
if (threadInfo.getLockedSynchronizers() != null && threadInfo.getLockedSynchronizers().length > 0) {
dump.append("Currently locking Synchronizers:\n");
for(LockInfo synchronizer : threadInfo.getLockedSynchronizers()) {
dump.append(" - ").append(synchronizer).append("\n");
}
}
for (StackTraceElement traceElement : threadInfo.getStackTrace()) {
dump.append(" at ").append(traceElement).append("\n");
}
dump.append("\n");
}
return dump.toString();
}
String memoryInformation() {
StringBuilder memInfo = new StringBuilder();
def memMxBean = ManagementFactory.memoryMXBean
memInfo.append("Head Memory Usage: ").append(memMxBean.heapMemoryUsage)
.append("\nNonHead Memory Usage: ").append(memMxBean.nonHeapMemoryUsage)
return memInfo.toString();
}
String garbageCollectorInformation() {
StringBuilder gcInfo = new StringBuilder();
ManagementFactory.garbageCollectorMXBeans.each {gc ->
gcInfo.append("MemoryManager: ").append(gc.name).append(" valid: ").append(gc.valid)
.append(" collectionCount: ").append(gc.collectionCount).append(" collectionTime: ").append(gc.collectionTime).append("\n")
}
return gcInfo.toString()
}
}