docs: private void parseTagvRule() {
      if (meta.getTags() == null || meta.getTags().isEmpty()) {
        throw new IllegalStateException(
          "Timeseries meta data was missing tags");
      }
      
      // first, find the tagv UIDMeta we're matching against
      UIDMeta tagv = null;
      for (UIDMeta tag: meta.getTags()) {
        if (tag.getType() == UniqueIdType.TAGV && 
            tag.getName().equals(rule.getField())) {
          tagv = tag;
          break;
        }
      }
      
      if (tagv == null) {
        testMessage("No match on tagv [" + rule.getField() + "] for rule: " + 
            rule);
        return;
      }
      
      // now scan the custom tags for a matching tag name and it's value
      testMessage("Matched tagv [" + rule.getField() + "] for rule: " + 
          rule);
      final Map<String, String> custom = tagv.getCustom();
      if (custom != null && custom.containsKey(rule.getCustomField())) {
        if (custom.get(rule.getCustomField()) == null) {
          throw new IllegalStateException(
              "Value for custom tagv field [" + rule.getCustomField() + 
              "] was null");
        }
        processParsedValue(custom.get(rule.getCustomField()));
        testMessage("Matched custom tag [" + rule.getCustomField() + 
            "] for rule: " + rule);
      } else {
        testMessage("No match on custom tag [" + rule.getCustomField() + 
            "] for rule: " + rule);
        return;
      }
    }