add pre-computed error rates for error_rate_1m, error_rate_5m, error_rate_15m, error_rate_total and errors_total

This commit is contained in:
Jonathan Shook 2024-01-02 17:03:41 -06:00
parent e28fd68635
commit e09e0f5e99
2 changed files with 112 additions and 20 deletions

View File

@ -21,6 +21,7 @@ import com.codahale.metrics.Histogram;
import com.codahale.metrics.Timer;
import io.nosqlbench.engine.api.activityapi.planning.OpSequence;
import io.nosqlbench.adapters.api.activityimpl.OpDispenser;
import io.nosqlbench.nb.api.engine.metrics.instruments.NBMetricGauge;
import java.util.concurrent.Future;
@ -33,6 +34,16 @@ import java.util.concurrent.Future;
*/
public interface ActivityInstrumentation {
NBMetricGauge getOrCreateErrorsTotal();
NBMetricGauge getOrCreateErrorRate1m();
NBMetricGauge getOrCreateErrorRate5m();
NBMetricGauge getOrCreateErrorRate15m();
NBMetricGauge getOrCreateErrorRateTotal();
/**
* The input timer measures how long it takes to get the cycle value to be used for
* an operation.

View File

@ -21,10 +21,7 @@ import com.codahale.metrics.Histogram;
import com.codahale.metrics.Timer;
import io.nosqlbench.nb.api.engine.activityimpl.ActivityDef;
import io.nosqlbench.nb.api.engine.activityimpl.ParameterMap;
import io.nosqlbench.nb.api.engine.metrics.instruments.MetricCategory;
import io.nosqlbench.nb.api.engine.metrics.instruments.NBMetricCounter;
import io.nosqlbench.nb.api.engine.metrics.instruments.NBMetricHistogram;
import io.nosqlbench.nb.api.engine.metrics.instruments.NBMetricTimer;
import io.nosqlbench.nb.api.engine.metrics.instruments.*;
public class ComponentActivityInstrumentation implements ActivityInstrumentation {
@ -49,6 +46,12 @@ public class ComponentActivityInstrumentation implements ActivityInstrumentation
private NBMetricHistogram triesHistogram;
private NBMetricTimer verifierTimer;
private NBMetricGauge errorRate1m;
private NBMetricGauge errorRate5m;
private NBMetricGauge errorRate15m;
private NBMetricGauge errorRateTotal;
private NBMetricGauge errorsTotal;
public ComponentActivityInstrumentation(final Activity activity) {
this.activity = activity;
def = activity.getActivityDef();
@ -58,13 +61,13 @@ public class ComponentActivityInstrumentation implements ActivityInstrumentation
}
private void initMetrics() {
readInputTimer=activity.create().timer(
readInputTimer = activity.create().timer(
"read_input",
this.hdrdigits,
MetricCategory.Internals,
"measures overhead of acquiring a cycle range for an activity thread"
);
stridesServiceTimer=activity.create().timer(
stridesServiceTimer = activity.create().timer(
"strides",
this.hdrdigits,
MetricCategory.Core,
@ -80,7 +83,7 @@ public class ComponentActivityInstrumentation implements ActivityInstrumentation
);
}
this.cyclesServiceTimer = activity.create().timer(
"cycles"+ComponentActivityInstrumentation.SERVICE_TIME,
"cycles" + ComponentActivityInstrumentation.SERVICE_TIME,
hdrdigits,
MetricCategory.Core,
"service timer for a cycle, including all of bind, execute, result and result_success;" +
@ -95,7 +98,7 @@ public class ComponentActivityInstrumentation implements ActivityInstrumentation
" response timers include scheduling delays which occur when an activity falls behind its target rate"
);
}
this.pendingOpsCounter=activity.create().counter(
this.pendingOpsCounter = activity.create().counter(
"pending_ops",
MetricCategory.Core,
"Indicate the number of operations which have been started, but which have not been completed." +
@ -121,7 +124,7 @@ public class ComponentActivityInstrumentation implements ActivityInstrumentation
MetricCategory.Core,
"Time how long it takes to submit a request, receive a result, including binding, reading results, " +
"and optionally verifying them, including all operations whether successful or not, for each attempted request."
);
);
this.resultSuccessTimer = activity.create().timer(
"result_success",
hdrdigits,
@ -142,63 +145,141 @@ public class ComponentActivityInstrumentation implements ActivityInstrumentation
MetricCategory.Verification,
"Time the execution of verifier code, if any"
);
this.errorRate1m = activity.create().gauge("error_rate_1m",
() -> {
double result_1m_rate = this.resultTimer.getOneMinuteRate();
double result_success_1m_rate = this.resultSuccessTimer.getOneMinuteRate();
if (result_1m_rate==0.0d || Double.isNaN(result_1m_rate)) {
return Double.NaN;
}
return (result_1m_rate-result_success_1m_rate)/result_1m_rate;
},
MetricCategory.Core,
"The relative one minute error rate estimated from the one minute successful and non-successful op rates"
);
this.errorRate5m = activity.create().gauge("error_rate_5m",
() -> {
double result_5m_rate = this.resultTimer.getFiveMinuteRate();
double result_success_5m_rate = this.resultSuccessTimer.getFiveMinuteRate();
if (result_5m_rate == 0.0d || Double.isNaN(result_5m_rate)) {
return Double.NaN;
}
return (result_5m_rate - result_success_5m_rate) / result_5m_rate;
},
MetricCategory.Core,
"The relative five minute error rate estimated from the five minute successful and non-successful op rates"
);
this.errorRate15m = activity.create().gauge("error_rate_15m",
() -> {
double result_15m_rate = this.resultTimer.getFifteenMinuteRate();
double result_success_15m_rate = this.resultSuccessTimer.getFifteenMinuteRate();
if (result_15m_rate == 0.0d || Double.isNaN(result_15m_rate)) {
return Double.NaN;
}
return (result_15m_rate - result_success_15m_rate) / result_15m_rate;
},
MetricCategory.Core,
"The relative fifteen minute error rate estimated from the fifteen minute successful and non-successful op rates"
);
this.errorRateTotal = activity.create().gauge("error_rate_total",
() -> {
double result_total = this.resultTimer.getCount();
double result_success_total = this.resultSuccessTimer.getCount();
if (result_total == 0.0d) {
return Double.NaN;
}
return (result_total - result_success_total) / result_total;
},
MetricCategory.Core,
"The cumulative error ratio calculated from the cumulative successful and non-successful op totals"
);
this.errorsTotal = activity.create().gauge("errors_total",
() -> {
double result_total = this.resultTimer.getCount();
double result_success_total = this.resultSuccessTimer.getCount();
return (result_total - result_success_total);
},
MetricCategory.Core,
"The total number of errors calculated from the cumulative successful and non-successful op totals"
);
}
@Override
public NBMetricGauge getOrCreateErrorsTotal() {
return this.errorsTotal;
}
@Override
public NBMetricGauge getOrCreateErrorRate1m() {
return this.errorRate1m;
}
@Override
public NBMetricGauge getOrCreateErrorRate5m() {
return this.errorRate5m;
}
@Override
public NBMetricGauge getOrCreateErrorRate15m() {
return this.errorRate15m;
}
@Override
public NBMetricGauge getOrCreateErrorRateTotal() {
return this.errorRateTotal;
}
@Override
public Timer getOrCreateInputTimer() {
public Timer getOrCreateInputTimer() {
return readInputTimer;
}
@Override
public Timer getOrCreateStridesServiceTimer() {
public Timer getOrCreateStridesServiceTimer() {
return stridesServiceTimer;
}
@Override
public Timer getStridesResponseTimerOrNull() {
public Timer getStridesResponseTimerOrNull() {
return stridesResponseTimer;
}
@Override
public Timer getOrCreateCyclesServiceTimer() {
public Timer getOrCreateCyclesServiceTimer() {
return cyclesServiceTimer;
}
@Override
public Timer getCyclesResponseTimerOrNull() {
public Timer getCyclesResponseTimerOrNull() {
return cyclesResponseTimer;
}
@Override
public Counter getOrCreatePendingOpCounter() {
public Counter getOrCreatePendingOpCounter() {
return pendingOpsCounter;
}
@Override
public Timer getOrCreateBindTimer() {
public Timer getOrCreateBindTimer() {
return bindTimer;
}
@Override
public Timer getOrCreateExecuteTimer() {
public Timer getOrCreateExecuteTimer() {
return executeTimer;
}
@Override
public Timer getOrCreateResultTimer() {
public Timer getOrCreateResultTimer() {
return resultTimer;
}
@Override
public Timer getOrCreateResultSuccessTimer() {
public Timer getOrCreateResultSuccessTimer() {
return resultSuccessTimer;
}
@Override
public Histogram getOrCreateTriesHistogram() {
public Histogram getOrCreateTriesHistogram() {
return triesHistogram;
}