}
}
}
private Object computeQueueLength(MetricsRequest metricsRequest) {
AggregatesTable aggregatesTable = aggregatesTables.get().get(metricsRequest.getScope());
// process.events.processed will have a tag like "input.queue://PurchaseFlow/reader/queue" which indicates
// where the processed event came from. So first get the aggregate count for events processed and all the
// queues they came from. Next, for all those queues, get the aggregate count for events they wrote,
// and subtract the two to get queue length.
AggregatesScanner scanner = aggregatesTable.scan(metricsRequest.getContextPrefix(),
"process.events.processed",
metricsRequest.getRunId(),
"input");
long processed = 0;
Set<String> streamNames = Sets.newHashSet();
Set<ImmutablePair<String, String>> queueNameContexts = Sets.newHashSet();
while (scanner.hasNext()) {
AggregatesScanResult scanResult = scanner.next();
processed += scanResult.getValue();
// tag is of the form input.[queueURI]. ex: input.queue://PurchaseFlow/reader/queue
String tag = scanResult.getTag();
// strip the preceding "input." from the tag.
QueueName queueName = QueueName.from(URI.create(tag.substring(6, tag.length())));
if (queueName.isStream()) {
streamNames.add(queueName.getSimpleName());
} else if (queueName.isQueue()) {
String context = String.format("%s.f.%s.%s",
queueName.getFirstComponent(), // the app
queueName.getSecondComponent(), // the flow
queueName.getThirdComponent()); // the flowlet
queueNameContexts.add(new ImmutablePair<String, String>(queueName.getSimpleName(), context));
} else {
LOG.warn("unknown type of queue name {} ", queueName.toString());
}
}
// For each queue, get the enqueue aggregate
long enqueue = 0;
for (ImmutablePair<String, String> pair : queueNameContexts) {
// The paths would be /flowId/flowletId/queueSimpleName
enqueue += sumAll(aggregatesTable.scan(pair.getSecond(), "process.events.out", "0", pair.getFirst()));
}
for (String streamName : streamNames) {
enqueue += sumAll(aggregatesTable.scan(Constants.Gateway.METRICS_CONTEXT, "collect.events", "0", streamName));
}
long len = enqueue - processed;
return new AggregateResponse(len >= 0 ? len : 0);
}