package com.intrbiz.bergamot.worker.engine.agent;
import java.text.DecimalFormat;
import java.util.UUID;
import org.apache.log4j.Logger;
import com.intrbiz.bergamot.agent.server.BergamotAgentServerHandler;
import com.intrbiz.bergamot.model.message.agent.check.CheckCPU;
import com.intrbiz.bergamot.model.message.agent.stat.CPUStat;
import com.intrbiz.bergamot.model.message.check.ExecuteCheck;
import com.intrbiz.bergamot.model.message.result.ActiveResultMO;
import com.intrbiz.bergamot.util.UnitUtil;
import com.intrbiz.bergamot.worker.engine.AbstractExecutor;
import com.intrbiz.gerald.polyakov.gauge.DoubleGaugeReading;
/**
* Check the cpu usage of a Bergamot Agent
*/
public class CPUExecutor extends AbstractExecutor<AgentEngine>
{
public static final String NAME = "cpu";
private static final DecimalFormat DFMT = new DecimalFormat("0.00");
private Logger logger = Logger.getLogger(CPUExecutor.class);
public CPUExecutor()
{
super();
}
/**
* Only execute Checks where the engine == "agent"
*/
@Override
public boolean accept(ExecuteCheck task)
{
return AgentEngine.NAME.equals(task.getEngine()) && NAME.equals(task.getExecutor());
}
@Override
public void execute(ExecuteCheck executeCheck)
{
if (logger.isTraceEnabled()) logger.trace("Checking Bergamot Agent CPU Usage");
try
{
// check the host presence
UUID agentId = executeCheck.getAgentId();
if (agentId == null) throw new RuntimeException("No agent id was given");
// lookup the agent
BergamotAgentServerHandler agent = this.getEngine().getAgentServer().getRegisteredAgent(agentId);
if (agent != null)
{
// get the CPU stats
long sent = System.nanoTime();
agent.sendMessageToAgent(new CheckCPU(), (response) -> {
double runtime = ((double)(System.nanoTime() - sent)) / 1000_000D;
CPUStat stat = (CPUStat) response;
if (logger.isTraceEnabled()) logger.trace("Got CPU usage in " + runtime + "ms: " + stat);
// apply the check
this.publishActiveResult(executeCheck, new ActiveResultMO().fromCheck(executeCheck).applyGreaterThanThreshold(
stat.getTotalUsage().getTotal(),
executeCheck.getPercentParameter("cpu_warning", 0.8D),
executeCheck.getPercentParameter("cpu_critical", 0.9D),
"Load: " + DFMT.format(stat.getLoad1()) + " " + DFMT.format(stat.getLoad5()) + " " + DFMT.format(stat.getLoad15()) + ", Usage: " + DFMT.format(UnitUtil.toPercent(stat.getTotalUsage().getTotal())) + "% of " + stat.getCpuCount() + " @ " + stat.getInfo().get(0).getSpeed() + " MHz " + stat.getInfo().get(0).getVendor() + " " + stat.getInfo().get(0).getModel()
).runtime(runtime));
// readings
this.publishReading(executeCheck,
new DoubleGaugeReading("cpu-usage-total", "%", UnitUtil.toPercent(stat.getTotalUsage().getTotal()), UnitUtil.toPercent(executeCheck.getPercentParameter("cpu_warning", 0.8D)), UnitUtil.toPercent(executeCheck.getPercentParameter("cpu_critical", 0.9D)), 1D, 100D),
new DoubleGaugeReading("cpu-usage-system", "%", UnitUtil.toPercent(stat.getTotalUsage().getSystem()), null, null, 1D, 100D),
new DoubleGaugeReading("cpu-usage-user", "%", UnitUtil.toPercent(stat.getTotalUsage().getUser()), null, null, 1D, 100D),
new DoubleGaugeReading("cpu-usage-wait", "%", UnitUtil.toPercent(stat.getTotalUsage().getWait()), null, null, 1D, 100D)
);
});
}
else
{
// raise an error
this.publishActiveResult(executeCheck, new ActiveResultMO().fromCheck(executeCheck).disconnected("Bergamot Agent disconnected"));
}
}
catch (Exception e)
{
this.publishActiveResult(executeCheck, new ActiveResultMO().fromCheck(executeCheck).error(e));
}
}
}