package scouter.agent.counter.task;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.hyperic.sigar.ProcCpu;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.SigarProxy;
import org.hyperic.sigar.SigarProxyCache;
import scouter.agent.Configure;
import scouter.agent.Logger;
import scouter.agent.counter.CounterBasket;
import scouter.agent.counter.anotation.Counter;
import scouter.agent.counter.meter.MeterResource;
import scouter.lang.TimeTypeEnum;
import scouter.lang.conf.ConfObserver;
import scouter.lang.counters.CounterConstants;
import scouter.lang.pack.PerfCounterPack;
import scouter.lang.value.FloatValue;
import scouter.util.CastUtil;
import scouter.util.FileUtil;
public class ProcPerf {
static int SLEEP_TIME = 2000;
static Sigar sigarImpl = new Sigar();
static SigarProxy sigar = SigarProxyCache.newInstance(sigarImpl, SLEEP_TIME);
private static File regRoot = null;
Map<String, MeterResource> meterMap = new HashMap<String, MeterResource>();
public static void ready() {
String objReg = Configure.getInstance().counter_object_registry_path;
File objRegFile = new File(objReg);
if (objRegFile.canRead() == false) {
objRegFile.mkdirs();
}
if (objRegFile.exists()) {
regRoot = objRegFile;
} else {
regRoot = null;
}
}
static {
ready();
ConfObserver.add("ProcPerf", new Runnable() {
@Override
public void run() {
ready();
}
});
}
int cpuCores = 0;
@Counter
public void process(CounterBasket pw) {
File dir = regRoot;
if (dir == null)
return;
if (cpuCores == 0) {
cpuCores = getCpuCore();
Logger.info("Num of Cpu Cores : " + cpuCores);
}
long now = System.currentTimeMillis();
File[] pids = dir.listFiles();
for (int i = 0; i < pids.length; i++) {
if (pids[i].isDirectory())
continue;
String name = pids[i].getName();
if (name.endsWith(".scouter") == false) {
continue;
}
int pid = CastUtil.cint(name.substring(0, name.lastIndexOf(".")));
if (pid == 0)
continue;
if (now > pids[i].lastModified() + 5000) {
pids[i].delete();
continue;
}
String objname = new String(FileUtil.readAll(pids[i]));
MeterResource meter = meterMap.get(objname);
if (meter == null) {
meter = new MeterResource();
meterMap.put(objname, meter);
}
try {
ProcCpu cpu = sigar.getProcCpu(pid);
double value = cpu.getPercent() * 100.0D/cpuCores;
meter.add(value);
float procCpu = (float) meter.getAvg(Configure.getInstance()._cpu_value_avg_sec);
PerfCounterPack p = pw.getPack(objname, TimeTypeEnum.REALTIME);
p.put(CounterConstants.PROC_CPU, new FloatValue(procCpu));
p = pw.getPack(objname, TimeTypeEnum.FIVE_MIN);
p.put(CounterConstants.PROC_CPU, new FloatValue(procCpu));
} catch (Exception e) {
// ignore no proc
}
}
}
private int getCpuCore() {
try {
return sigar.getCpuList().length;
} catch (SigarException e) {
return 1;
}
}
}