Set the timestamps by using the absolute epoch time in milliseconds
(i.e., ms from the Epoch):
 System.currentTimeMillis()

The previous solution System.nanoTime() starts from a fixed, but
arbitrary time and cannot be used to compare timestamps across
different systems.

For now, the System.currentTimeMillis() granularity should be good enough
for end-to-end measurements.

In the follow-up iterations, if we need breakdown of the execution path
on a single machine, we can utilize System.nanoTime() if necessary.

As part of the update, the names of the timestamp metrics are now updated
to include ".EpochMs" suffix:

"Topology.EventNotification.LastEventTimestamp" ->
"Topology.EventNotification.LastEventTimestamp.EpochMs"

"Intents.AddOperation.BeginOperationTimestamp" ->
"Intents.AddOperation.BeginOperationTimestamp.EpochMs"

"Intents.AddOperation.EndOperationTimestamp" ->
"Intents.AddOperation.EndOperationTimestamp.EpochMs"

"Intents.RemoveOperation.BeginOperationTimestamp" ->
"Intents.RemoveOperation.BeginOperationTimestamp.EpochMs"

"Intents.RemoveOperation.EndOperationTimestamp" ->
"Intents.RemoveOperation.EndOperationTimestamp.EpochMs"

Change-Id: I9ebf067bb8aa8055fd445781213ca741b5df5e74
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyEvents.java b/src/main/java/net/onrc/onos/core/topology/TopologyEvents.java
index 9726269..25efa95 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyEvents.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyEvents.java
@@ -30,7 +30,7 @@
  */
 @JsonSerialize(using = TopologyEventsSerializer.class)
 public final class TopologyEvents {
-    private final long timestamp;       // Topology event timestamp (system ns)
+    private final long timestamp;       // Topology event timestamp (Epoch ms)
     private final Collection<SwitchEvent> addedSwitchEvents;
     private final Collection<SwitchEvent> removedSwitchEvents;
     private final Collection<PortEvent> addedPortEvents;
@@ -43,7 +43,7 @@
     /**
      * Constructor.
      *
-     * @param timestamp the timestamp for the event (system nanoseconds)
+     * @param timestamp the timestamp for the event (Epoch ms)
      * @param addedSwitchEvents the collection of added Switch Events.
      * @param removedSwitchEvents the collection of removed Switch Events.
      * @param addedPortEvents the collection of added Port Events.
@@ -84,9 +84,9 @@
     }
 
     /**
-     * Gets the timestamp for the events (system nanoseconds).
+     * Gets the timestamp for the events (Epoch ms).
      *
-     * @return the timestamp for the events (system nanoseconds).
+     * @return the timestamp for the events (Epoch ms).
      */
     public long getTimestamp() {
         return timestamp;
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
index aeb06c2..dccef16 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
@@ -81,16 +81,16 @@
     private static final MetricsFeature METRICS_FEATURE_EVENT_NOTIFICATION =
         METRICS_COMPONENT.registerFeature("EventNotification");
     //
-    // Timestamp of the last Topology event (system nanoseconds)
-    private volatile long lastEventTimestamp = 0;
-    private final Gauge<Long> gaugeLastEventTimestamp =
+    // Timestamp of the last Topology event (ms from the Epoch)
+    private volatile long lastEventTimestampEpochMs = 0;
+    private final Gauge<Long> gaugeLastEventTimestampEpochMs =
         OnosMetrics.registerMetric(METRICS_COMPONENT,
                                    METRICS_FEATURE_EVENT_NOTIFICATION,
-                                   "LastEventTimestamp",
+                                   "LastEventTimestamp.EpochMs",
                                    new Gauge<Long>() {
                                        @Override
                                        public Long getValue() {
-                                           return lastEventTimestamp;
+                                           return lastEventTimestampEpochMs;
                                        }
                                    });
     // Rate of the Topology events published to the Topology listeners
@@ -506,14 +506,14 @@
             apiAddedLinkEvents.size() + apiRemovedLinkEvents.size() +
             apiAddedHostEvents.size() + apiRemovedHostEvents.size();
         this.listenerEventRate.mark(totalEvents);
-        this.lastEventTimestamp = System.nanoTime();
+        this.lastEventTimestampEpochMs = System.currentTimeMillis();
 
         //
         // Deliver the events
         //
         for (ITopologyListener listener : this.topologyListeners) {
             TopologyEvents events =
-                new TopologyEvents(lastEventTimestamp,
+                new TopologyEvents(lastEventTimestampEpochMs,
                                    kryo.copy(apiAddedSwitchEvents),
                                    kryo.copy(apiRemovedSwitchEvents),
                                    kryo.copy(apiAddedPortEvents),