blob: f989173cc86f320349a54e80f5df4f3fd1b48ce8 [file] [log] [blame]
package org.apache.cassandra.stress.util;
import java.util.Arrays;
import java.util.Map;
import java.util.TreeMap;
public class TimingIntervals
{
final Map<String, TimingInterval> intervals;
TimingIntervals(Iterable<String> opTypes)
{
long now = System.nanoTime();
intervals = new TreeMap<>();
for (String opType : opTypes)
intervals.put(opType, new TimingInterval(now));
}
TimingIntervals(Map<String, TimingInterval> intervals)
{
this.intervals = intervals;
}
public TimingIntervals merge(TimingIntervals with, int maxSamples, long start)
{
assert intervals.size() == with.intervals.size();
TreeMap<String, TimingInterval> ret = new TreeMap<>();
for (String opType : intervals.keySet())
{
assert with.intervals.containsKey(opType);
ret.put(opType, TimingInterval.merge(Arrays.asList(intervals.get(opType), with.intervals.get(opType)), maxSamples, start));
}
return new TimingIntervals(ret);
}
public TimingInterval get(String opType)
{
return intervals.get(opType);
}
public TimingInterval combine(int maxSamples)
{
long start = Long.MAX_VALUE;
for (TimingInterval ti : intervals.values())
start = Math.min(start, ti.startNanos());
return TimingInterval.merge(intervals.values(), maxSamples, start);
}
public String str(TimingInterval.TimingParameter value)
{
return str(value, Float.NaN);
}
public String str(TimingInterval.TimingParameter value, float rank)
{
StringBuilder sb = new StringBuilder("[");
for (Map.Entry<String, TimingInterval> entry : intervals.entrySet())
{
sb.append(entry.getKey());
sb.append(":");
sb.append(entry.getValue().getStringValue(value, rank));
sb.append(", ");
}
sb.setLength(sb.length()-2);
sb.append("]");
return sb.toString();
}
public String opRates()
{
return str(TimingInterval.TimingParameter.OPRATE);
}
public String partitionRates()
{
return str(TimingInterval.TimingParameter.PARTITIONRATE);
}
public String rowRates()
{
return str(TimingInterval.TimingParameter.ROWRATE);
}
public String meanLatencies()
{
return str(TimingInterval.TimingParameter.MEANLATENCY);
}
public String maxLatencies()
{
return str(TimingInterval.TimingParameter.MAXLATENCY);
}
public String medianLatencies()
{
return str(TimingInterval.TimingParameter.MEDIANLATENCY);
}
public String rankLatencies(float rank)
{
return str(TimingInterval.TimingParameter.RANKLATENCY, rank);
}
public String errorCounts()
{
return str(TimingInterval.TimingParameter.ERRORCOUNT);
}
public String partitionCounts()
{
return str(TimingInterval.TimingParameter.PARTITIONCOUNT);
}
public long opRate()
{
long v = 0;
for (TimingInterval interval : intervals.values())
v += interval.opRate();
return v;
}
public long startNanos()
{
long start = Long.MAX_VALUE;
for (TimingInterval interval : intervals.values())
start = Math.min(start, interval.startNanos());
return start;
}
public long endNanos()
{
long end = Long.MIN_VALUE;
for (TimingInterval interval : intervals.values())
end = Math.max(end, interval.startNanos());
return end;
}
public Map<String, TimingInterval> intervals()
{
return intervals;
}
}