/* FlowMeter.java
*
* Copyright 2009-2012 Comcast Interactive Media, LLC.
*
* 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.fishwife.jrugged;
/**
* This class uses a raw {@link RequestCounter} to compute request rates over time for
* total rate of request, rate of successful requests, and rate of failed requests.
*/
public class FlowMeter {
private final RequestCounter counter;
private long lastTotal;
private long lastSuccesses;
private long lastFailures;
private long lastSampleMillis;
private final double[] lastKnownRates = new double[3];
/**
* Constructs a {@link FlowMeter}.
*
* @param counter
* the {@link RequestCounter} to calculate request rates from
*/
public FlowMeter(final RequestCounter counter) {
this.counter = counter;
}
/**
* Calculates requests per second.
*
* @param events
* how many have occured
* @param t
* time
* @return double rate
*/
private double rate(final long events, final long t) {
return (double) events / (double) t * 1000.0;
}
/**
* Takes a sample of the request rates. Calculations are based on differences in
* request counts since the last call to <code>sample()</code>.
*
* @return an array of three <code>doubles</code>: total requests per second,
* successful requests per second, failed requests per second. If this is the
* first sample, all three rates will be reported as zero requests per second.
*/
public synchronized double[] sample() {
final long[] currCounts = counter.sample();
final long now = System.currentTimeMillis();
if (lastSampleMillis != 0) {
final long deltaTime = now - lastSampleMillis;
if (deltaTime == 0) {
return lastKnownRates;
}
lastKnownRates[0] = rate(currCounts[0] - lastTotal, deltaTime);
lastKnownRates[1] = rate(currCounts[1] - lastSuccesses, deltaTime);
lastKnownRates[2] = rate(currCounts[2] - lastFailures, deltaTime);
} else {
lastKnownRates[0] = lastKnownRates[1] = lastKnownRates[2] = 0.0;
}
lastTotal = currCounts[0];
lastSuccesses = currCounts[1];
lastFailures = currCounts[2];
lastSampleMillis = now;
return lastKnownRates;
}
}