Search in sources :

Example 1 with ManagedBeanOperation

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]));
        }
    }
}
Also used : CompositeData(javax.management.openmbean.CompositeData) ManagedBeanInfo(com.haulmont.cuba.web.jmx.entity.ManagedBeanInfo) JmxInstance(com.haulmont.cuba.core.entity.JmxInstance) ManagedBeanOperation(com.haulmont.cuba.web.jmx.entity.ManagedBeanOperation)

Example 2 with ManagedBeanOperation

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();
}
Also used : ManagedBeanOperation(com.haulmont.cuba.web.jmx.entity.ManagedBeanOperation) CompositeData(javax.management.openmbean.CompositeData) ManagedBeanInfo(com.haulmont.cuba.web.jmx.entity.ManagedBeanInfo) JmxInstance(com.haulmont.cuba.core.entity.JmxInstance)

Aggregations

JmxInstance (com.haulmont.cuba.core.entity.JmxInstance)2 ManagedBeanInfo (com.haulmont.cuba.web.jmx.entity.ManagedBeanInfo)2 ManagedBeanOperation (com.haulmont.cuba.web.jmx.entity.ManagedBeanOperation)2 CompositeData (javax.management.openmbean.CompositeData)2