package com.intrbiz.bergamot.worker.engine.agent;
import java.util.UUID;
import org.apache.log4j.Logger;
import com.intrbiz.bergamot.agent.server.BergamotAgentServerHandler;
import com.intrbiz.bergamot.model.message.agent.check.CheckProcess;
import com.intrbiz.bergamot.model.message.agent.stat.ProcessStat;
import com.intrbiz.bergamot.model.message.check.ExecuteCheck;
import com.intrbiz.bergamot.model.message.result.ActiveResultMO;
import com.intrbiz.bergamot.worker.engine.AbstractExecutor;
import com.intrbiz.gerald.polyakov.gauge.LongGaugeReading;
/**
* Check process stats via Bergamot Agent
*/
public class ProcessStatsExecutor extends AbstractExecutor<AgentEngine>
{
public static final String NAME = "process-stats";
private Logger logger = Logger.getLogger(ProcessStatsExecutor.class);
public ProcessStatsExecutor()
{
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 process stats");
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 process stats
CheckProcess check = new CheckProcess();
check.setListProcesses(false);
long sent = System.nanoTime();
agent.sendMessageToAgent(check, (response) -> {
double runtime = ((double)(System.nanoTime() - sent)) / 1000_000D;
ProcessStat stat = (ProcessStat) response;
if (logger.isTraceEnabled()) logger.trace("Got who in " + runtime + "ms: " + stat);
// thresholds
long warning = executeCheck.getLongParameter("warning", 150);
long critical = executeCheck.getLongParameter("critical", 200);
// get the metric
String state = executeCheck.getParameter("state", "total").toLowerCase();
long count = -1;
String message = null;
if ("running".equals(state))
{
count = stat.getRunning();
message = count + " running of " + stat.getTotal() + " processes";
}
else if ("sleeping".equals(state))
{
count = stat.getSleeping();
message = count + " sleeping of " + stat.getTotal() + " processes";
}
else if ("stopped".equals(state))
{
count = stat.getStopped();
message = count + " stopped of " + stat.getTotal() + " processes";
}
else if ("idle".equals(state))
{
count = stat.getIdle();
message = count + " idle of " + stat.getTotal() + " processes";
}
else if ("zombie".equals(state))
{
count = stat.getZombie();
message = count + " zombie of " + stat.getTotal() + " processes";
}
else if ("threads".equals(state))
{
count = stat.getThreads();
message = count + " total threads over " + stat.getTotal() + " total processes";
}
else
{
state = "total";
count = stat.getTotal();
message = count + " total processes, " + stat.getThreads() + " total threads";
}
// apply the check
this.publishActiveResult(executeCheck, new ActiveResultMO().fromCheck(executeCheck).applyGreaterThanThreshold(
count,
warning,
critical,
message
).runtime(runtime));
// publish readings
this.publishReading(executeCheck, new LongGaugeReading(state + "-processes", null, count, warning, critical, 0L, null));
});
}
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));
}
}
}