use of com.haulmont.cuba.web.jmx.entity.ManagedBeanOperation in project cuba by cuba-platform.
the class ThreadsDatasource method loadData.
@Override
protected void loadData(Map<String, Object> params) {
JmxInstance node = (JmxInstance) params.get("node");
ManagedBeanInfo threadingBean = jmxControlAPI.getManagedBean(node, "java.lang:type=Threading");
int nCPUs = (int) getAttributeValue(node, "java.lang:type=OperatingSystem", "AvailableProcessors");
final long[] allThreadsIds = (long[]) getAttributeValue(node, "java.lang:type=Threading", "AllThreadIds");
ManagedBeanOperation getThreadInfo = jmxControlAPI.getOperation(threadingBean, "getThreadInfo", new String[] { "[J" });
CompositeData[] threadsInfo = (CompositeData[]) jmxControlAPI.invokeOperation(getThreadInfo, new Object[] { allThreadsIds });
final long currentUptime = (long) getAttributeValue(node, "java.lang:type=Runtime", "Uptime");
ManagedBeanOperation getThreadCpuTime = jmxControlAPI.getOperation(threadingBean, "getThreadCpuTime", new String[] { "[J" });
long[] threadCpuTime = (long[]) jmxControlAPI.invokeOperation(getThreadCpuTime, new Object[] { allThreadsIds });
if (prevUptime > 0L && currentUptime > prevUptime) {
// elapsedTime is in ms
long elapsedTime = currentUptime - prevUptime;
for (int i = 0; i < allThreadsIds.length; i++) {
// elapsedCpu is in ns
Long threadId = allThreadsIds[i];
// for new threads returns null.
Long prevCpuTimeLong = prevThread2CpuTime.get(threadId);
long prevCpuTime = prevCpuTimeLong != null ? prevCpuTimeLong : 0L;
long elapsedCpu = threadCpuTime[i] - prevCpuTime;
// cpuUsage could go higher than 100% because elapsedTime
// and elapsedCpu are not fetched simultaneously. Limit to 99%.
double cpuUsage = Math.min(99d, elapsedCpu / (elapsedTime * 1000000d / /*convert to ns*/
100 * /*percents*/
nCPUs));
getThreadSnapshot(threadId).setCpu(cpuUsage);
}
}
prevUptime = currentUptime;
for (int i = 0; i < allThreadsIds.length; i++) {
long time = threadCpuTime[i] != -1L ? threadCpuTime[i] : 0L;
prevThread2CpuTime.put(allThreadsIds[i], time);
}
ManagedBeanOperation findDeadlockedThreads = jmxControlAPI.getOperation(threadingBean, "findDeadlockedThreads", null);
Long[] deadlockedThreads = (Long[]) jmxControlAPI.invokeOperation(findDeadlockedThreads, null);
Set<Long> deadLockedThreadsSet = new HashSet<>();
if (deadlockedThreads != null) {
CollectionUtils.addAll(deadLockedThreadsSet, deadlockedThreads);
}
Set<Long> allThreadsSet = new HashSet<>();
CollectionUtils.addAll(allThreadsSet, ArrayUtils.toObject(allThreadsIds));
// remove all terminated threads.
Collection<ThreadSnapshot> toRemove = new LinkedList<>();
for (ThreadSnapshot snapshot : getItems()) {
if (!allThreadsSet.contains(snapshot.getThreadId())) {
toRemove.add(snapshot);
}
}
for (ThreadSnapshot snapshot : toRemove) {
removeItem(snapshot);
}
// update visual data.
for (int i = 0; i < threadsInfo.length; i++) {
CompositeData info = threadsInfo[i];
if (info != null) {
Long threadId = (Long) info.get("threadId");
ThreadSnapshot item = getThreadSnapshot(threadId);
item.setName((String) info.get("threadName"));
item.setStatus(info.get("threadState").toString());
item.setDeadLocked(deadLockedThreadsSet.contains(threadId));
} else {
// no thread info available.
removeItem(getThreadSnapshot(allThreadsIds[i]));
}
}
}
use of com.haulmont.cuba.web.jmx.entity.ManagedBeanOperation in project cuba by cuba-platform.
the class ThreadsDatasource method getStackTrace.
protected String getStackTrace(Long threadId) {
JmxInstance node = (JmxInstance) savedParameters.get("node");
ManagedBeanInfo threadingBean = jmxControlAPI.getManagedBean(node, "java.lang:type=Threading");
ManagedBeanOperation getThreadInfo = jmxControlAPI.getOperation(threadingBean, "getThreadInfo", new String[] { "long", "int" });
CompositeData threadInfo = (CompositeData) jmxControlAPI.invokeOperation(getThreadInfo, new Object[] { threadId, Integer.MAX_VALUE });
StringBuilder sb = new StringBuilder();
if (threadInfo != null) {
CompositeData[] traces = (CompositeData[]) threadInfo.get("stackTrace");
ThreadSnapshot t = getThreadSnapshot(threadId);
sb.append(t.getName()).append(" [id=").append(threadId).append("] (").append(t.getStatus()).append(")\n");
for (CompositeData trace : traces) {
String className = (String) trace.get("className");
String methodName = (String) trace.get("methodName");
int line = (int) trace.get("lineNumber");
sb.append(className).append(".").append(methodName).append(":").append(line).append("\n");
}
}
return sb.toString();
}
Aggregations