package uk.co.acuminous.julez.event.handler;
import java.util.concurrent.atomic.AtomicInteger;
import uk.co.acuminous.julez.event.Event;
import uk.co.acuminous.julez.runner.ScenarioRunnerEvent;
import uk.co.acuminous.julez.scenario.ScenarioEvent;
public class ThroughputMonitor implements EventHandler {
private long started;
private long finished;
private AtomicInteger completed = new AtomicInteger();
@Override
public void onEvent(Event event) {
if (ScenarioRunnerEvent.BEGIN.equals(event.getType())) {
started = event.getTimestamp();
} else if (ScenarioRunnerEvent.END.equals(event.getType())) {
finished = event.getTimestamp();
} else if (ScenarioEvent.END.equals(event.getType()) && isInTimeframe(event)) {
completed.incrementAndGet();
}
}
private boolean isInTimeframe(Event event) {
return (started != 0 && event.getTimestamp() >= started) && (finished == 0 || event.getTimestamp() <= finished);
}
public int getThroughput() {
long effectiveEnd = finished != 0 ? finished : System.currentTimeMillis();
double duration = Math.max(effectiveEnd - started, 1);
return (int) Math.round(completed.get() * 1000 / duration);
}
}