package com.couchbase.loadgen.measurements;
import java.io.IOException;
import java.util.HashMap;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonToken;
import com.couchbase.loadgen.Config;
import com.couchbase.loadgen.JsonStringBuilder;
import com.couchbase.loadgen.measurements.exporter.MeasurementsExporter;
public class Stats {
private HashMap<String, OneMeasurement> measurements;
private long operations;
public Stats() {
this.measurements = new HashMap<String, OneMeasurement>();
this.operations = 0;
}
public synchronized void measure(String operation, int latency) {
if (!measurements.containsKey(operation)) {
synchronized (this) {
if (!measurements.containsKey(operation)) {
measurements.put(operation, constructOneMeasurement(operation));
}
}
}
try {
operations++;
measurements.get(operation).measure(latency);
} catch (java.lang.ArrayIndexOutOfBoundsException e) {
System.out.println("ERROR: java.lang.ArrayIndexOutOfBoundsException - ignoring and continuing");
e.printStackTrace();
e.printStackTrace(System.out);
}
}
OneMeasurement constructOneMeasurement(String name) {
return new OneMeasurementHistogram(name);
}
public void reportReturnCode(String operation, int code) {
if (!measurements.containsKey(operation)) {
synchronized (this) {
if (!measurements.containsKey(operation)) {
measurements.put(operation, constructOneMeasurement(operation));
}
}
}
measurements.get(operation).reportReturnCode(code);
}
public void exportMeasurements(MeasurementsExporter exporter) throws IOException {
for (OneMeasurement measurement : measurements.values()) {
measurement.exportMeasurements(exporter);
}
}
public long getOperations() {
return operations;
}
public synchronized String getSummary() {
int interval = ((Integer)Config.getConfig().get(Config.PRINT_STATS_INTERVAL)).intValue();
String ret = " " + operations + " operations; " + (operations / interval) + " ops/sec";
for (OneMeasurement m : measurements.values()) {
ret += m.getSummary() + " ";
}
return ret;
}
public String encodeJson() {
JsonStringBuilder builder = new JsonStringBuilder();
try {
builder.startJsonString();
builder.addElement("ops", new Integer((int) operations));
for (OneMeasurement m : measurements.values()) {
builder.openSubelement(m.getName());
m.encodeJson(builder);
builder.closeSubelement();
}
builder.endJson();
} catch (JsonGenerationException e) {
return null;
} catch (IOException e) {
return null;
}
//System.out.println("Encode: " + builder.toString());
return builder.toString();
}
public void decodeJson(String json) {
//System.out.println("Decode: " + json);
JsonFactory factory = new JsonFactory();
try {
JsonParser p = factory.createJsonParser(json.getBytes());
p.nextToken();
p.nextToken();
if (p.getCurrentName().equals("ops")) {
p.nextToken();
operations += p.getIntValue();
}
while(p.nextToken() != JsonToken.END_OBJECT) {
if (!measurements.containsKey(p.getCurrentName()))
measurements.put(p.getCurrentName(), constructOneMeasurement(p.getCurrentName()));
measurements.get(p.getCurrentName()).decodeJson(p);
}
} catch (JsonParseException e) {
} catch (IOException e) {
}
}
}