package com.limegroup.gnutella.statistics;
import java.util.HashMap;
import java.util.Map;
import org.limewire.collection.NumericBuffer;
import org.limewire.inspection.Inspectable;
import org.limewire.inspection.InspectionPoint;
import org.limewire.inspection.DataCategory;
import org.limewire.util.ByteUtils;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.limegroup.gnutella.LifecycleManager;
/**
* Keeps track and reports some statistics about local queries.
*/
@Singleton
public class QueryStats {
private NumericBuffer<Long> times = new NumericBuffer<Long>(200);
private final LifecycleManager lifecycleManager;
@Inject
public QueryStats(LifecycleManager lifecycleManager) {
this.lifecycleManager = lifecycleManager;
}
public synchronized void recordQuery() {
times.add(System.currentTimeMillis());
}
public synchronized long getLastQueryTime() {
if (times.isEmpty())
return 0;
return times.first();
}
@InspectionPoint(value = "user query stats v3", category = DataCategory.USAGE)
@SuppressWarnings("unused")
private final Inspectable queryStats = new Inspectable() {
@Override
public Object inspect() {
synchronized(QueryStats.this) {
Map<String, Object> ret = new HashMap<String, Object>();
/*
* version 1 used to send 10 search times in milliseconds
* version 2 used to try to minimize return size
*/
ret.put("ver",3);
byte[] b = new byte[times.getSize() * 4];
for (int i = 0; i < times.getSize(); i++) {
int time = Float.floatToIntBits((times.get(i)-lifecycleManager.getStartFinishedTime()) / 1000f);
ByteUtils.int2beb(time, b, i*4);
}
ret.put("buf",b);
return ret;
}
}
};
}