void publishMetrics(MetricsBuffer buffer) {
   long ts = 0;
   for (MetricsBuffer.Entry entry : buffer) {
     LOG.debug("sourceFilter=" + sourceFilter);
     if (sourceFilter == null || sourceFilter.accepts(entry.name())) {
       for (MetricsRecordImpl record : entry.records()) {
         if ((context == null || context.equals(record.context()))
             && (recordFilter == null || recordFilter.accepts(record))) {
           if (LOG.isDebugEnabled()) {
             LOG.debug(
                 "Pushing record "
                     + entry.name()
                     + "."
                     + record.context()
                     + "."
                     + record.name()
                     + " to "
                     + name);
           }
           sink.putMetrics(
               metricFilter == null ? record : new MetricsRecordFiltered(record, metricFilter));
           if (ts == 0) {
             ts = record.timestamp();
           }
         }
       }
     }
   }
   if (ts > 0) {
     sink.flush();
     latency.add(System.currentTimeMillis() - ts);
   }
   if (buffer instanceof WaitableMetricsBuffer) {
     ((WaitableMetricsBuffer) buffer).notifyAnyWaiters();
   }
   LOG.debug("Done");
 }