@Override
  public int drainTo(Collection<? super Runnable> destination, int maxElements) {
    if (destination == this) {
      throw new IllegalArgumentException("A BlockingQueue cannot drain to itself.");
    }
    List<Call> drained = new ArrayList<>();
    underlyingQueue.drainTo(drained, maxElements);
    for (Call r : drained) {
      updateMetrics(r);
    }
    destination.addAll(drained);
    int sz = drained.size();
    LOG.info("Elements drained: " + sz);
    return sz;
  }
A BlockingQueue reports waiting time in queue and queue length to ThriftMetrics.
hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/CallQueue.java