package cz.cuni.mff.d3s.been.detectors; import cz.cuni.mff.d3s.been.core.ri.*; /** * * Sample detector and generator. * * @author Kuba Brecka */ public final class Detector { /** native detector. */ private SigarDetector nativeDetector; /** fallback Java-based detector. */ private JavaDetector javaDetector; /** * Creates new Detector */ public Detector() { // detect HW nativeDetector = new SigarDetector(); javaDetector = new JavaDetector(); } /** * Detect all possible information available on the Host * * @param runtimeInfo * where to fill detected information */ public void detectAll(RuntimeInfo runtimeInfo) { // detect Java runtimeInfo.setJava(javaDetector.detectJava()); if (!nativeDetector.isSigarAvailable()) { javaDetector.detectOperatingSystem(runtimeInfo); javaDetector.detectHardware(runtimeInfo); javaDetector.detectFilesystems(runtimeInfo); return; } // detect hardware runtimeInfo.setHardware(nativeDetector.detectHardware()); // detect OS runtimeInfo.setOperatingSystem(nativeDetector.detectOperatingSystem()); // detect filesystems for (Filesystem fs : nativeDetector.detectFilesystems()) { runtimeInfo.getFilesystem().add(fs); } } private MonitorSample lastSample; /** * Generates new Monitoring sample. * * @param differential * whether to calculate difference against previous generated sample * * @return generated monitoring sample */ public MonitorSample generateSample(boolean differential) { MonitorSample newSample; if (nativeDetector.isSigarAvailable()) { newSample = nativeDetector.generateSample(); } else { newSample = javaDetector.generateSample(); } MonitorSample sample = newSample; if (differential) sample = calculateDifferentialSample(sample, lastSample); lastSample = newSample; sample.setTimestamp(System.currentTimeMillis()); return sample; } private MonitorSample calculateDifferentialSample(MonitorSample newSample, MonitorSample oldSample) { MonitorSample diff = new MonitorSample(); diff.setLoadAverage(newSample.getLoadAverage()); diff.setTimestamp(newSample.getTimestamp()); diff.setFreeMemory(newSample.getFreeMemory()); diff.setProcessCount(newSample.getProcessCount()); diff.setCpuUsage(newSample.getCpuUsage()); // network int networkCount = newSample.getInterfaces().size(); if (oldSample != null) networkCount = Math.min(networkCount, oldSample.getInterfaces().size()); for (int i = 0; i < networkCount; i++) { NetworkSample n1 = newSample.getInterfaces().get(i); NetworkSample diffSample = new NetworkSample(); diffSample.setName(n1.getName()); if (oldSample != null) { NetworkSample n2 = oldSample.getInterfaces().get(i); diffSample.setBytesIn(n1.getBytesIn() - n2.getBytesIn()); diffSample.setBytesOut(n1.getBytesOut() - n2.getBytesOut()); } diff.getInterfaces().add(diffSample); } // filesystems int fileSystemCount = newSample.getFilesystems().size(); if (oldSample != null) fileSystemCount = Math.min(fileSystemCount, oldSample.getFilesystems().size()); for (int i = 0; i < fileSystemCount; i++) { FilesystemSample f1 = newSample.getFilesystems().get(i); FilesystemSample diffSample = new FilesystemSample(); diffSample.setDeviceName(f1.getDeviceName()); diffSample.setDirectory(f1.getDirectory()); if (oldSample != null) { FilesystemSample f2 = oldSample.getFilesystems().get(i); diffSample.setReadBytes(f1.getReadBytes() - f2.getReadBytes()); diffSample.setReads(f1.getReads() - f2.getReads()); diffSample.setWriteBytes(f1.getWriteBytes() - f2.getWriteBytes()); diffSample.setWrites(f1.getWrites() - f2.getWrites()); } diff.getFilesystems().add(diffSample); } return diff; } }