/* * * * RHQ Management Platform * * Copyright (C) 2005-2012 Red Hat, Inc. * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License, version 2, as * * published by the Free Software Foundation, and/or the GNU Lesser * * General Public License, version 2.1, also as published by the Free * * Software Foundation. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License and the GNU Lesser General Public License * * for more details. * * * * You should have received a copy of the GNU General Public License * * and the GNU Lesser General Public License along with this program; * * if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ package org.rhq.server.metrics; import org.joda.time.DateTime; /** * @author John Sanda */ public class Buckets { static class Bucket { // start time is inclusive private long startTime; // end time is exclusive private long endTime; private ArithmeticMeanCalculator mean; private double max; private double min; private int count; public Bucket(long startTime, long endTime) { this.startTime = startTime; this.endTime = endTime; this.mean = new ArithmeticMeanCalculator(); } public long getStartTime() { return startTime; } public long getEndTime() { return endTime; } public Bucket insert(double value, double min, double max) { mean.add(value); if (count == 0) { this.min = min; this.max = max; } else { if (min < this.min) { this.min = min; } if (max > this.max) { this.max = max; } } count++; return this; } public double getAvg() { if (count == 0) { return Double.NaN; } return mean.getArithmeticMean(); } public double getMax() { if (count == 0) { return Double.NaN; } return max; } public double getMin() { if (count == 0) { return Double.NaN; } return min; } } // Default value private int numDataPoints = 60; private Bucket[] buckets; private long interval; public Buckets(DateTime beginTime, DateTime endTime) { this(beginTime.getMillis(), endTime.getMillis()); } public Buckets(long beginTime, long endTime, int numberOfDataPoints) { if (numberOfDataPoints<=0) { throw new IllegalArgumentException("Number of buckets must be > 0"); } numDataPoints = numberOfDataPoints; buckets = new Bucket[numDataPoints]; interval = (endTime - beginTime) / numDataPoints; for (int i = 1; i <= numDataPoints; ++i) { buckets[i - 1] = new Bucket(beginTime + (interval * (i - 1)), beginTime + (interval * i)); } } public Buckets(long beginTime, long endTime) { this(beginTime, endTime,60); } public int getNumDataPoints() { return numDataPoints; } public long getInterval() { return interval; } public Bucket get(int index) { return buckets[index]; } public void insert(long timestamp, double value, double min, double max) { for (Bucket bucket : buckets) { if (timestamp >= bucket.getStartTime() && timestamp < bucket.getEndTime()) { bucket.insert(value, min, max); return; } } } }