/**
   * Since this object is a registered updater, this method will be called periodically, e.g. every
   * 5 seconds.
   */
  public void doUpdates(MetricsContext unused) {
    synchronized (this) {
      metricsRecord.setMetric("maps_running", tt.mapTotal);
      metricsRecord.setMetric("reduces_running", tt.reduceTotal);
      metricsRecord.setMetric("mapTaskSlots", (short) tt.getMaxCurrentMapTasks());
      metricsRecord.setMetric("reduceTaskSlots", (short) tt.getMaxCurrentReduceTasks());
      metricsRecord.incrMetric("tasks_completed", numCompletedTasks);
      metricsRecord.incrMetric("tasks_failed_timeout", timedoutTasks);
      metricsRecord.incrMetric("tasks_failed_ping", tasksFailedPing);

      numCompletedTasks = 0;
      timedoutTasks = 0;
      tasksFailedPing = 0;
    }
    metricsRecord.update();
  }
 /**
  * Push the delta metrics to the mr. The delta is since the last push/interval.
  *
  * <p>Note this does NOT push to JMX (JMX gets the info via {@link #previousIntervalValue}
  *
  * @param mr
  */
 public synchronized void pushMetric(final MetricsRecord mr) {
   intervalHeartBeat();
   try {
     mr.incrMetric(getName(), getPreviousIntervalValue());
   } catch (Exception e) {
     LOG.info("pushMetric failed for " + getName() + "\n", e);
   }
 }