/** * Copyright 2016 Yahoo Inc. * * 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 com.yahoo.pulsar.broker; import com.yahoo.pulsar.common.policies.data.loadbalancer.NamespaceBundleStats; /** * Data class comprising the average message data over a fixed period of time. */ public class TimeAverageMessageData { // The maximum number of samples this data will consider. private int maxSamples; // The number of samples that are currently available for this data. Always // at most maxSamples. private int numSamples; // The average throughput-in in bytes per second. private double msgThroughputIn; // The average throughput-out in bytes per second. private double msgThroughputOut; // The average message rate in per second. private double msgRateIn; // The average message rate out per second. private double msgRateOut; // For JSON only. public TimeAverageMessageData() { } /** * Initialize this TimeAverageData to 0 values. * * @param maxSamples * The maximum number of samples with which to maintain the average. */ public TimeAverageMessageData(final int maxSamples) { this.maxSamples = maxSamples; } /** * Initialize this TimeAverageData using default stats. * * @param maxSamples * The maximum number of samples with which to maintain the average. * @param defaultStats * The stats to default to. These are overwritten after the first update. */ public TimeAverageMessageData(final int maxSamples, final NamespaceBundleStats defaultStats) { this.maxSamples = maxSamples; msgThroughputIn = defaultStats.msgThroughputIn; msgThroughputOut = defaultStats.msgThroughputOut; msgRateIn = defaultStats.msgRateIn; msgRateOut = defaultStats.msgRateOut; } /** * Update using new samples for the message data. * * @param newMsgThroughputIn * Most recently observed throughput in. * @param newMsgThroughputOut * Most recently observed throughput out. * @param newMsgRateIn * Most recently observed message rate in. * @param newMsgRateOut * Most recently observed message rate out. */ public void update(final double newMsgThroughputIn, final double newMsgThroughputOut, final double newMsgRateIn, final double newMsgRateOut) { // If max samples has been reached, don't increase numSamples. numSamples = Math.min(numSamples + 1, maxSamples); msgThroughputIn = getUpdatedValue(msgThroughputIn, newMsgThroughputIn); msgThroughputOut = getUpdatedValue(msgThroughputOut, newMsgThroughputOut); msgRateIn = getUpdatedValue(msgRateIn, newMsgRateIn); msgRateOut = getUpdatedValue(msgRateOut, newMsgRateOut); } /** * Update using a new bundle sample. * * @param newSample * Most recently observed bundle stats. */ public void update(final NamespaceBundleStats newSample) { update(newSample.msgThroughputIn, newSample.msgThroughputOut, newSample.msgRateIn, newSample.msgRateOut); } // Update the average of a sample using the number of samples, the previous // average, and a new sample. private double getUpdatedValue(final double oldAverage, final double newSample) { // Note that for numSamples == 1, this returns newSample. // This ensures that default stats get overwritten after the first // update. return ((numSamples - 1) * oldAverage + newSample) / numSamples; } public int getMaxSamples() { return maxSamples; } public void setMaxSamples(int maxSamples) { this.maxSamples = maxSamples; } public int getNumSamples() { return numSamples; } public void setNumSamples(int numSamples) { this.numSamples = numSamples; } public double getMsgThroughputIn() { return msgThroughputIn; } public void setMsgThroughputIn(double msgThroughputIn) { this.msgThroughputIn = msgThroughputIn; } public double getMsgThroughputOut() { return msgThroughputOut; } public void setMsgThroughputOut(double msgThroughputOut) { this.msgThroughputOut = msgThroughputOut; } public double getMsgRateIn() { return msgRateIn; } public void setMsgRateIn(double msgRateIn) { this.msgRateIn = msgRateIn; } public double getMsgRateOut() { return msgRateOut; } public void setMsgRateOut(double msgRateOut) { this.msgRateOut = msgRateOut; } }