diff --git a/azkaban-common/src/main/java/azkaban/metric/AbstractMetric.java b/azkaban-common/src/main/java/azkaban/metric/AbstractMetric.java
index 755cd57..fcce205 100644
--- a/azkaban-common/src/main/java/azkaban/metric/AbstractMetric.java
+++ b/azkaban-common/src/main/java/azkaban/metric/AbstractMetric.java
@@ -22,7 +22,7 @@ import org.apache.log4j.Logger;
* Abstract class for Metric
* @param <T> Type of Value of a given metric
*/
-public abstract class AbstractMetric<T> implements IMetric<T> {
+public abstract class AbstractMetric<T> implements IMetric<T>, Cloneable{
protected static final Logger logger = Logger.getLogger(MetricReportManager.class);
protected String name;
protected T value;
@@ -84,9 +84,11 @@ public abstract class AbstractMetric<T> implements IMetric<T> {
public synchronized void notifyManager() {
logger.debug(String.format("Notifying Manager for %s", this.getClass().getName()));
try {
- metricManager.reportMetric(this);
+ metricManager.reportMetric( (IMetric<?>) this.clone());
} catch (NullPointerException ex) {
logger.error(String.format("Metric Manager is not set for %s metric %s", this.getClass().getName(), ex.toString()));
+ } catch (CloneNotSupportedException ex) {
+ logger.error(String.format("Failed to take snapshot for %s metric %s", this.getClass().getName(), ex.toString()));
}
}
}
diff --git a/azkaban-common/src/main/java/azkaban/metric/TimeBasedReportingMetric.java b/azkaban-common/src/main/java/azkaban/metric/TimeBasedReportingMetric.java
index db6db1b..69c23ec 100644
--- a/azkaban-common/src/main/java/azkaban/metric/TimeBasedReportingMetric.java
+++ b/azkaban-common/src/main/java/azkaban/metric/TimeBasedReportingMetric.java
@@ -45,12 +45,15 @@ public abstract class TimeBasedReportingMetric<T> extends AbstractMetric<T> {
* @return An anonymous TimerTask class
*/
private TimerTask getTimerTask() {
+ final TimeBasedReportingMetric<T> lockObject = this;
TimerTask recurringReporting = new TimerTask() {
@Override
public void run() {
- preTrackingEventMethod();
- notifyManager();
- postTrackingEventMethod();
+ synchronized (lockObject) {
+ preTrackingEventMethod();
+ notifyManager();
+ postTrackingEventMethod();
+ }
}
};
return recurringReporting;