/**
* galaxy inc.
* meetup client for android
*/
package com.galaxy.picasa.store;
import java.util.ArrayList;
import java.util.List;
import android.os.SystemClock;
import android.util.Log;
/**
*
* @author sihai
*
*/
public class MetricsUtils {
private static final long LOG_DURATION_LIMIT = SystemProperties.getLong("picasasync.metrics.time", 100L);
static Metrics sFreeMetrics = null;
private static final ThreadLocal sMetricsStack = new ThreadLocal() {
protected final Object initialValue() {
return new ArrayList(8);
}
};
public static int begin(String s) {
List arraylist = (List) sMetricsStack.get();
arraylist.add(Metrics.obtain(s));
return arraylist.size();
}
public static void end(int i) {
endWithReport(i, null);
}
public static void endWithReport(int i, String s) {
List arraylist = (List) sMetricsStack.get();
if (i > arraylist.size() || i <= 0) {
Object aobj[] = new Object[2];
aobj[0] = Integer.valueOf(arraylist.size());
aobj[1] = Integer.valueOf(i);
throw new IllegalArgumentException(String.format(
"size: %s, id: %s", aobj));
}
Metrics metrics1;
for (; i < arraylist.size(); metrics1.recycle()) {
metrics1 = (Metrics) arraylist.remove(-1 + arraylist.size());
Log.w("MetricsUtils", (new StringBuilder(
"WARNING: unclosed metrics: ")).append(metrics1.toString())
.toString());
if (!arraylist.isEmpty())
((Metrics) arraylist.get(-1 + arraylist.size()))
.merge(metrics1);
}
Metrics metrics = (Metrics) arraylist.remove(-1 + arraylist.size());
metrics.endTimestamp = SystemClock.elapsedRealtime();
if (Log.isLoggable("MetricsUtils", 3)
&& LOG_DURATION_LIMIT >= 0L
&& metrics.endTimestamp - metrics.startTimestamp >= LOG_DURATION_LIMIT) {
StringBuilder stringbuilder = new StringBuilder();
stringbuilder.append("[").append(metrics.name);
if (metrics.queryResultCount != 0)
stringbuilder.append(" query-result:").append(
metrics.queryResultCount);
if (metrics.updateCount != 0)
stringbuilder.append(" update:").append(metrics.updateCount);
if (metrics.inBytes != 0L)
stringbuilder.append(" in:").append(metrics.inBytes);
if (metrics.outBytes != 0L)
stringbuilder.append(" out:").append(metrics.outBytes);
if (metrics.networkOpDuration > 0L)
stringbuilder.append(" net-time:").append(
metrics.networkOpDuration);
if (metrics.networkOpCount > 1)
stringbuilder.append(" net-op:").append(metrics.networkOpCount);
long l = metrics.endTimestamp - metrics.startTimestamp;
if (l > 0L)
stringbuilder.append(" time:").append(l);
if (s != null)
stringbuilder.append((new StringBuilder(" report:")).append(s)
.toString());
Log.d("MetricsUtils", stringbuilder.append(']').toString());
}
if (!arraylist.isEmpty())
((Metrics) arraylist.get(-1 + arraylist.size())).merge(metrics);
if (s != null && metrics.networkOpCount > 0)
PicasaStoreFacade.broadcastOperationReport(s, metrics.endTimestamp
- metrics.startTimestamp, metrics.networkOpDuration,
metrics.networkOpCount, metrics.outBytes, metrics.inBytes);
metrics.recycle();
}
public static void incrementInBytes(long l) {
ArrayList arraylist = (ArrayList) sMetricsStack.get();
int i = arraylist.size();
if (i > 0) {
Metrics metrics = (Metrics) arraylist.get(i - 1);
metrics.inBytes = l + metrics.inBytes;
}
}
public static void incrementNetworkOpCount(long l) {
List arraylist = (List) sMetricsStack.get();
int i = arraylist.size();
if (i > 0) {
Metrics metrics = (Metrics) arraylist.get(i - 1);
metrics.networkOpCount = (int) (1L + (long) metrics.networkOpCount);
}
}
public static void incrementNetworkOpDuration(long l) {
List arraylist = (List) sMetricsStack.get();
int i = arraylist.size();
if (i > 0) {
Metrics metrics = (Metrics) arraylist.get(i - 1);
metrics.networkOpDuration = l + metrics.networkOpDuration;
}
}
public static void incrementNetworkOpDurationAndCount(long l) {
List arraylist = (List) sMetricsStack.get();
int i = arraylist.size();
if (i > 0) {
Metrics metrics = (Metrics) arraylist.get(i - 1);
metrics.networkOpDuration = l + metrics.networkOpDuration;
metrics.networkOpCount = 1 + metrics.networkOpCount;
}
}
public static void incrementOutBytes(long l) {
List arraylist = (List) sMetricsStack.get();
int i = arraylist.size();
if (i > 0) {
Metrics metrics = (Metrics) arraylist.get(i - 1);
metrics.outBytes = l + metrics.outBytes;
}
}
public static void incrementQueryResultCount(int i) {
List arraylist = (List) sMetricsStack.get();
int j = arraylist.size();
if (j > 0) {
Metrics metrics = (Metrics) arraylist.get(j - 1);
metrics.queryResultCount = i + metrics.queryResultCount;
}
}
private static final class Metrics {
public long endTimestamp;
public long inBytes;
public String name;
public int networkOpCount;
public long networkOpDuration;
public Metrics nextFree;
public long outBytes;
public int queryResultCount;
public long startTimestamp;
public int updateCount;
private Metrics() {
}
public static synchronized Metrics obtain(String s) {
Metrics metrics;
metrics = MetricsUtils.sFreeMetrics;
if (metrics != null)
MetricsUtils.sFreeMetrics = metrics.nextFree;
else
metrics = new Metrics();
metrics.name = s;
metrics.startTimestamp = SystemClock.elapsedRealtime();
return metrics;
}
private static synchronized void recycle(Metrics metrics){
metrics.nextFree = MetricsUtils.sFreeMetrics;
MetricsUtils.sFreeMetrics = metrics;
}
public final void merge(Metrics metrics) {
queryResultCount = queryResultCount + metrics.queryResultCount;
updateCount = updateCount + metrics.updateCount;
inBytes = inBytes + metrics.inBytes;
outBytes = outBytes + metrics.outBytes;
networkOpDuration = networkOpDuration + metrics.networkOpDuration;
networkOpCount = networkOpCount + metrics.networkOpCount;
}
public final void recycle() {
name = null;
queryResultCount = 0;
updateCount = 0;
inBytes = 0L;
outBytes = 0L;
networkOpDuration = 0L;
networkOpCount = 0;
recycle(this);
}
}
}