package art.servers.controller; import art.library.model.devices.DeviceStatus; import art.library.model.devices.application.Application; import art.library.model.devices.application.ApplicationAlarms; import art.library.model.devices.application.ApplicationInformation; import art.library.model.devices.application.ApplicationStatus; import art.library.model.devices.application.status.ApplicationStatusMemory; import art.library.model.devices.application.status.ApplicationStatusOperatingSystem; import art.library.model.devices.application.status.ApplicationStatusRuntime; import art.library.model.devices.application.status.ApplicationStatusThread; import art.library.utils.synchro.Mutex; import art.servers.Shared; import com.sun.management.OperatingSystemMXBean; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.management.MemoryUsage; import java.lang.management.RuntimeMXBean; import java.lang.management.ThreadMXBean; import javax.management.MBeanServerConnection; public class ControllerStatus extends Controller { private Application application = null; private Mutex mutexPersistance = new Mutex(); public ControllerStatus(Application application) { this.setName("Controller status"); this.application = application; try { ApplicationStatus status = (ApplicationStatus)this.application.getDeviceStatus(); status.started = System.currentTimeMillis(); } catch (Exception e) { } } public Application getApplication() { return application; } public int getAlarms() { try { return 0; } catch (Exception e) { } return DeviceStatus.STATUS_UNKNOWN; } public void run() { try { // Get the stored timeless application if exists // If not we use the application from process configuration file Application[] timelessApplication = Shared.model.getApplication(0); application.information = timelessApplication[0].information; } catch (Exception e) { } Shared.traceInformation(getName(), "Starting"); long lastTimestamp = System.currentTimeMillis(); while ((isInterrupted() == false) && (exit == false)) { // Update current process information lastTimestamp = System.currentTimeMillis(); memoryMXBean(application, lastTimestamp); threadMXBean(application, lastTimestamp); runtimeMXBean(application, lastTimestamp); operatingSystemMXBean(application, lastTimestamp); updateAlarms(application, lastTimestamp); application.setAlarm("alarm_offline", false); if (application.getLastTimestampStatusUpdate() > lastTimestamp) { application.setLastTimestampStatusUpdate(application.getLastTimestampStatusUpdate() + 1); } else { application.setLastTimestampStatusUpdate(lastTimestamp); } if (application.getLastTimestampUpdate() > lastTimestamp) { application.setLastTimestampUpdate(application.getLastTimestampUpdate() + 1); } else { application.setLastTimestampUpdate(lastTimestamp); } updatePersistence(application); long timetowait = application.getDeviceInformation().hearbeat -(System.currentTimeMillis() - lastTimestamp); if (timetowait > 0) { try { sleep(timetowait); } catch (Exception e) { } } } Shared.traceInformation(getName(), "Finishing"); } private void updatePersistence(Application application) { mutexPersistance.lockWrite(); try { Shared.model.updateApplication(application); } catch (Exception e) { } finally { mutexPersistance.releaseWrite(); } } private void memoryMXBean(Application application, long timestamp) { try { MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); ApplicationStatus status = application.getDeviceStatus(); if (status.memory == null) status.memory = new ApplicationStatusMemory(); status.memory.timestamp = timestamp; MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage(); MemoryUsage nonheapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage(); status.memory.heapMemoryUsage_init = heapMemoryUsage.getInit(); status.memory.heapMemoryUsage_max = heapMemoryUsage.getMax(); status.memory.heapMemoryUsage_used = heapMemoryUsage.getUsed(); status.memory.heapMemoryUsage_committed = heapMemoryUsage.getCommitted(); status.memory.nonheapMemoryUsage_init = nonheapMemoryUsage.getInit(); status.memory.nonheapMemoryUsage_max = nonheapMemoryUsage.getMax(); status.memory.nonheapMemoryUsage_used = nonheapMemoryUsage.getUsed(); status.memory.nonheapMemoryUsage_committed = nonheapMemoryUsage.getCommitted(); } catch (Exception e) { } } private void threadMXBean(Application application, long timestamp) { try { ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); ApplicationStatus status = application.getDeviceStatus(); if (status.thread == null) status.thread = new ApplicationStatusThread(); status.thread.timestamp = timestamp; long[] threadsid = threadMXBean.getAllThreadIds(); long threadCpuTime = 0; long threadUserTime = 0; for (long threadid : threadsid) { try { long currentThreadCpuTime = threadMXBean.getThreadCpuTime(threadid); long currentThreadUserTime = threadMXBean.getThreadUserTime(threadid); if (currentThreadCpuTime > 0) threadCpuTime = threadCpuTime + currentThreadCpuTime; if (currentThreadUserTime > 0) threadUserTime = threadUserTime + currentThreadUserTime; } catch (Exception e) { } } status.thread.totalStartedThreadCount = threadMXBean.getTotalStartedThreadCount(); status.thread.threadCount = threadMXBean.getThreadCount(); status.thread.peakThreadCount = threadMXBean.getPeakThreadCount(); status.thread.daemonThreadCount = threadMXBean.getDaemonThreadCount(); } catch (Exception e) { } } private void runtimeMXBean(Application application, long timestamp) { try { RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean(); ApplicationStatus status = application.getDeviceStatus(); if (status.runtime == null) status.runtime = new ApplicationStatusRuntime(); status.runtime.timestamp = timestamp; status.runtime.startTime = runtimeMXBean.getStartTime(); status.runtime.upTime = runtimeMXBean.getUptime(); status.runtime.userTimeZone = runtimeMXBean.getSystemProperties().get("os.timezone"); status.runtime.javaVmSpecificationVersion = runtimeMXBean.getSystemProperties().get("java.vm.specification.version"); status.runtime.javaRuntimeVersion = runtimeMXBean.getSystemProperties().get("java.runtime.version"); status.runtime.javaClassVersion = runtimeMXBean.getSystemProperties().get("java.class.version"); status.runtime.userCountry = runtimeMXBean.getSystemProperties().get("user.country"); status.runtime.userLanguage = runtimeMXBean.getSystemProperties().get("user.language"); status.runtime.userTimeZone = runtimeMXBean.getSystemProperties().get("user.timezone"); } catch (Exception e) { } } private long nanoBefore = 0; private long cpuBefore = 0; private void operatingSystemMXBean(Application application, long timestamp) { try { OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean(); ApplicationStatus status = application.getDeviceStatus(); if (status.system == null) status.system = new ApplicationStatusOperatingSystem(); status.system.timestamp = timestamp; status.system.committedVirtualMemorySize = operatingSystemMXBean.getCommittedVirtualMemorySize(); status.system.freePhysicalMemorySize = operatingSystemMXBean.getFreePhysicalMemorySize(); status.system.freeSwapSpaceSize = operatingSystemMXBean.getFreeSwapSpaceSize(); status.system.processCpuLoad = operatingSystemMXBean.getProcessCpuLoad(); status.system.processCpuTime = operatingSystemMXBean.getProcessCpuTime(); status.system.systemCpuLoad = operatingSystemMXBean.getSystemCpuLoad(); status.system.totalPhysicalMemorySize = operatingSystemMXBean.getTotalPhysicalMemorySize(); status.system.totalSwapSpaceSize = operatingSystemMXBean.getTotalSwapSpaceSize(); status.system.systemLoadAverage = operatingSystemMXBean.getSystemLoadAverage(); status.system.availableProcessors = operatingSystemMXBean.getAvailableProcessors(); status.system.totalPhysicalMemorySize = operatingSystemMXBean.getTotalPhysicalMemorySize(); status.system.name = operatingSystemMXBean.getName(); status.system.version = operatingSystemMXBean.getVersion(); status.system.arch = operatingSystemMXBean.getArch(); if (status.system.systemLoadAverage == -1) { MBeanServerConnection mbsc = ManagementFactory.getPlatformMBeanServer(); OperatingSystemMXBean osMBean = ManagementFactory.newPlatformMXBeanProxy( mbsc, ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, OperatingSystemMXBean.class); if (nanoBefore == 0) { long cpuBefore = osMBean.getProcessCpuTime(); long nanoBefore = System.nanoTime(); } long cpuAfter = osMBean.getProcessCpuTime(); long nanoAfter = System.nanoTime(); if (nanoAfter > nanoBefore) { status.system.systemLoadAverage = ((cpuAfter-cpuBefore)*100L)/ (nanoAfter-nanoBefore); } nanoBefore = nanoAfter; cpuBefore = cpuAfter; } } catch (Exception e) { } } private void updateAlarms(Application application, long timestamp) { try { ApplicationInformation information = application.getDeviceInformation(); ApplicationStatus status = application.getDeviceStatus(); ApplicationAlarms alarms = application.getDeviceAlarms(); application.setAlarm("alarm_threads_error", (status.thread.threadCount >= information.threshold_threads_error),timestamp); application.setAlarm("alarm_threads_warning", (status.thread.threadCount >= information.threshold_threads_warning) && (alarms.alarm_threads_error == 0), timestamp); float memoryCommited = (status.memory.heapMemoryUsage_committed + status.memory.nonheapMemoryUsage_committed); float memoryused = (status.memory.heapMemoryUsage_used + status.memory.nonheapMemoryUsage_used); float memoryLoad = 0.0f; if (memoryCommited > 0) memoryLoad = memoryused / memoryCommited; application.setAlarm("alarm_memory_error", (memoryLoad >= information.threshold_memory_error),timestamp); application.setAlarm("alarm_memory_warning", (memoryLoad >= information.threshold_memory_warning) && (alarms.alarm_memory_error == 0), timestamp); application.setAlarm("alarm_processCpuLoad_error", (status.system.processCpuLoad >= information.threshold_processCpuLoad_error),timestamp); application.setAlarm("alarm_processCpuLoad_warning", (status.system.processCpuLoad >= information.threshold_processCpuLoad_warning) && (alarms.alarm_processCpuLoad_error == 0), timestamp); application.setAlarm("alarm_systemCpuLoad_error", (status.system.systemCpuLoad >= information.threshold_systemCpuLoad_error),timestamp); application.setAlarm("alarm_systemCpuLoad_warning", (status.system.systemCpuLoad >= information.threshold_systemCpuLoad_warning) && (alarms.alarm_systemCpuLoad_error == 0), timestamp); } catch (Exception e) { } } }