@Override
    public void run() {
      double percentile = routerConfig.routerLatencyToleranceQuantile * 100;
      for (Map.Entry<Resource, CachedHistogram> resourceToHistogram : getBlobLocalDcResourceToLatency.entrySet()) {
        Resource resource = resourceToHistogram.getKey();
        CachedHistogram histogram = resourceToHistogram.getValue();
        logger.debug("{} GetBlob local DC latency histogram {}th percentile in ms: {}", resource.toString(), percentile,
            histogram.getCachedValue());
      }
      for (Map.Entry<Resource, CachedHistogram> resourceToHistogram : getBlobCrossDcResourceToLatency.entrySet()) {
        Resource resource = resourceToHistogram.getKey();
        CachedHistogram histogram = resourceToHistogram.getValue();
        logger.trace("{} GetBlob cross DC latency histogram {}th percentile in ms: {}", resource.toString(), percentile,
            histogram.getCachedValue());
      }
      for (Map.Entry<Resource, CachedHistogram> resourceToHistogram : getBlobInfoLocalDcResourceToLatency.entrySet()) {
        Resource resource = resourceToHistogram.getKey();
        CachedHistogram histogram = resourceToHistogram.getValue();
        logger.debug("{} GetBlobInfo local DC latency histogram {}th percentile in ms: {}", resource.toString(),
            percentile, histogram.getCachedValue());
      }
      for (Map.Entry<Resource, CachedHistogram> resourceToHistogram : getBlobInfoCrossDcResourceToLatency.entrySet()) {
        Resource resource = resourceToHistogram.getKey();
        CachedHistogram histogram = resourceToHistogram.getValue();
        logger.trace("{} GetBlobInfo cross DC latency histogram {}th percentile in ms: {}", resource.toString(),
            percentile, histogram.getCachedValue());
      }
    }
A thread that helps periodically dump resource-level histogram (with given percentile) into log file.
ambry-router/src/main/java/com/github/ambry/router/NonBlockingRouterMetrics.java