package net.johnewart.gearman.server.util;
import net.johnewart.gearman.engine.queue.JobQueue;
import net.johnewart.shuzai.DifferentialTimeSeries;
import net.johnewart.shuzai.Frequency;
import net.johnewart.shuzai.SampleMethod;
import net.johnewart.shuzai.TimeSeries;
import org.joda.time.DateTime;
import java.math.BigDecimal;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class JobQueueMetrics {
public final TimeSeries queued, failed, completed, exceptions,
highJobs, midJobs, lowJobs, futureJobs;
public JobQueueMetrics() {
this.highJobs = new TimeSeries();
this.midJobs = new TimeSeries();
this.lowJobs = new TimeSeries();
this.futureJobs = new TimeSeries();
this.queued = new DifferentialTimeSeries();
this.failed = new DifferentialTimeSeries();
this.completed = new DifferentialTimeSeries();
this.exceptions = new DifferentialTimeSeries();
}
public JobQueueMetrics(TimeSeries queued, TimeSeries failed,
TimeSeries completed, TimeSeries exceptions,
TimeSeries highJobs, TimeSeries midJobs,
TimeSeries lowJobs, TimeSeries futureJobs) {
this.queued = queued;
this.failed = failed;
this.completed = completed;
this.exceptions = exceptions;
this.highJobs = highJobs;
this.midJobs = midJobs;
this.lowJobs = lowJobs;
this.futureJobs = futureJobs;
}
public JobQueueMetrics compact() {
return new JobQueueMetrics(
compactTimeSeries(queued, SampleMethod.MEAN),
compactTimeSeries(failed, SampleMethod.SUM),
compactTimeSeries(completed, SampleMethod.SUM),
compactTimeSeries(exceptions, SampleMethod.SUM),
compactTimeSeries(highJobs, SampleMethod.MEAN),
compactTimeSeries(midJobs, SampleMethod.MEAN),
compactTimeSeries(lowJobs, SampleMethod.MEAN),
compactTimeSeries(futureJobs, SampleMethod.MEAN)
);
}
private TimeSeries compactTimeSeries(TimeSeries original, SampleMethod method) {
TimeSeries ts = original.downSample(Frequency.of(5, TimeUnit.MINUTES),
method);
DateTime start = ts.index().last();
DateTime end = original.index().last();
if (start != null && end != null) {
for (Map.Entry<DateTime, BigDecimal> entry : ts.dataWindow(start, end).entrySet()) {
ts.add(entry.getKey(), entry.getValue());
}
}
return ts;
}
}