package net.sf.appstatus.services;
public class CallStatistics {
private Long maxResponseTime;
private double avgResponseTime = 0;
private long failures = 0;
private long errors = 0;
private long hits = 0;
private Long minResponseTime;
private double avgNestedCalls = 0;
private int minMaxDelay;
/**
* Because firsts runs are always longer than real times, min and max
* measurements can be delayed until the services is called a few times.
*
* @param minMaxDelay
* number of hits before starting to measure min and max times.
*/
public CallStatistics(int minMaxDelay) {
this.minMaxDelay = minMaxDelay;
}
public Long getMaxResponseTime() {
return maxResponseTime;
}
public double getAvgResponseTime() {
return avgResponseTime;
}
public long getFailures() {
return failures;
}
public long getErrors() {
return errors;
}
public long getHits() {
return hits;
}
public Long getMinResponseTime() {
return minResponseTime;
}
/**
* @return the avgNestedCalls
*/
public double getAvgNestedCalls() {
return avgNestedCalls;
}
public void addCall(Long executionTime, boolean failure, boolean error, int nestedCalls) {
synchronized (this) {
hits++;
if (failure) {
failures++;
}
if (error) {
errors++;
}
if (hits > minMaxDelay) {
if (maxResponseTime == null || maxResponseTime < executionTime) {
maxResponseTime = executionTime;
}
if (minResponseTime == null || minResponseTime > executionTime) {
minResponseTime = executionTime;
}
}
avgResponseTime = (avgResponseTime * (hits - 1) + executionTime) / (hits);
avgNestedCalls = (avgNestedCalls * (hits - 1) + (double) nestedCalls) / hits;
}
}
}