/* FlowMeter.java * * Copyright 2009-2015 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 RequestCounter counter; private long lastTotal; private long lastSuccesses; private long lastFailures; private long lastSampleMillis; private double[] lastKnownRates = new double[3]; /** * Constructs a {@link FlowMeter}. * @param counter the {@link RequestCounter} to calculate request * rates from */ public FlowMeter(RequestCounter counter) { this.counter = counter; } /** * Calculates requests per second. * * @param events how many have occured * @param t time * @return double rate */ private double rate(long events, 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() { long[] currCounts = counter.sample(); long now = System.currentTimeMillis(); if (lastSampleMillis != 0) { 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; } }