package com.loadimpact.resource.testresult;
import javax.json.JsonNumber;
import javax.json.JsonObject;
/**
* Base class for all Standard metric results.
*
* @author jens
*/
public class StandardMetricResult extends Result {
private static final String VALUE = "value";
private static final String AVG = "avg";
private static final String PERCENT = "percent";
public enum Metrics {
ACCUMULATED_LOAD_TIME(VALUE),
BANDWIDTH(AVG, false),
CLIENTS_ACTIVE(VALUE, true),
CONNECTIONS_ACTIVE(VALUE, true),
CONTENT_TYPE(ContentTypeStandardMetricResult.class),
CONTENT_TYPE_LOAD_TIME(AVG, false, ContentTypeLoadTimeStandardMetricResult.class),
FAILURE_RATE(AVG),
LIVE_FEEDBACK(LiveFeedbackStandardMetricResult.class),
LOADGEN_CPU_UTILIZATION(VALUE),
LOADGEN_MEMORY_UTILIZATION(VALUE),
LOG(LogStandardMetricResult.class),
PROGRESS_PERCENT_TOTAL(VALUE),
REPS_FAILED_PERCENT(PERCENT),
REPS_SUCCEEDED_PERCENT(PERCENT),
REQUESTS_PER_SECOND(AVG),
TOTAL_RX_BYTES(VALUE, true),
TOTAL_REQUESTS(VALUE, true),
USER_LOAD_TIME(VALUE);
/**
* REST query parameter name.
*/
public final String id;
/**
* Name of value-field(in json response), such as 'value' or 'avg'
*/
public final String valueName;
/**
* If true for int, else float.
*/
public final Boolean integral;
public final Class<? extends StandardMetricResult> resultType;
Metrics(Class<? extends StandardMetricResult> resultType) {
this(null, null, resultType);
}
Metrics(String valueName) {
this(valueName, false, StandardMetricResult.class);
}
Metrics(String valueName, Boolean integral) {
this(valueName, integral, StandardMetricResult.class);
}
Metrics(String valueName, Boolean integral, Class<? extends StandardMetricResult> resultType) {
this.valueName = valueName;
this.integral = integral;
this.resultType = resultType;
this.id = PREFIX + name().toLowerCase();
}
@Override
public String toString() {
return name();
}
public String toStringDebug() {
return String.format("%s:%s:%s", name(), valueName != null ? valueName : "*", integral != null ? integral : "*");
}
}
public final Metrics metric;
public final Number value;
public final Number count;
public StandardMetricResult(Metrics m, JsonObject json) {
super(json);
metric = m;
JsonNumber jsonNumber = json.getJsonNumber(this.metric.valueName);
if (jsonNumber != null) {
value = metric.integral ? jsonNumber.longValue() : jsonNumber.doubleValue();
} else {
value = null;
}
if (metric.valueName != null && metric.valueName.equals(PERCENT)) {
count = json.getInt("value", 0);
} else if (metric.equals(Metrics.CONTENT_TYPE_LOAD_TIME)) {
count = json.getInt("count", 0);
} else {
count = null;
}
}
@Override
protected StringBuilder toString(StringBuilder buf) {
return super.toString(buf).append(", ")
.append("metric=").append(metric).append(", ")
.append("value=").append(value).append(", ")
.append("count=").append(count)
;
}
}