docs: private Deferred<Object> resolveMetric() {
      if (metric == null || metric.isEmpty()) {
        throw new IllegalArgumentException("The metric cannot be empty");
      }
      if (tags == null) {
        throw new IllegalArgumentException("Tags cannot be null or empty "
            + "when getting a TSUID");
      }
      
      class TagsCB implements Callback<Object, ArrayList<byte[]>> {
        @Override
        public Object call(final ArrayList<byte[]> tag_list) throws Exception {
          setTagUIDs(tag_list);
          return null;
        }
        @Override
        public String toString() {
          return "Tag resolution callback";
        }
      }
      
      class MetricCB implements Callback<Deferred<Object>, byte[]> {
        @Override
        public Deferred<Object> call(final byte[] uid) 
            throws Exception {
          setMetricUID(uid);
          if (tags.isEmpty()) {
            setTagUIDs(new ArrayList<byte[]>(0));
            return null;
          }
          return Tags.resolveAllAsync(tsdb, tags).addCallback(new TagsCB());
        }
        @Override
        public String toString() {
          return "Metric resolution callback";
        }
      }
      
      return tsdb.getUIDAsync(UniqueIdType.METRIC, metric)
          .addCallbackDeferring(new MetricCB());
    }