package org.radargun.sysmonitor; import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; import org.radargun.reporting.Timeline; import org.radargun.traits.JmxConnectionProvider; /** * UNIX-only: checks number of open descriptors in given process * * @author Radim Vansa <rvansa@redhat.com> */ public class OpenFilesMonitor extends JmxMonitor { private static final String OPEN_FILES = "Open files"; private static final String OPEN_FILE_DESCRIPTOR_COUNT = "OpenFileDescriptorCount"; private static final String MAX_FILE_DESCRIPTOR_COUNT = "MaxFileDescriptorCount"; public OpenFilesMonitor(JmxConnectionProvider jmxConnectionProvider, Timeline timeline) { super(jmxConnectionProvider, timeline); } public synchronized void run() { try { if (connection == null) { log.warn("MBean connection is not open, cannot read open files stats"); return; } OperatingSystemMXBean osBean = ManagementFactory.newPlatformMXBeanProxy(connection, ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, OperatingSystemMXBean.class); Long openFiles = (Long) connection.getAttribute(osBean.getObjectName(), OPEN_FILE_DESCRIPTOR_COUNT); Long maxOpenFiles = (Long) connection.getAttribute(osBean.getObjectName(), MAX_FILE_DESCRIPTOR_COUNT); if (openFiles != null) { timeline.addValue(Timeline.Category.sysCategory(OPEN_FILES), new Timeline.Value(openFiles)); } log.tracef("Open files: open=%s, max=%s", openFiles, maxOpenFiles); } catch (Exception e) { log.error("Error in open files stats retrieval", e); } } @Override public synchronized void start() { super.start(); timeline.addValue(Timeline.Category.sysCategory(OPEN_FILES), new Timeline.Value(0)); } @Override public synchronized void stop() { super.stop(); timeline.addValue(Timeline.Category.sysCategory(OPEN_FILES), new Timeline.Value(0)); } }