package org.radargun.stats.representation; import org.radargun.config.DefinitionElement; import org.radargun.config.Property; import org.radargun.stats.Statistics; import org.radargun.utils.Utils; /** * Representation used for retrieving value with certain percentile of occurence, * e.g. for data set 1, 1, 1, 2, 3 and percentile = 60 the responseTimeMax should be 1 * (as 60 % of the data set are <= 1) and for percentile 70 it is 2. * It is expected that when calling {@link org.radargun.stats.OperationStats#getRepresentation(Class, Statistics, Object...)} * with Percentile as the class argument, first argument is double value between 0 and 1 (inclusive). * * @author Radim Vansa <rvansa@redhat.com> */ public class Percentile { public final double responseTimeMax; public Percentile(double responseTimeMax) { this.responseTimeMax = responseTimeMax; } public static double getPercentile(Object[] args) { double percentile = Utils.getArg(args, 0, Double.class); if (percentile < 0 || percentile > 100) throw new IllegalArgumentException(String.valueOf(percentile)); return percentile; } @DefinitionElement(name = "percentile", doc = "Retrieve max response time at given percentile.") public static class PercentileAt extends RepresentationType { @Property(doc = "Percentile value, between 0 and 100.", optional = false) protected double value; @Override public double getValue(Statistics statistics, String operation, long duration) { Percentile percentile = statistics.getRepresentation(operation, Percentile.class, value); if (percentile == null) throw new IllegalArgumentException("Cannot retrieve percentile from " + operation); return percentile.responseTimeMax; } } }