package com.netflix.priam.agent.tasks;
import com.google.common.base.Joiner;
import com.netflix.priam.agent.AgentConfiguration;
import com.netflix.priam.agent.NodeStatus;
import com.netflix.priam.agent.process.AgentProcessManager;
import com.netflix.priam.agent.process.ProcessRecord;
import com.netflix.priam.agent.storage.Storage;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.json.simple.JSONArray;
import javax.inject.Provider;
/**
* Recurring task that writes out state info
*/
public class AgentTask
{
private final AgentConfiguration configuration;
private final AgentProcessManager processManager;
private final Provider<NodeStatus> nodeToolProvider;
private final Storage storage;
private static final String ROW_KEY = "priam_agent_instances";
private static final int VERSION = 0x00010001;
public AgentTask(AgentConfiguration configuration, AgentProcessManager processManager, Provider<NodeStatus> nodeToolProvider, Storage storage)
{
this.configuration = configuration;
this.processManager = processManager;
this.nodeToolProvider = nodeToolProvider;
this.storage = storage;
}
public void execute() throws Exception
{
JSONObject json = new JSONObject();
NodeStatus nodeTool = nodeToolProvider.get();
json.put("version", VERSION);
json.put("current_time_ms", System.currentTimeMillis());
json.put("info", nodeTool.info());
json.put("is_joined", nodeTool.isJoined());
json.put("endpoint", nodeTool.getEndpoint());
json.put("exception_count", nodeTool.getExceptionCount());
json.put("live_nodes", nodeTool.getLiveNodes());
json.put("moving_nodes", nodeTool.getMovingNodes());
json.put("joining_nodes", nodeTool.getJoiningNodes());
json.put("unreachable_nodes", nodeTool.getUnreachableNodes());
json.put("operation_mode", nodeTool.getOperationMode());
json.put("gossip_info", nodeTool.getGossipInfo());
json.put("compaction_throughput", nodeTool.getCompactionThroughput());
json.put("active_processes", getActiveProcesses());
json.put("completed_processes", getCompletedProcesses());
storage.setValue(configuration, ROW_KEY, configuration.getThisHostName(), json.toString());
}
private JSONArray getCompletedProcesses() throws JSONException
{
JSONArray tab = new JSONArray();
for ( ProcessRecord processRecord : processManager.getCompletedProcesses() )
{
JSONObject json = new JSONObject();
addProcessCommon(processRecord, json);
json.put("end_time_ms", processRecord.getEndTimeMs());
}
return tab;
}
private JSONArray getActiveProcesses() throws JSONException
{
JSONArray tab = new JSONArray();
for ( ProcessRecord processRecord : processManager.getActiveProcesses() )
{
JSONObject json = new JSONObject();
addProcessCommon(processRecord, json);
json.put("stop_attempt_ms", processRecord.getStopAttemptMs());
}
return tab;
}
private void addProcessCommon(ProcessRecord processRecord, JSONObject json) throws JSONException
{
json.put("name", processRecord.getName());
json.put("id", processRecord.getId());
json.put("start_time_ms", processRecord.getStartTimeMs());
json.put("elapsed_time_ms", System.currentTimeMillis() - processRecord.getStartTimeMs());
json.put("arguments", Joiner.on(", ").join(processRecord.getArguments()));
}
}