in sdk/src/main/java/com/google/cloud/dataflow/sdk/util/CloudCounterUtils.java [55:100]
public static MetricUpdate extractCounter(Counter<?> counter, boolean delta) {
// TODO: Omit no-op counter updates, for counters whose
// values haven't changed since the last time we sent them.
synchronized (counter) {
MetricStructuredName name = new MetricStructuredName();
name.setName(counter.getName());
MetricUpdate metricUpdate = new MetricUpdate()
.setName(name)
.setKind(counter.getKind().name())
.setCumulative(!delta);
switch (counter.getKind()) {
case SUM:
case MAX:
case MIN:
case AND:
case OR:
Object aggregate;
if (delta) {
aggregate = counter.getAndResetDelta();
} else {
aggregate = counter.getAggregate();
}
metricUpdate.setScalar(
CloudObject.forKnownType(aggregate));
break;
case MEAN: {
CounterMean<?> mean;
if (delta) {
mean = counter.getAndResetMeanDelta();
} else {
mean = counter.getMean();
}
if (mean.getCount() <= 0) {
return null;
}
metricUpdate.setMeanSum(
CloudObject.forKnownType(mean.getAggregate()));
metricUpdate.setMeanCount(CloudObject.forKnownType(mean.getCount()));
break;
}
default:
throw new IllegalArgumentException("unexpected kind of counter");
}
return metricUpdate;
}
}