MetricsSourceAdapter(
     String prefix,
     String name,
     String description,
     MetricsSource source,
     Iterable<MetricsTag> injectedTags,
     MetricsFilter recordFilter,
     MetricsFilter metricFilter,
     int jmxCacheTTL) {
   this.prefix = Contracts.checkNotNull(prefix, "prefix");
   this.name = Contracts.checkNotNull(name, "name");
   this.source = Contracts.checkNotNull(source, "source");
   attrCache = new HashMap<String, Attribute>();
   infoBuilder = new MBeanInfoBuilder(name, description);
   this.injectedTags = injectedTags;
   this.recordFilter = recordFilter;
   this.metricFilter = metricFilter;
   this.jmxCacheTTL = Contracts.checkArg(jmxCacheTTL, jmxCacheTTL > 0, "jmxCacheTTL");
 }
  MetricsSinkAdapter(
      String name,
      String description,
      MetricsSink sink,
      String context,
      MetricsFilter sourceFilter,
      MetricsFilter recordFilter,
      MetricsFilter metricFilter,
      int period,
      int queueCapacity,
      int retryDelay,
      float retryBackoff,
      int retryCount) {
    this.name = Contracts.checkNotNull(name, "name");
    this.description = description;
    this.sink = Contracts.checkNotNull(sink, "sink object");
    this.context = context;
    this.sourceFilter = sourceFilter;
    this.recordFilter = recordFilter;
    this.metricFilter = metricFilter;
    this.period = Contracts.checkArg(period, period > 0, "period");
    firstRetryDelay = Contracts.checkArg(retryDelay, retryDelay > 0, "retry delay");
    this.retryBackoff = Contracts.checkArg(retryBackoff, retryBackoff > 1, "backoff factor");
    oobPutTimeout = (long) (firstRetryDelay * Math.pow(retryBackoff, retryCount) * 1000);
    this.retryCount = retryCount;
    this.queue =
        new SinkQueue<MetricsBuffer>(
            Contracts.checkArg(queueCapacity, queueCapacity > 0, "queue capacity"));
    latency =
        registry.newStat("sink." + name + ".latency", "Sink end to end latency", "ops", "time");
    dropped = registry.newCounter("sink." + name + ".dropped", "Dropped updates per sink", 0);
    qsize = registry.newGauge("sink." + name + ".qsize", "Queue size", 0);

    sinkThread =
        new Thread() {
          @Override
          public void run() {
            publishMetricsFromQueue();
          }
        };
    sinkThread.setName(name);
    sinkThread.setDaemon(true);
  }