code: public void startMetricReporting(Properties properties) {
      if (this.metricsReportingStarted) {
        LOGGER.warn("Metric reporting has already started");
        return;
      }
  
      TimeUnit reportTimeUnit = TimeUnit.MILLISECONDS;
      long reportInterval = Long.parseLong(properties
          .getProperty(ConfigurationKeys.METRICS_REPORT_INTERVAL_KEY, ConfigurationKeys.DEFAULT_METRICS_REPORT_INTERVAL));
      ScheduledReporter.setReportingInterval(properties, reportInterval, reportTimeUnit);
  
      long startTime = System.currentTimeMillis();
  
      try {
        // Build and start the JMX reporter
        buildJmxMetricReporter(properties);
        if (this.jmxReporter.isPresent()) {
          LOGGER.info("Will start reporting metrics to JMX");
          this.jmxReporter.get().start();
        }
  
        // Build all other reporters
        buildFileMetricReporter(properties);
        buildKafkaMetricReporter(properties);
        buildGraphiteMetricReporter(properties);
        buildInfluxDBMetricReporter(properties);
        buildCustomMetricReporters(properties);
        buildFileFailureEventReporter(properties);
  
        // Start reporters that implement org.apache.gobblin.metrics.report.ScheduledReporter
        RootMetricContext.get().startReporting();
  
        // Start reporters that implement com.codahale.metrics.ScheduledReporter
        for (com.codahale.metrics.ScheduledReporter scheduledReporter : this.codahaleScheduledReporters) {
          scheduledReporter.start(reportInterval, reportTimeUnit);
        }
      } catch (Exception e) {
        LOGGER.error("Metrics reporting cannot be started due to {}", ExceptionUtils.getFullStackTrace(e));
        throw e;
      }
  
      this.metricsReportingStarted = true;
      LOGGER.info("Metrics reporting has been started in {} ms: GobblinMetrics {}",
          System.currentTimeMillis() - startTime, this.toString());
    }
docs: Start metric reporting.
  
  @param properties configuration properties