001 /*
002 @license.text@
003 */
004
005 package biz.hammurapi.metrics;
006
007 import java.io.Serializable;
008 import java.util.ArrayList;
009 import java.util.Collection;
010 import java.util.Iterator;
011 import java.util.List;
012
013 /**
014 *
015 * @author Pavel Vlasov
016 * @version $Revision: 1.8 $
017 */
018 public class SimpleMetric implements Metric, Comparable, Serializable {
019 /**
020 * Comment for <code>serialVersionUID</code>
021 */
022 private static final long serialVersionUID = -3636560361707914006L;
023 private String name;
024 private boolean keepMeasurements;
025
026 public SimpleMetric(String name) {
027 this.name=name;
028 }
029
030 public SimpleMetric(String name, boolean keepMeasurements) {
031 this.name=name;
032 this.keepMeasurements=keepMeasurements;
033 }
034
035 private int measurements;
036 private double total;
037 private double min;
038 private double max;
039 private double deviation;
040
041 public int getNumber() {
042 return measurements;
043 }
044
045 public double getMin() {
046 return min;
047 }
048
049 public double getMax() {
050 return max;
051 }
052
053 public double getAvg() {
054 return total/measurements;
055 }
056
057 public double getTotal() {
058 return total;
059 }
060
061 public void add(final double value, final long time) {
062 addMeasurement(new Measurement() {
063 public double getValue() {
064 return value;
065 }
066
067 public long getTime() {
068 return time;
069 }
070 });
071 }
072
073 /**
074 * @param value
075 * @param measurement
076 */
077 protected void addMeasurement(Measurement measurement) {
078 if (measurements==0 || measurement.getValue()<min) {
079 min=measurement.getValue();
080 }
081
082 if (measurements==0 || measurement.getValue()>max) {
083 max=measurement.getValue();
084 }
085
086 measurements++;
087 total+=measurement.getValue();
088 deviation+=Math.abs(measurement.getValue()-total/measurements);
089
090 if (keepMeasurements) {
091 measurementsList.add(measurement);
092 }
093 }
094
095 /**
096 * @param value
097 * @param time
098 * @return
099 */
100 protected Measurement newMeasurement(final double value, final long time) {
101 return new Measurement() {
102 public double getValue() {
103 return value;
104 }
105
106 public long getTime() {
107 return time;
108 }
109 };
110 }
111
112 public void add(Metric metric) {
113 if (measurements==0 || metric.getMin()<min) {
114 min=metric.getMin();
115 }
116
117 if (measurements==0 || metric.getMax()>max) {
118 max=metric.getMax();
119 }
120
121 measurements+=metric.getNumber();
122 total+=metric.getTotal();
123 deviation+=metric.getDeviation()*metric.getNumber();
124
125 if (keepMeasurements) {
126 measurementsList.addAll(metric.getMeasurements());
127 }
128 }
129
130 private List measurementsList=new ArrayList();
131
132 public Collection getMeasurements() {
133 return measurementsList;
134 }
135
136 public String getName() {
137 return name;
138 }
139
140 public String toString() {
141 StringBuffer ret=new StringBuffer();
142 ret.append(measurements)
143 .append("/")
144 .append(total)
145 .append(" <= ")
146 .append(name)
147 .append("\n");
148 Iterator it=measurementsList.iterator();
149 while (it.hasNext()) {
150 Measurement m=(Measurement) it.next();
151 ret.append("\t");
152 ret.append(m.getValue());
153 ret.append(" <- ");
154 ret.append("\n");
155 }
156 return ret.toString();
157 }
158
159 public int compareTo(Object o) {
160 if (o instanceof Metric) {
161 return Double.compare(((Metric) o).getTotal(), total);
162 }
163
164 return 1;
165 }
166
167 public double getDeviation() {
168 return deviation/measurements;
169 }
170
171 }