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 }