@Override
  public void report(
      final SortedMap<MetricName, Gauge> gauges,
      final SortedMap<MetricName, Counter> counters,
      final SortedMap<MetricName, Histogram> histograms,
      final SortedMap<MetricName, Meter> meters,
      final SortedMap<MetricName, Timer> timers) {
    final long now = System.currentTimeMillis();

    try {
      influxDb.flush();

      for (Map.Entry<MetricName, Gauge> entry : gauges.entrySet()) {
        reportGauge(entry.getKey(), entry.getValue(), now);
      }

      for (Map.Entry<MetricName, Counter> entry : counters.entrySet()) {
        reportCounter(entry.getKey(), entry.getValue(), now);
      }

      for (Map.Entry<MetricName, Histogram> entry : histograms.entrySet()) {
        reportHistogram(entry.getKey(), entry.getValue(), now);
      }

      for (Map.Entry<MetricName, Meter> entry : meters.entrySet()) {
        reportMeter(entry.getKey(), entry.getValue(), now);
      }

      for (Map.Entry<MetricName, Timer> entry : timers.entrySet()) {
        reportTimer(entry.getKey(), entry.getValue(), now);
      }

      if (influxDb.hasSeriesData()) {
        influxDb.writeData();
      }
    } catch (Exception e) {
      LOGGER.warn("Unable to report to InfluxDB. Discarding data.", e);
    }
  }