package water.api;
import dontweave.gson.*;
import water.*;
import water.util.LinuxProcFileReader;
import water.util.Log;
/**
* Redirect to water meter page.
*/
public class WaterMeterPerfbar extends HTMLOnlyRequest {
protected String build(Response response) {
return "" +
"<div class='container' id='perfbarContainer'>" +
"<script>" +
"var PB_LINEOFTEXT_BACKGROUND_COLOR = \"#fff\";" +
"</script>" +
"<script src=\"watermeter/perfbar.js\"></script>" +
"</div>";
}
public static class WaterMeterCpuTicks extends JSONOnlyRequest {
Int node_idx = new Int("node_idx", -1);
@Override
public RequestServer.API_VERSION[] supportedVersions() { return SUPPORTS_ONLY_V2; }
/**
* Iterates over fields and their annotations, and creates argument handlers.
*/
@Override protected void registered(RequestServer.API_VERSION version) {
super.registered(version);
}
private static class GetTicksTask extends DTask<GetTicksTask> {
private long[][] _cpuTicks;
public GetTicksTask() {
_cpuTicks = null;
}
@Override public void compute2() {
LinuxProcFileReader lpfr = new LinuxProcFileReader();
lpfr.read();
if (lpfr.valid()) {
_cpuTicks = lpfr.getCpuTicks();
}
else {
// In the case where there isn't any tick information, the client receives a json
// response object containing an array of length 0.
//
// e.g.
// { cpuTicks: [] }
_cpuTicks = new long[0][0];
}
tryComplete();
}
@Override public byte priority() {
return H2O.MIN_HI_PRIORITY;
}
}
@Override protected Response serve() {
if ((node_idx.value() < 0) || (node_idx.value() >= H2O.CLOUD.size())) {
throw new IllegalArgumentException("Illegal node_idx for this H2O cluster (must be from 0 to " + H2O.CLOUD.size() + ")");
}
H2ONode node = H2O.CLOUD._memary[node_idx.value()];
GetTicksTask ppt = new GetTicksTask();
Log.trace("GetTicksTask starting to node " + node_idx.value() + "...");
// Synchronous RPC call to get ticks from remote (possibly this) node.
new RPC<GetTicksTask>(node, ppt).call().get();
Log.trace("GetTicksTask completed to node " + node_idx.value());
long[][] cpuTicks = ppt._cpuTicks;
// Stuff tick information into json response.
JsonArray j = new JsonArray();
for (long[] arr : cpuTicks) {
JsonArray j2 = new JsonArray();
j2.add(new JsonPrimitive(arr[0]));
j2.add(new JsonPrimitive(arr[1]));
j2.add(new JsonPrimitive(arr[2]));
j2.add(new JsonPrimitive(arr[3]));
j.add(j2);
}
JsonObject o = new JsonObject();
o.add("cpuTicks", j);
return Response.done(o);
}
}
}