http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/CounterMapWithTopKey.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/CounterMapWithTopKey.java b/commons/src/main/java/org/apache/aurora/common/stats/CounterMapWithTopKey.java deleted file mode 100644 index 1e90e85..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/CounterMapWithTopKey.java +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -import java.util.Map; - -/** - * Same as CounterMap<K>, but also keeps track of the item with the highest count. - */ -public class CounterMapWithTopKey<K> extends CounterMap<K> { - - private K mostCommonKey = null; - - /** - * Updates the most common key, if needed. - * - * @param key The key to check. - * @param count The count for the key. - * @return The count. - */ - private int updateMostCommon(K key, int count) { - if (count > get(mostCommonKey)) { - mostCommonKey = key; - } - return count; - } - - /** - * Increments the counter value associated with {@code key}, and returns the new value. - * - * @param key The key to increment - * @return The incremented value. - */ - @Override - public int incrementAndGet(K key) { - return updateMostCommon(key, super.incrementAndGet(key)); - } - - /** - * Assigns a value to a key. - * - * @param key The key to assign a value to. - * @param newValue The value to assign. - */ - @Override - public void set(K key, int newValue) { - super.set(key, updateMostCommon(key, newValue)); - } - - /** - * Resets the value for {@code key}. This will simply set the stored value to 0. - * The most common key is updated by scanning the entire map. - * - * @param key The key to reset. - */ - @Override - public void reset(K key) { - super.reset(key); - for (Map.Entry<K, Integer> entry : this) { - updateMostCommon(entry.getKey(), entry.getValue()); - } - } - - /** - * - * @return The key with the highest count in the map. If multiple keys have this count, return - * an arbitrary one. - */ - public K getMostCommonKey() { - return mostCommonKey; - } - - @Override - public String toString() { - return new StringBuilder(super.toString()).append(String.format("Most common key: %s\n", - mostCommonKey.toString())).toString(); - } -}
http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/Elapsed.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/Elapsed.java b/commons/src/main/java/org/apache/aurora/common/stats/Elapsed.java deleted file mode 100644 index 859ca7e..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/Elapsed.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -import java.util.concurrent.atomic.AtomicLong; - -import com.google.common.base.Preconditions; -import com.google.common.base.Ticker; - -import org.apache.aurora.common.base.MorePreconditions; -import org.apache.aurora.common.quantity.Amount; -import org.apache.aurora.common.quantity.Time; - -/** - * A stat that exports the amount of time since it was last reset. - * - * @author William Farner - */ -public class Elapsed { - - private final Ticker ticker; - private final AtomicLong lastEventNs = new AtomicLong(); - - /** - * Calls {@link #Elapsed(String, Time)} using a default granularity of nanoseconds. - * - * @param name Name of the stat to export. - */ - public Elapsed(String name) { - this(name, Time.NANOSECONDS); - } - - /** - * Equivalent to calling {@link #Elapsed(String, Time, Ticker)} passing {@code name}, - * {@code granularity} and {@link com.google.common.base.Ticker#systemTicker()}. - * <br/> - * @param name Name of the stat to export. - * @param granularity Time unit granularity to export. - */ - public Elapsed(String name, Time granularity) { - this(name, granularity, Ticker.systemTicker()); - } - - /** - * Creates and exports a new stat that maintains the difference between the tick time - * and the time since it was last reset. Upon export, the counter will act as though it were just - * reset. - * <br/> - * @param name Name of stat to export - * @param granularity Time unit granularity to export. - * @param ticker Ticker implementation - */ - public Elapsed(String name, final Time granularity, final Ticker ticker) { - MorePreconditions.checkNotBlank(name); - Preconditions.checkNotNull(granularity); - this.ticker = Preconditions.checkNotNull(ticker); - - reset(); - - Stats.export(new StatImpl<Long>(name) { - @Override public Long read() { - return Amount.of(ticker.read() - lastEventNs.get(), Time.NANOSECONDS).as(granularity); - } - }); - } - - public void reset() { - lastEventNs.set(ticker.read()); - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/Entropy.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/Entropy.java b/commons/src/main/java/org/apache/aurora/common/stats/Entropy.java deleted file mode 100644 index 4e011c1..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/Entropy.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -import com.google.common.base.Preconditions; - -/** - * Calculate the entropy of a discrete distribution of <T>. - * - * @author Gilad Mishne - */ -public class Entropy<T> { - private final CounterMap<T> counts = new CounterMap<T>(); - private int total = 0; - - private static double Log2(double n) { - return Math.log(n) / Math.log(2); - } - - public Entropy(Iterable<T> elements) { - Preconditions.checkNotNull(elements); - for (T element : elements) { - counts.incrementAndGet(element); - total++; - } - } - - public double entropy() { - double entropy = 0; - for (int count: counts.values()) { - double prob = (double) count / total; - entropy -= prob * Log2(prob); - } - return entropy; - } - - public double perplexity() { - return Math.pow(2, entropy()); - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/Histogram.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/Histogram.java b/commons/src/main/java/org/apache/aurora/common/stats/Histogram.java deleted file mode 100644 index 53c976d..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/Histogram.java +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -/** - * An interface for Histogram - */ -public interface Histogram { - - /** - * Add an entry into the histogram. - * @param x the value to insert. - */ - void add(long x); - - /** - * Clear the histogram. - */ - void clear(); - - /** - * Return the current quantile of the histogram. - * @param quantile value to compute. - */ - long getQuantile(double quantile); - - /** - * Return the quantiles of the histogram. - * @param quantiles array of values to compute. - */ - long[] getQuantiles(double[] quantiles); -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/Histograms.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/Histograms.java b/commons/src/main/java/org/apache/aurora/common/stats/Histograms.java deleted file mode 100644 index 6818b05..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/Histograms.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -/** - * Helper class containing only static methods - */ -public final class Histograms { - - private Histograms() { - /* Disable */ - } - - /** - * Helper method that return an array of quantiles - * @param h the histogram to query - * @param quantiles an array of double representing the quantiles - * @return the array of computed quantiles - */ - public static long[] extractQuantiles(Histogram h, double[] quantiles) { - long[] results = new long[quantiles.length]; - for (int i = 0; i < results.length; i++) { - double q = quantiles[i]; - results[i] = h.getQuantile(q); - } - return results; - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/MovingAverage.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/MovingAverage.java b/commons/src/main/java/org/apache/aurora/common/stats/MovingAverage.java deleted file mode 100644 index 339737b..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/MovingAverage.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -import java.util.concurrent.LinkedBlockingDeque; - -import com.google.common.base.Preconditions; - -/** - * Function to compute the moving average of a time series. - * - * @author William Farner - */ -public class MovingAverage<T extends Number> extends SampledStat<Double> { - - private static final int DEFAULT_WINDOW = 10; - private final Stat<T> input; - - private final LinkedBlockingDeque<T> samples; - private double sampleSum = 0; - - private MovingAverage(String name, Stat<T> input, int windowSize) { - super(name, 0d); - Preconditions.checkArgument(windowSize > 1); - - this.input = Preconditions.checkNotNull(input); - this.samples = new LinkedBlockingDeque<T>(windowSize); - Stats.export(input); - } - - public static <T extends Number> MovingAverage<T> of(Stat<T> input) { - return MovingAverage.of(input, DEFAULT_WINDOW); - } - - public static <T extends Number> MovingAverage<T> of(Stat<T> input, int windowSize) { - return MovingAverage.of(String.format("%s_avg", input.getName()), input, windowSize); - } - - public static <T extends Number> MovingAverage<T> of(String name, Stat<T> input, - int windowSize) { - return new MovingAverage<T>(name, input, windowSize); - } - - @Override - public Double doSample() { - T sample = input.read(); - - if (samples.remainingCapacity() == 0) { - sampleSum -= samples.removeLast().doubleValue(); - } - - samples.addFirst(sample); - sampleSum += sample.doubleValue(); - - return sampleSum / samples.size(); - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/MovingWindowDelta.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/MovingWindowDelta.java b/commons/src/main/java/org/apache/aurora/common/stats/MovingWindowDelta.java deleted file mode 100644 index a20eed0..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/MovingWindowDelta.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -import com.google.common.base.Preconditions; -import com.google.common.base.Supplier; - -import java.util.concurrent.LinkedBlockingDeque; - -import org.apache.aurora.common.base.MorePreconditions; - - -/** - * Delta over the most recent k sample periods. - * - * If you use this class with a counter, you can get the cumulation of counts in a sliding window. - * - * One sample period is the time in between doSample() calls. - * - * @author Feng Zhuge - */ -public class MovingWindowDelta<T extends Number> extends SampledStat<Long> { - private static final int DEFAULT_WINDOW_SIZE = 60; - private final LinkedBlockingDeque<Long> deltaSeries; - private final Supplier<T> inputAccessor; - long sumDelta = 0l; - long lastInput = 0l; - - private MovingWindowDelta(String name, Supplier<T> inputAccessor, int windowSize) { - super(name, 0l); - - Preconditions.checkArgument(windowSize >= 1); - Preconditions.checkNotNull(inputAccessor); - MorePreconditions.checkNotBlank(name); - - deltaSeries = new LinkedBlockingDeque<Long>(windowSize); - this.inputAccessor = inputAccessor; - - Stats.export(this); - } - - /** - * Create a new MovingWindowDelta instance. - * - * @param name The name of the value to be tracked. - * @param inputAccessor The accessor of the value. - * @param windowSize How many sample periods shall we use to calculate delta. - * @param <T> The type of the value. - * @return The created MovingWindowSum instance. - */ - public static <T extends Number> MovingWindowDelta<T> of( - String name, Supplier<T> inputAccessor, int windowSize) { - return new MovingWindowDelta<T>(name, inputAccessor, windowSize); - } - - /** - * Create a new MovingWindowDelta instance using the default window size (currently 60). - * - * @param name The name of the value to be tracked. - * @param inputAccessor The accessor of the value. - * @param <T> The type of the value. - * @return The created MovingWindowSum instance. - */ - public static <T extends Number> MovingWindowDelta<T> of(String name, Supplier<T> inputAccessor) { - return of(name, inputAccessor, DEFAULT_WINDOW_SIZE); - } - - @Override - public Long doSample() { - long lastDelta = 0l; - if (deltaSeries.remainingCapacity() == 0) { - lastDelta = deltaSeries.removeFirst(); - } - - long newInput = inputAccessor.get().longValue(); - long newDelta = newInput - lastInput; - lastInput = newInput; - - deltaSeries.addLast(newDelta); - - sumDelta += newDelta - lastDelta; - - return sumDelta; - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/NumericStatExporter.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/NumericStatExporter.java b/commons/src/main/java/org/apache/aurora/common/stats/NumericStatExporter.java deleted file mode 100644 index 7345edc..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/NumericStatExporter.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -import java.util.Map; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.logging.Logger; - -import com.google.common.base.Function; -import com.google.common.collect.Maps; - -import org.apache.aurora.common.application.ShutdownRegistry; -import org.apache.aurora.common.base.Closure; -import org.apache.aurora.common.base.Command; -import org.apache.aurora.common.quantity.Amount; -import org.apache.aurora.common.quantity.Time; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * Stat exporter that extracts numeric {@link Stat}s from the {@link Stats} system, and exports them - * via a caller-defined sink. - * - * @author William Farner - */ -public class NumericStatExporter { - - private static final Logger LOG = Logger.getLogger(NumericStatExporter.class.getName()); - - private final ScheduledExecutorService executor; - private final Amount<Long, Time> exportInterval; - private final Closure<Map<String, ? extends Number>> exportSink; - - private final Runnable exporter; - - /** - * Creates a new numeric stat exporter that will export to the specified sink. - * - * @param exportSink Consumes stats. - * @param executor Executor to handle export thread. - * @param exportInterval Export period. - */ - public NumericStatExporter(final Closure<Map<String, ? extends Number>> exportSink, - ScheduledExecutorService executor, Amount<Long, Time> exportInterval) { - checkNotNull(exportSink); - this.executor = checkNotNull(executor); - this.exportInterval = checkNotNull(exportInterval); - this.exportSink = exportSink; - - exporter = new Runnable() { - @Override public void run() { - exportSink.execute(Maps.transformValues( - Maps.uniqueIndex(Stats.getNumericVariables(), GET_NAME), READ_STAT)); - } - }; - } - - /** - * Starts the stat exporter. - * - * @param shutdownRegistry Shutdown hook registry to allow the exporter to cleanly halt. - */ - public void start(ShutdownRegistry shutdownRegistry) { - long intervalSecs = exportInterval.as(Time.SECONDS); - executor.scheduleAtFixedRate(exporter, intervalSecs, intervalSecs, TimeUnit.SECONDS); - - shutdownRegistry.addAction(new Command() { - @Override public void execute() { - stop(); - exportSink.execute(Maps.transformValues( - Maps.uniqueIndex(Stats.getNumericVariables(), GET_NAME), SAMPLE_AND_READ_STAT)); - } - }); - } - - /** - * Stops the stat exporter. Once stopped, it may be started again by calling - * {@link #start(ShutdownRegistry)}. - */ - public void stop() { - try { - if (!executor.awaitTermination(1, TimeUnit.SECONDS)) { - executor.shutdownNow(); - if (!executor.awaitTermination(1, TimeUnit.SECONDS)) { - LOG.severe("Failed to stop stat exporter."); - } - } - } catch (InterruptedException e) { - executor.shutdownNow(); - Thread.currentThread().interrupt(); - } - } - - public static final Function<Stat<?>, String> GET_NAME = new Function<Stat<?>, String>() { - @Override public String apply(Stat<?> stat) { - return stat.getName(); - } - }; - - public static final Function<Stat<? extends Number>, Number> READ_STAT = - new Function<Stat<? extends Number>, Number>() { - @Override public Number apply(Stat<? extends Number> stat) { - return stat.read(); - } - }; - - private static final Function<RecordingStat<? extends Number>, Number> SAMPLE_AND_READ_STAT = - new Function<RecordingStat<? extends Number>, Number>() { - @Override public Number apply(RecordingStat<? extends Number> stat) { - return stat.sample(); - } - }; -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/PipelineStats.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/PipelineStats.java b/commons/src/main/java/org/apache/aurora/common/stats/PipelineStats.java deleted file mode 100644 index 014a56a..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/PipelineStats.java +++ /dev/null @@ -1,134 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import org.apache.aurora.common.base.MorePreconditions; -import org.apache.aurora.common.collections.Pair; -import org.apache.aurora.common.quantity.Amount; -import org.apache.aurora.common.quantity.Time; -import org.apache.aurora.common.util.Clock; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * Tracks the latency of different pipeline stages in a process. - * - * @author William Farner - */ -public class PipelineStats { - private static final String FULL_PIPELINE_NAME = "full"; - - private final Time precision; - private final Clock clock; - - private final Map<String, SlidingStats> stages; - - /** - * Creates a new pipeline tracker with the given pipeline name and stages. The stage name "full" - * is reserved to represent the duration of the entire pipeline. - * - * @param pipelineName Name of the pipeline. - * @param stages Stage names. - * @param precision Precision for time interval recording. - */ - public PipelineStats(String pipelineName, Set<String> stages, Time precision) { - this(pipelineName, stages, Clock.SYSTEM_CLOCK, precision); - } - - @VisibleForTesting - PipelineStats(String pipelineName, Set<String> stages, Clock clock, Time precision) { - MorePreconditions.checkNotBlank(pipelineName); - MorePreconditions.checkNotBlank(stages); - Preconditions.checkArgument(!stages.contains(FULL_PIPELINE_NAME)); - - this.clock = Preconditions.checkNotNull(clock); - this.precision = Preconditions.checkNotNull(precision); - - this.stages = Maps.newHashMap(); - for (String stage : stages) { - this.stages.put(stage, new SlidingStats( - String.format("%s_%s", pipelineName, stage), precision.toString())); - } - this.stages.put(FULL_PIPELINE_NAME, new SlidingStats( - String.format("%s_%s", pipelineName, FULL_PIPELINE_NAME), precision.toString())); - } - - private void record(Snapshot snapshot) { - for (Pair<String, Long> stage : snapshot.stages) { - stages.get(stage.getFirst()).accumulate(stage.getSecond()); - } - } - - public Snapshot newSnapshot() { - return new Snapshot(this); - } - - @VisibleForTesting - public SlidingStats getStatsForStage(String stage) { - return stages.get(stage); - } - - public class Snapshot { - private final List<Pair<String, Long>> stages = Lists.newLinkedList(); - private final PipelineStats parent; - - private String currentStage; - private long startTime; - private long ticker; - - private Snapshot(PipelineStats parent) { - this.parent = parent; - } - - /** - * Records the duration for the current pipeline stage, and advances to the next stage. The - * stage name must be one of the stages specified in the constructor. - * - * @param stageName Name of the stage to enter. - */ - public void start(String stageName) { - record(Preconditions.checkNotNull(stageName)); - } - - private void record(String stageName) { - long now = Amount.of(clock.nowNanos(), Time.NANOSECONDS).as(precision); - if (currentStage != null) { - stages.add(Pair.of(currentStage, now - ticker)); - } else { - startTime = now; - } - - if (stageName == null) stages.add(Pair.of(FULL_PIPELINE_NAME, now - startTime)); - - ticker = now; - currentStage = stageName; - } - - /** - * Stops the pipeline, recording the interval for the last registered stage. - * This is the same as calling {@link #start(String)} with {@code null}; - * - */ - public void end() { - record(null); - parent.record(this); - } - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/Precision.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/Precision.java b/commons/src/main/java/org/apache/aurora/common/stats/Precision.java deleted file mode 100644 index 7000e2f..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/Precision.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -import com.google.common.base.Preconditions; - -/** - * Precision expresses the maximum epsilon tolerated for a typical size of input - * e.g.: Precision(0.01, 1000) express that we tolerate a error of 1% for 1000 entries - * it means that max difference between the real quantile and the estimate one is - * error = 0.01*1000 = 10 - * For an entry like (1 to 1000), q(0.5) will be [490 <= x <= 510] (real q(0.5) = 500) - */ -public class Precision { - private final double epsilon; - private final int n; - - /** - * Create a Precision instance representing a precision per number of entries - * - * @param epsilon is the maximum error tolerated - * @param n size of the data set - */ - public Precision(double epsilon, int n) { - Preconditions.checkArgument(0.0 < epsilon, "Epsilon must be positive!"); - Preconditions.checkArgument(1 < n, "N (expected number of elements) must be greater than 1!"); - - this.epsilon = epsilon; - this.n = n; - } - - public double getEpsilon() { - return epsilon; - } - - public int getN() { - return n; - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/PrintableHistogram.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/PrintableHistogram.java b/commons/src/main/java/org/apache/aurora/common/stats/PrintableHistogram.java deleted file mode 100644 index a587457..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/PrintableHistogram.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -import com.google.common.base.Preconditions; - -public class PrintableHistogram { - private double[] bucketBoundaries; - private int[] bucketCounts; - private int totalCount = 0; - - /** - * Creates a histogram with the given bucket boundaries. The boundaries - * 0 and infinity are implicitly added. - * - * @param buckets Boundaries for histogram buckets. - */ - public PrintableHistogram(double ... buckets) { - Preconditions.checkState(buckets[0] != 0); - - bucketBoundaries = new double[buckets.length + 2]; - bucketBoundaries[0] = 0; - bucketCounts = new int[buckets.length + 2]; - for (int i = 0; i < buckets.length; i++) { - if (i > 0) { - Preconditions.checkState(buckets[i] > buckets[i - 1], - "Bucket %f must be greater than %f.", buckets[i], buckets[i - 1]); - } - bucketCounts[i] = 0; - bucketBoundaries[i + 1] = buckets[i]; - } - - bucketBoundaries[bucketBoundaries.length - 1] = Integer.MAX_VALUE; - } - - public void addValue(double value) { - addValue(value, 1); - } - - public void addValue(double value, int count) { - Preconditions.checkState(value >= 0); - Preconditions.checkState(count >= 0); - Preconditions.checkState(bucketBoundaries.length > 1); - int bucketId = -1; - for (double boundary : bucketBoundaries) { - if (value <= boundary) { - break; - } - bucketId++; - } - - bucketId = Math.max(0, bucketId); - bucketId = Math.min(bucketCounts.length - 1, bucketId); - bucketCounts[bucketId] += count; - totalCount += count; - } - - public double getBucketRatio(int bucketId) { - Preconditions.checkState(bucketId >= 0); - Preconditions.checkState(bucketId < bucketCounts.length); - return (double) bucketCounts[bucketId] / totalCount; - } - - public String toString() { - StringBuilder display = new StringBuilder(); - display.append("Histogram: "); - for (int bucketId = 0; bucketId < bucketCounts.length - 1; bucketId++) { - display.append(String.format("\n(%g - %g]\n\t", - bucketBoundaries[bucketId], bucketBoundaries[bucketId + 1])); - for (int i = 0; i < getBucketRatio(bucketId) * 100; i++) { - display.append('#'); - } - display.append( - String.format(" %.2g%% (%d)", getBucketRatio(bucketId) * 100, bucketCounts[bucketId])); - } - - return display.toString(); - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/ReservoirSampler.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/ReservoirSampler.java b/commons/src/main/java/org/apache/aurora/common/stats/ReservoirSampler.java deleted file mode 100644 index 79e7e04..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/ReservoirSampler.java +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -import java.util.Vector; - -import com.google.common.base.Preconditions; - -import org.apache.aurora.common.util.Random; - -/** - * An in memory implementation of Reservoir Sampling for sampling from - * a population. - * <p>Several optimizations can be done. - * Especially, one can avoid rolling the dice as many times as the - * size of the population with an involved trick. - * See "Random Sampling with a Reservoir", Vitter, 1985</p> - * <p>TODO (delip): Fix this when the problem arises</p> - * - * @param <T> Type of the sample - * @author Delip Rao - */ -public class ReservoirSampler<T> { - private final Vector<T> reservoir = new Vector<T>(); - private final int numSamples; - - private final Random random; - private int numItemsSeen = 0; - - /** - * Create a new sampler with a certain reservoir size using - * a supplied random number generator. - * - * @param numSamples Maximum number of samples to - * retain in the reservoir. Must be non-negative. - * @param random Instance of the random number generator - * to use for sampling - */ - public ReservoirSampler(int numSamples, Random random) { - Preconditions.checkArgument(numSamples > 0, - "numSamples should be positive"); - Preconditions.checkNotNull(random); - this.numSamples = numSamples; - this.random = random; - } - - /** - * Create a new sampler with a certain reservoir size using - * the default random number generator. - * - * @param numSamples Maximum number of samples to - * retain in the reservoir. Must be non-negative. - */ - public ReservoirSampler(int numSamples) { - this(numSamples, Random.Util.newDefaultRandom()); - } - - /** - * Sample an item and store in the reservoir if needed. - * - * @param item The item to sample - may not be null. - */ - public void sample(T item) { - Preconditions.checkNotNull(item); - if (reservoir.size() < numSamples) { - // reservoir not yet full, just append - reservoir.add(item); - } else { - // find a sample to replace - int rIndex = random.nextInt(numItemsSeen + 1); - if (rIndex < numSamples) { - reservoir.set(rIndex, item); - } - } - numItemsSeen++; - } - - /** - * Get samples collected in the reservoir. - * - * @return A sequence of the samples. No guarantee is provided on the order of the samples. - */ - public Iterable<T> getSamples() { - return reservoir; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/Significance.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/Significance.java b/commons/src/main/java/org/apache/aurora/common/stats/Significance.java deleted file mode 100644 index ff040e9..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/Significance.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -/** - * Calculate significance scores between an observed amount and an expected amount. - * - * @author Gilad Mishne - */ -public class Significance { - - /** - * @param observed The observed amount. - * @param expected The expected amount. - * @return [(observed - expected) ** 2 / expected] * sign(observed - expected) - */ - public static double chiSqrScore(double observed, double expected) { - double score = Math.pow((observed - expected), 2) / expected; - if (observed < expected) { - score *= -1; - } - return score; - } - - /** - * @param observed The observed amount. - * @param expected The expected amount. - * @return -2 * expected * log(observed / expected) * sign(observed - expected) - */ - public static double logLikelihood(double observed, double expected) { - if (observed == 0) { - return -expected; - } - if (expected == 0) { - return observed; - } - double score = -2 * observed * Math.log(observed / expected); - if (observed < expected) { - score *= -1; - } - return score; - } - - private Significance() { - // prevent instantiation - } - -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/Statistics.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/Statistics.java b/commons/src/main/java/org/apache/aurora/common/stats/Statistics.java deleted file mode 100644 index 498abb0..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/Statistics.java +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -/** - * A simple class to keep running statistics that require O(1) storage. - * - * @author William Farner - */ -public class Statistics implements StatisticsInterface { - private long populationSize; - private long sum; - private double accumulatedVariance; - private double runningMean; - - private long minValue; - private long maxValue; - - public Statistics() { - clear(); - } - - public void accumulate(long value) { - populationSize++; - sum += value; - double delta = value - runningMean; - runningMean += delta / populationSize; - accumulatedVariance += delta * (value - runningMean); - - // Update max/min. - minValue = value < minValue ? value : minValue; - maxValue = value > maxValue ? value : maxValue; - } - - public void clear() { - populationSize = 0; - sum = 0; - accumulatedVariance = 0; - runningMean = 0; - minValue = Long.MAX_VALUE; - maxValue = Long.MIN_VALUE; - } - - public double variance() { - return accumulatedVariance / populationSize; - } - - public double standardDeviation() { - return Math.sqrt(variance()); - } - - public double mean() { - return runningMean; - } - - public long min() { - return minValue; - } - - public long max() { - return maxValue; - } - - public long range() { - return maxValue - minValue; - } - - public long sum() { - return sum; - } - - public long populationSize() { - return populationSize; - } - - @Override - public String toString() { - return String.format("Mean: %f, Min: %d, Max: %d, Range: %d, Stddev: %f, Variance: %f, " + - "Population: %d, Sum: %d", mean(), min(), max(), range(), standardDeviation(), - variance(), populationSize(), sum()); - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/StatisticsInterface.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/StatisticsInterface.java b/commons/src/main/java/org/apache/aurora/common/stats/StatisticsInterface.java deleted file mode 100644 index 893c069..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/StatisticsInterface.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -/** - * Interface representing statistics of a set of (long) elements. - */ -public interface StatisticsInterface { - /** - * Add a value in the Statistics object. - * @param value value that you want to accumulate. - */ - void accumulate(long value); - - /** - * Clear the Statistics instance (equivalent to recreate a new one). - */ - void clear(); - - /** - * Return the variance of the inserted elements. - */ - double variance(); - - /** - * Return the standard deviation of the inserted elements. - */ - double standardDeviation(); - - /** - * Return the mean of the inserted elements. - */ - double mean(); - - /** - * Return the min of the inserted elements. - */ - long min(); - - /** - * Return the max of the inserted elements. - */ - long max(); - - /** - * Return the range of the inserted elements. - */ - long range(); - - /** - * Return the sum of the inserted elements. - */ - long sum(); - - /** - * Return the number of the inserted elements. - */ - long populationSize(); -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/Windowed.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/Windowed.java b/commons/src/main/java/org/apache/aurora/common/stats/Windowed.java deleted file mode 100644 index 12ab468..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/Windowed.java +++ /dev/null @@ -1,136 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -import java.lang.reflect.Array; - -import com.google.common.base.Function; -import com.google.common.base.Preconditions; -import com.google.common.base.Supplier; - -import org.apache.aurora.common.quantity.Amount; -import org.apache.aurora.common.quantity.Time; -import org.apache.aurora.common.util.Clock; - -/** - * Windowed is an abstraction that let you span a class across a sliding window. - * It creates a ring buffer of T and reuse the buffer after clearing it or use a new one (via - * the {@code clearer} function). - * - * <pre> - * tenured instances - * ++++++++++++++++++++++++++++++++++ - * [----A-----][-----B----][-----C----][-----D----] - * ++++++++++ - * current instance - * </pre> - * - * The schema above represents the valid instances over time - * (A,B,C) are the tenured ones - * D is the current instance - */ -public abstract class Windowed<T> { - private Class<T> clazz; - protected final T[] buffers; - private final long sliceDuration; - private final Clock clock; - private long index = -1L; - private Function<T, T> clearer; - - /** - * @param clazz the type of the underlying element T - * @param window the length of the window - * @param slices the number of slices (the window will be divided into {@code slices} slices) - * @param sliceProvider the supplier of element - * @param clearer the function that clear (or re-create) an element - * @param clock the clock used for to select the appropriate histogram - */ - public Windowed(Class<T> clazz, Amount<Long, Time> window, int slices, - Supplier<T> sliceProvider, Function<T, T> clearer, Clock clock) { - Preconditions.checkNotNull(window); - // Ensure that we have at least 1ms per slice - Preconditions.checkArgument(window.as(Time.MILLISECONDS) > (slices + 1)); - Preconditions.checkArgument(window.as(Time.MILLISECONDS) > (slices + 1)); - Preconditions.checkArgument(0 < slices); - Preconditions.checkNotNull(sliceProvider); - Preconditions.checkNotNull(clock); - - this.clazz = clazz; - this.sliceDuration = window.as(Time.MILLISECONDS) / slices; - @SuppressWarnings("unchecked") // safe because we have the clazz proof of type H - T[] bufs = (T[]) Array.newInstance(clazz, slices + 1); - for (int i = 0; i < bufs.length; i++) { - bufs[i] = sliceProvider.get(); - } - this.buffers = bufs; - this.clearer = clearer; - this.clock = clock; - } - - /** - * Return the index of the latest Histogram. - * You have to modulo it with buffer.length before accessing the array with this number. - */ - protected int getCurrentIndex() { - long now = clock.nowMillis(); - return (int) (now / sliceDuration); - } - - /** - * Check for expired elements and return the current one. - */ - protected T getCurrent() { - sync(getCurrentIndex()); - return buffers[(int) (index % buffers.length)]; - } - - /** - * Check for expired elements and return all the tenured (old) ones. - */ - protected T[] getTenured() { - long currentIndex = getCurrentIndex(); - sync(currentIndex); - @SuppressWarnings("unchecked") // safe because we have the clazz proof of type T - T[] tmp = (T[]) Array.newInstance(clazz, buffers.length - 1); - for (int i = 0; i < tmp.length; i++) { - int idx = (int) ((currentIndex + 1 + i) % buffers.length); - tmp[i] = buffers[idx]; - } - return tmp; - } - - /** - * Clear all the elements. - */ - public void clear() { - for (int i = 0; i <= buffers.length; i++) { - buffers[i] = clearer.apply(buffers[i]); - } - } - - /** - * Synchronize elements with a point in time. - * i.e. Check for expired ones and clear them, and update the index variable. - */ - protected void sync(long currentIndex) { - if (index < currentIndex) { - long from = Math.max(index + 1, currentIndex - buffers.length + 1); - for (long i = from; i <= currentIndex; i++) { - int idx = (int) (i % buffers.length); - buffers[idx] = clearer.apply(buffers[idx]); - } - index = currentIndex; - } - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/WindowedApproxHistogram.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/WindowedApproxHistogram.java b/commons/src/main/java/org/apache/aurora/common/stats/WindowedApproxHistogram.java deleted file mode 100644 index 6461a2e..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/WindowedApproxHistogram.java +++ /dev/null @@ -1,153 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Function; -import com.google.common.base.Supplier; - -import org.apache.aurora.common.quantity.Amount; -import org.apache.aurora.common.quantity.Data; -import org.apache.aurora.common.quantity.Time; -import org.apache.aurora.common.util.Clock; - -/** - * WindowedApproxHistogram is an implementation of WindowedHistogram with an - * ApproximateHistogram as the underlying storing histogram. - */ -public class WindowedApproxHistogram extends WindowedHistogram<ApproximateHistogram> { - @VisibleForTesting public static final int DEFAULT_SLICES = 3; - @VisibleForTesting public static final Amount<Long, Time> DEFAULT_WINDOW = - Amount.of(1L, Time.MINUTES); - @VisibleForTesting public static final Amount<Long, Data> DEFAULT_MAX_MEMORY = Amount.of( - (DEFAULT_SLICES + 1) * ApproximateHistogram.DEFAULT_MAX_MEMORY.as(Data.BYTES), Data.BYTES); - - /** - * Create a {@code WindowedApproxHistogram } with a window duration of {@code window} and - * decomposed in {@code slices} Histograms. Those Histograms will individually take less than - * {@code maxMemory / (slices + 1)}. The clock will be used to find the correct index in the - * ring buffer. - * - * @param window duration of the window - * @param slices number of slices in the window - * @param maxMemory maximum memory used by the whole histogram - */ - public WindowedApproxHistogram(Amount<Long, Time> window, final int slices, - final Amount<Long, Data> maxMemory, Clock clock) { - super(ApproximateHistogram.class, window, slices, - new Supplier<ApproximateHistogram>() { - private Amount<Long, Data> perHistogramMemory = Amount.of( - maxMemory.as(Data.BYTES) / (slices + 1), Data.BYTES); - @Override - public ApproximateHistogram get() { - return new ApproximateHistogram(perHistogramMemory); - } - }, - new Function<ApproximateHistogram[], Histogram>() { - @Override - public Histogram apply(ApproximateHistogram[] histograms) { - return ApproximateHistogram.merge(histograms); - } - }, clock); - } - - /** - * Create a {@code WindowedApproxHistogram } with a window duration of {@code window} and - * decomposed in {@code slices} Histograms. Those Histograms will individually have a - * precision of {@code precision / (slices + 1)}. The ticker will be used to measure elapsed - * time in the WindowedHistogram. - * - * @param window duration of the window - * @param slices number of slices in the window - * @param precision precision of the whole histogram - */ - public WindowedApproxHistogram(Amount<Long, Time> window, final int slices, - final Precision precision, Clock clock) { - super(ApproximateHistogram.class, window, slices, - new Supplier<ApproximateHistogram>() { - private Precision perHistogramPrecision = new Precision( - precision.getEpsilon(), precision.getN() / (slices + 1)); - @Override - public ApproximateHistogram get() { - return new ApproximateHistogram(perHistogramPrecision); - } - }, - new Function<ApproximateHistogram[], Histogram>() { - @Override - public Histogram apply(ApproximateHistogram[] histograms) { - return ApproximateHistogram.merge(histograms); - } - }, clock); - } - - /** - * Equivalent to calling - * {@link #WindowedApproxHistogram(Amount, int, Amount, Clock)} - * with the System clock. - */ - public WindowedApproxHistogram(Amount<Long, Time> window, int slices, - Amount<Long, Data> maxMemory) { - this(window, slices, maxMemory, Clock.SYSTEM_CLOCK); - } - - /** - * Equivalent to calling - * {@link #WindowedApproxHistogram(Amount, int, Amount)} - * with default window and slices. - */ - public WindowedApproxHistogram(Amount<Long, Data> maxMemory) { - this(DEFAULT_WINDOW, DEFAULT_SLICES, maxMemory); - } - - /** - * Equivalent to calling - * {@link #WindowedApproxHistogram(Amount, int, Precision, Clock)} - * with the System clock. - */ - public WindowedApproxHistogram(Amount<Long, Time> window, int slices, Precision precision) { - this(window, slices, precision, Clock.SYSTEM_CLOCK); - } - - /** - * Equivalent to calling - * {@link #WindowedApproxHistogram(Amount, int, Precision)} - * with default window and slices. - */ - public WindowedApproxHistogram(Precision precision) { - this(DEFAULT_WINDOW, DEFAULT_SLICES, precision); - } - - /** - * Equivalent to calling - * {@link #WindowedApproxHistogram(Amount, int, Amount, Clock)} - * with the default maxMemory parameter and System clock. - */ - public WindowedApproxHistogram(Amount<Long, Time> window, int slices) { - this(window, slices, DEFAULT_MAX_MEMORY, Clock.SYSTEM_CLOCK); - } - - /** - * WindowedApproxHistogram constructor with default values. - */ - public WindowedApproxHistogram() { - this(DEFAULT_WINDOW, DEFAULT_SLICES, DEFAULT_MAX_MEMORY, Clock.SYSTEM_CLOCK); - } - - /** - * WindowedApproxHistogram constructor with custom Clock (for testing purposes only). - */ - @VisibleForTesting public WindowedApproxHistogram(Clock clock) { - this(DEFAULT_WINDOW, DEFAULT_SLICES, DEFAULT_MAX_MEMORY, clock); - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/WindowedHistogram.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/WindowedHistogram.java b/commons/src/main/java/org/apache/aurora/common/stats/WindowedHistogram.java deleted file mode 100644 index 23e2f4f..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/WindowedHistogram.java +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -import com.google.common.base.Function; -import com.google.common.base.Preconditions; -import com.google.common.base.Supplier; - -import org.apache.aurora.common.quantity.Amount; -import org.apache.aurora.common.quantity.Time; -import org.apache.aurora.common.util.Clock; - -/** - * Histogram windowed over time. - * <p> - * This histogram is composed of a series of ({@code slices} + 1) histograms representing a window - * of {@code range} duration. We only update the latest one, and we query the oldest ones (i.e. all - * histograms except the head). - * </p> - * <pre> - * range - * <-------------> - * [AAA][BBB][CCC][DDD] here slices = 3 - * ---------------------> - * t1 t2 - * - * For t in [t1,t2) we: - * insert elements in DDD - * query quantile over [AAA][BBB][CCC] - * </pre> - * <p> - * When {@code t} is in {@code [t1, t2)} we insert value into the latest histogram (DDD here), - * when we query the histogram, we 'merge' all other histograms (all except the latest) and query - * it. when {@code t > t2} the oldest histogram become the newest (like in a ring buffer) and - * so on ... - * </p> - * <p> - * Note: We use MergedHistogram class to represent a merged histogram without actually - * merging the underlying histograms. - * </p> - */ -public class WindowedHistogram<H extends Histogram> extends Windowed<H> implements Histogram { - - private long mergedHistIndex = -1L; - private Function<H[], Histogram> merger; - private Histogram mergedHistogram = null; - - /** - * Create a WindowedHistogram of {@code slices + 1} elements over a time {@code window}. - * This code is independent from the implementation of Histogram, you just need to provide - * a {@code Supplier<H>} to create the histograms and a {@code Function<H[], Histogram>} to - * merge them. - * - * @param clazz the type of the underlying Histogram H - * @param window the length of the window - * @param slices the number of slices (the window will be divided into {@code slices} slices) - * @param sliceProvider the supplier of histogram - * @param merger the function that merge an array of histogram H[] into a single Histogram - * @param clock the clock used for to select the appropriate histogram - */ - public WindowedHistogram(Class<H> clazz, Amount<Long, Time> window, int slices, - Supplier<H> sliceProvider, Function<H[], Histogram> merger, Clock clock) { - super(clazz, window, slices, sliceProvider, new Function<H, H>() { - @Override - public H apply(H h) { h.clear(); return h; } - }, clock); - Preconditions.checkNotNull(merger); - - this.merger = merger; - } - - @Override - public synchronized void add(long x) { - getCurrent().add(x); - } - - @Override - public synchronized void clear() { - for (Histogram h: buffers) { - h.clear(); - } - } - - @Override - public synchronized long getQuantile(double quantile) { - long currentIndex = getCurrentIndex(); - if (mergedHistIndex < currentIndex) { - H[] tmp = getTenured(); - mergedHistogram = merger.apply(tmp); - mergedHistIndex = currentIndex; - } - return mergedHistogram.getQuantile(quantile); - } - - @Override - public synchronized long[] getQuantiles(double[] quantiles) { - return Histograms.extractQuantiles(this, quantiles); - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/WindowedStatistics.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/WindowedStatistics.java b/commons/src/main/java/org/apache/aurora/common/stats/WindowedStatistics.java deleted file mode 100644 index ded3faf..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/WindowedStatistics.java +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats; - -import com.google.common.base.Supplier; -import com.google.common.base.Function; - -import org.apache.aurora.common.quantity.Amount; -import org.apache.aurora.common.quantity.Time; -import org.apache.aurora.common.util.Clock; - -/** - * Keep track of statistics over a set of value in a sliding window. - * WARNING: The computation of the statistics needs to be explicitly requested with - * {@code refresh()} before reading any statistics. - * - * @see Windowed class for more details about how the window is parametrized. - */ -public class WindowedStatistics extends Windowed<Statistics> implements StatisticsInterface { - private int lastIndex = -1; - private double variance = 0.0; - private double mean = 0.0; - private long sum = 0L; - private long min = Long.MAX_VALUE; - private long max = Long.MIN_VALUE; - private long populationSize = 0L; - - public WindowedStatistics(Amount<Long, Time> window, int slices, Clock clock) { - super(Statistics.class, window, slices, - new Supplier<Statistics>() { - @Override public Statistics get() { return new Statistics(); } - }, - new Function<Statistics, Statistics>() { - @Override public Statistics apply(Statistics s) { s.clear(); return s; } - }, - clock); - } - - /** - * Construct a Statistics sliced over time in {@code slices + 1} windows. - * The {@code window} parameter represents the total window, that will be sliced into - * {@code slices + 1} parts. - * - * Ex: WindowedStatistics(Amount.of(1L, Time.MINUTES), 3) will be sliced like this: - * <pre> - * 20s 20s 20s 20s - * [----A-----][-----B----][-----C----][-----D----] - * </pre> - * The current window is 'D' (the one you insert elements into) and the tenured windows - * are 'A', 'B', 'C' (the ones you read elements from). - */ - public WindowedStatistics(Amount<Long, Time> window, int slices) { - this(window, slices, Clock.SYSTEM_CLOCK); - } - - /** - * Equivalent to calling {@link #WindowedStatistics(Amount, int)} with a 1 minute window - * and 3 slices. - */ - public WindowedStatistics() { - this(Amount.of(1L, Time.MINUTES), 3, Clock.SYSTEM_CLOCK); - } - - public void accumulate(long value) { - getCurrent().accumulate(value); - } - - /** - * Compute all the statistics in one pass. - */ - public void refresh() { - int currentIndex = getCurrentIndex(); - if (lastIndex != currentIndex) { - lastIndex = currentIndex; - double x = 0.0; - variance = 0.0; - mean = 0.0; - sum = 0L; - populationSize = 0L; - min = Long.MAX_VALUE; - max = Long.MIN_VALUE; - for (Statistics s : getTenured()) { - if (s.populationSize() == 0) { - continue; - } - x += s.populationSize() * (s.variance() + s.mean() * s.mean()); - sum += s.sum(); - populationSize += s.populationSize(); - min = Math.min(min, s.min()); - max = Math.max(max, s.max()); - } - if (populationSize != 0) { - mean = ((double) sum) / populationSize; - variance = x / populationSize - mean * mean; - } - } - } - - /** - * WARNING: You need to call refresh() to recompute the variance - * @return the variance of the aggregated windows - */ - public double variance() { - return variance; - } - - /** - * WARNING: You need to call refresh() to recompute the variance - * @return the standard deviation of the aggregated windows - */ - public double standardDeviation() { - return Math.sqrt(variance()); - } - - /** - * WARNING: You need to call refresh() to recompute the variance - * @return the mean of the aggregated windows - */ - public double mean() { - return mean; - } - - /** - * WARNING: You need to call refresh() to recompute the variance - * @return the sum of the aggregated windows - */ - public long sum() { - return sum; - } - - /** - * WARNING: You need to call refresh() to recompute the variance - * @return the min of the aggregated windows - */ - public long min() { - return min; - } - - /** - * WARNING: You need to call refresh() to recompute the variance - * @return the max of the aggregated windows - */ - public long max() { - return max; - } - - /** - * WARNING: You need to call refresh() to recompute the variance - * @return the range of the aggregated windows - */ - public long range() { - return max - min; - } - - /** - * WARNING: You need to call refresh() to recompute the variance - * @return the population size of the aggregated windows - */ - public long populationSize() { - return populationSize; - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/stats/testing/RealHistogram.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/stats/testing/RealHistogram.java b/commons/src/main/java/org/apache/aurora/common/stats/testing/RealHistogram.java deleted file mode 100644 index 36b1174..0000000 --- a/commons/src/main/java/org/apache/aurora/common/stats/testing/RealHistogram.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.stats.testing; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.apache.aurora.common.stats.Histogram; -import org.apache.aurora.common.stats.Histograms; - -public class RealHistogram implements Histogram { - private final List<Long> buffer = new ArrayList<Long>(); - - @Override public void add(long x) { - buffer.add(x); - } - - @Override public void clear() { - buffer.clear(); - } - - @Override public long getQuantile(double quantile) { - Collections.sort(buffer); - return buffer.get((int) (quantile * buffer.size())); - } - - @Override public long[] getQuantiles(double[] quantiles) { - return Histograms.extractQuantiles(this, quantiles); - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/testing/TearDownRegistry.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/testing/TearDownRegistry.java b/commons/src/main/java/org/apache/aurora/common/testing/TearDownRegistry.java deleted file mode 100644 index 02db075..0000000 --- a/commons/src/main/java/org/apache/aurora/common/testing/TearDownRegistry.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.testing; - -import com.google.common.base.Preconditions; -import com.google.common.testing.TearDown; -import com.google.common.testing.TearDownAccepter; - -import org.apache.aurora.common.application.ShutdownRegistry; -import org.apache.aurora.common.base.ExceptionalCommand; - -/** - * An action registry suitable for use as a shutdownRegistry in tests that extend - * {@link com.google.common.testing.junit4.TearDownTestCase}. - * - * @author John Sirois - */ -public class TearDownRegistry implements ShutdownRegistry { - private final TearDownAccepter tearDownAccepter; - - /** - * Creates a new tear down registry that delegates execution of shutdown actions to a - * {@code tearDownAccepter}. - * - * @param tearDownAccepter A tear down accepter that will be used to register shutdown actions - * with. - */ - public TearDownRegistry(TearDownAccepter tearDownAccepter) { - this.tearDownAccepter = Preconditions.checkNotNull(tearDownAccepter); - } - - @Override - public <E extends Exception, T extends ExceptionalCommand<E>> void addAction(final T action) { - tearDownAccepter.addTearDown(new TearDown() { - @Override public void tearDown() throws Exception { - action.execute(); - } - }); - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/testing/mockito/MockitoTest.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/testing/mockito/MockitoTest.java b/commons/src/main/java/org/apache/aurora/common/testing/mockito/MockitoTest.java deleted file mode 100644 index cef57cc..0000000 --- a/commons/src/main/java/org/apache/aurora/common/testing/mockito/MockitoTest.java +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.testing.mockito; - -import org.junit.Before; -import org.mockito.MockitoAnnotations; - -/** - * A base class for tests that use Mockito. Before each test, it initializes all the mocks - * declared in the class. - */ -public abstract class MockitoTest { - /** - * Initializes all fields annotated with {@link org.mockito.Mock}. - */ - @Before - public final void initMockito() { - MockitoAnnotations.initMocks(this); - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/thrift/Config.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/thrift/Config.java b/commons/src/main/java/org/apache/aurora/common/thrift/Config.java deleted file mode 100644 index 7ab122b..0000000 --- a/commons/src/main/java/org/apache/aurora/common/thrift/Config.java +++ /dev/null @@ -1,302 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.thrift; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Preconditions; -import com.google.common.base.Predicates; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import org.apache.aurora.common.quantity.Amount; -import org.apache.aurora.common.quantity.Time; -import org.apache.aurora.common.stats.Stats; -import org.apache.aurora.common.stats.StatsProvider; - -/** - * Represents the configuration for a thrift call. Use {@link #builder()} to create a new one or - * or {@link #builder(Config)} to create a new config based on another config. - * - * <p>If a deadline is specified, it acts as a global timeout for each thrift call made. - * Obtaining connections, performing the remote call and executing retries are all expected to - * complete within this deadline. When the specified deadline is not met, an - * {@link TTimeoutException} will be thrown. - * - * <p>If max retries is specified as zero (never retry), then the list of retryable exceptions are - * ignored. It is only when max retries is greater than zero that list of retryable exceptions is - * used to determine if a particular failed call should be retried. - * - * @author John Sirois - */ -public class Config { - - /** - * Created a builder for a new {@link Config}. Default values are as follows: - * <ul> - * <li>{@link #getRequestTimeout()} 0 - * <li>{@link #getMaxRetries()} 0 - * <li>{@link #getRetryableExceptions()} [] - * <li>{@link #isDebug()} ()} false - * </ul> - */ - public static Builder builder() { - return new Builder(); - } - - /** - * - * @param config the builder configuration to use - */ - public static Builder builder(Config config) { - Preconditions.checkNotNull(config); - return new Builder(config); - } - - private static final Amount<Long,Time> DEADLINE_BLOCKING = Amount.of(0L, Time.MILLISECONDS); - - @VisibleForTesting - static final Amount<Long,Time> DEFAULT_CONNECT_TIMEOUT = Amount.of(5L, Time.SECONDS); - - private Amount<Long, Time> requestTimeout = DEADLINE_BLOCKING; - private Amount<Long, Time> connectTimeout = DEFAULT_CONNECT_TIMEOUT; - private int maxRetries; - private ImmutableSet<Class<? extends Exception>> retryableExceptions = ImmutableSet.of(); - private boolean debug = false; - private boolean enableStats = true; - private StatsProvider statsProvider = Stats.STATS_PROVIDER; - - private Config() { - // defaults - } - - private Config(Config copyFrom) { - requestTimeout = copyFrom.requestTimeout; - maxRetries = copyFrom.maxRetries; - retryableExceptions = copyFrom.retryableExceptions; - debug = copyFrom.debug; - statsProvider = copyFrom.statsProvider; - } - - /** - * Returns the maximum time to wait for any thrift call to complete. A deadline of 0 means to - * wait forever - */ - public Amount<Long, Time> getRequestTimeout() { - return requestTimeout; - } - - /** - * Returns the maximum time to wait for a connection to be established. A deadline of 0 means to - * wait forever - */ - public Amount<Long, Time> getConnectTimeout() { - return connectTimeout; - } - - /** - * Returns the maximum number of retries to perform for each thrift call. A value of 0 means to - * never retry and in this case {@link #getRetryableExceptions()} will be an empty set. - */ - public int getMaxRetries() { - return maxRetries; - } - - /** - * Returns the set of exceptions to retry calls for. The returned set will only be empty if - * {@link #getMaxRetries()} is 0. - */ - public ImmutableSet<Class<? extends Exception>> getRetryableExceptions() { - return retryableExceptions; - } - - /** - * Returns {@code true} if the client should log extra debugging information. Currently this - * includes method call arguments when RPCs fail with exceptions. - */ - public boolean isDebug() { - return debug; - } - - /** - * Returns {@code true} if the client should track request statistics. - */ - public boolean enableStats() { - return enableStats; - } - - /** - * Returns the stats provider to use to record Thrift client stats. - */ - public StatsProvider getStatsProvider() { - return statsProvider; - } - - // This was made public because it seems to be causing problems for scala users when it is not - // public. - public static abstract class AbstractBuilder<T extends AbstractBuilder> { - private final Config config; - - AbstractBuilder() { - this.config = new Config(); - } - - AbstractBuilder(Config template) { - Preconditions.checkNotNull(template); - this.config = new Config(template); - } - - protected abstract T getThis(); - - // TODO(John Sirois): extra validation or design ... can currently do strange things like: - // builder.blocking().withDeadline(1, TimeUnit.MILLISECONDS) - // builder.noRetries().retryOn(TException.class) - - /** - * Specifies that all calls be blocking calls with no inherent deadline. It may be the - * case that underlying transports will eventually deadline, but {@link Thrift} will not - * enforce a deadline. - */ - public final T blocking() { - config.requestTimeout = DEADLINE_BLOCKING; - return getThis(); - } - - /** - * Specifies that all calls be subject to a global timeout. This deadline includes all call - * activities, including obtaining a free connection and any automatic retries. - */ - public final T withRequestTimeout(Amount<Long, Time> timeout) { - Preconditions.checkNotNull(timeout); - Preconditions.checkArgument(timeout.getValue() >= 0, - "A negative deadline is invalid: %s", timeout); - config.requestTimeout = timeout; - return getThis(); - } - - /** - * Assigns the timeout for all connections established with the blocking client. - * On an asynchronous client this timeout is only used for the connection pool lock - * acquisition on initial calls (not retries, @see withRetries). The actual network - * connection timeout for the asynchronous client is governed by socketTimeout. - * - * @param timeout Connection timeout. - * @return A reference to the builder. - */ - public final T withConnectTimeout(Amount<Long, Time> timeout) { - Preconditions.checkNotNull(timeout); - Preconditions.checkArgument(timeout.getValue() >= 0, - "A negative deadline is invalid: %s", timeout); - config.connectTimeout = timeout; - return getThis(); - } - - /** - * Specifies that no calls be automatically retried. - */ - public final T noRetries() { - config.maxRetries = 0; - config.retryableExceptions = ImmutableSet.of(); - return getThis(); - } - - /** - * Specifies that failing calls meeting {@link #retryOn retry} criteria be retried up to a - * maximum of {@code retries} times before failing. On an asynchronous client, these retries - * will be forced to be non-blocking, failing fast if they cannot immediately acquire the - * connection pool locks, so they only provide a best-effort retry strategy there. - */ - public final T withRetries(int retries) { - Preconditions.checkArgument(retries >= 0, "A negative retry count is invalid: %d", retries); - config.maxRetries = retries; - return getThis(); - } - - /** - * Specifies the set of exception classes that are to be considered retryable (if retries are - * enabled). Any exceptions thrown by the underlying thrift call will be considered retryable - * if they are an instance of any one of the specified exception classes. The set of exception - * classes must contain at least exception class. To specify no retries either use - * {@link #noRetries()} or pass zero to {@link #withRetries(int)}. - */ - public final T retryOn(Iterable<? extends Class<? extends Exception>> retryableExceptions) { - Preconditions.checkNotNull(retryableExceptions); - ImmutableSet<Class<? extends Exception>> classes = - ImmutableSet.copyOf(Iterables.filter(retryableExceptions, Predicates.notNull())); - Preconditions.checkArgument(!classes.isEmpty(), - "Must provide at least one retryable exception class"); - config.retryableExceptions = classes; - return getThis(); - } - - /** - * Specifies the set of exception classes that are to be considered retryable (if retries are - * enabled). Any exceptions thrown by the underlying thrift call will be considered retryable - * if they are an instance of any one of the specified exception classes. The set of exception - * classes must contain at least exception class. To specify no retries either use - * {@link #noRetries()} or pass zero to {@link #withRetries(int)}. - */ - public final T retryOn(Class<? extends Exception> exception) { - Preconditions.checkNotNull(exception); - config.retryableExceptions = - ImmutableSet.<Class<? extends Exception>>builder().add(exception).build(); - return getThis(); - } - - /** - * When {@code debug == true}, specifies that extra debugging information should be logged. - */ - public final T withDebug(boolean debug) { - config.debug = debug; - return getThis(); - } - - /** - * Disables stats collection on the client (enabled by default). - */ - public T disableStats() { - config.enableStats = false; - return getThis(); - } - - /** - * Registers a custom stats provider to use to track various client stats. - */ - public T withStatsProvider(StatsProvider statsProvider) { - config.statsProvider = Preconditions.checkNotNull(statsProvider); - return getThis(); - } - - protected final Config getConfig() { - return config; - } - } - - public static final class Builder extends AbstractBuilder<Builder> { - private Builder() { - super(); - } - - private Builder(Config template) { - super(template); - } - - @Override - protected Builder getThis() { - return this; - } - - public Config create() { - return getConfig(); - } - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/thrift/TResourceExhaustedException.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/thrift/TResourceExhaustedException.java b/commons/src/main/java/org/apache/aurora/common/thrift/TResourceExhaustedException.java deleted file mode 100644 index 54e2bd3..0000000 --- a/commons/src/main/java/org/apache/aurora/common/thrift/TResourceExhaustedException.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.thrift; - -import org.apache.thrift.TException; - -/** - * @author Adam Samet - * - * This is exception is thrown when there are no available instances of a thrift backend - * service to serve requests. - */ -public class TResourceExhaustedException extends TException { - - private static final long serialVersionUID = 1L; - - public TResourceExhaustedException(String message) { - super(message); - } - - public TResourceExhaustedException(Throwable cause) { - super(cause); - } - - public TResourceExhaustedException(String message, Throwable cause) { - super(message, cause); - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/356eeac9/commons/src/main/java/org/apache/aurora/common/thrift/TTimeoutException.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/thrift/TTimeoutException.java b/commons/src/main/java/org/apache/aurora/common/thrift/TTimeoutException.java deleted file mode 100644 index 068abea..0000000 --- a/commons/src/main/java/org/apache/aurora/common/thrift/TTimeoutException.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.aurora.common.thrift; - -import org.apache.thrift.TException; - -/** - * @author Adam Samet - * - * This is exception is thrown when accessing a thrift service resource times out. - */ -public class TTimeoutException extends TException { - - private static final long serialVersionUID = 1L; - - public TTimeoutException(String message) { - super(message); - } - - public TTimeoutException(Throwable cause) { - super(cause); - } - - public TTimeoutException(String message, Throwable cause) { - super(message, cause); - } -}
