You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by av...@apache.org on 2018/04/01 19:14:04 UTC

[ambari] 08/39: AMBARI-21214 : Use a uuid vs long row key for metrics in AMS schema. (avijayan)

This is an automated email from the ASF dual-hosted git repository.

avijayan pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git

commit 46c0af89a17021b45b14bc4b6c184d58f05405cf
Author: Aravindan Vijayan <av...@hortonworks.com>
AuthorDate: Mon Jun 19 10:55:44 2017 -0700

    AMBARI-21214 : Use a uuid vs long row key for metrics in AMS schema. (avijayan)
---
 .../sink/timeline/SingleValuedTimelineMetric.java  |    9 +-
 .../metrics2/sink/timeline/TimelineMetric.java     |    8 +
 .../sink/timeline/TimelineMetricMetadata.java      |   37 +-
 .../timeline/HBaseTimelineMetricsService.java      |   61 +-
 .../metrics/timeline/PhoenixHBaseAccessor.java     |  178 ++-
 .../timeline/TimelineMetricConfiguration.java      |    5 +
 .../metrics/timeline/TimelineMetricStore.java      |   12 +-
 .../metrics/timeline/TimelineMetricsFilter.java    |    7 -
 .../aggregators/AbstractTimelineAggregator.java    |   45 +-
 .../aggregators/TimelineClusterMetric.java         |    6 +-
 .../TimelineMetricAggregatorFactory.java           |   12 +
 .../aggregators/TimelineMetricAppAggregator.java   |   28 +-
 .../TimelineMetricClusterAggregator.java           |    9 +-
 .../TimelineMetricClusterAggregatorSecond.java     |   30 +-
 .../aggregators/TimelineMetricHostAggregator.java  |   10 +-
 .../aggregators/TimelineMetricReadHelper.java      |   61 +-
 .../TimelineMetricHostMetadata.java}               |   63 +-
 .../discovery/TimelineMetricMetadataKey.java       |   26 +-
 .../discovery/TimelineMetricMetadataManager.java   |  290 +++-
 .../discovery/TimelineMetricMetadataSync.java      |   18 +-
 .../metrics/timeline/query/Condition.java          |    1 +
 .../metrics/timeline/query/ConditionBuilder.java   |   10 +-
 .../metrics/timeline/query/DefaultCondition.java   |   60 +-
 .../metrics/timeline/query/EmptyCondition.java     |    5 +
 .../metrics/timeline/query/PhoenixTransactSQL.java |  279 +---
 .../query/SplitByMetricNamesCondition.java         |   40 +-
 .../metrics/timeline/query/TopNCondition.java      |   63 +-
 .../timeline/uuid/HashBasedUuidGenStrategy.java    |  202 +++
 .../timeline/uuid/MetricUuidGenStrategy.java       |   49 +
 .../timeline/uuid/RandomUuidGenStrategy.java       |   53 +
 .../webapp/TimelineWebServices.java                |   17 +
 .../main/resources/metrics_def/AMBARI_SERVER.dat   |   40 +
 .../resources/metrics_def/JOBHISTORYSERVER.dat     |   58 +
 .../main/resources/metrics_def/MASTER_HBASE.dat    |  230 ++-
 .../src/main/resources/metrics_def/SLAVE_HBASE.dat |  700 +++++++--
 .../metrics/timeline/ITPhoenixHBaseAccessor.java   |    6 +-
 .../metrics/timeline/MetricTestHelper.java         |    2 +-
 .../metrics/timeline/PhoenixHBaseAccessorTest.java |   10 +-
 .../metrics/timeline/TestPhoenixTransactSQL.java   |  105 +-
 .../metrics/timeline/TestTimelineMetricStore.java  |    9 +-
 .../TimelineMetricsAggregatorMemorySink.java       |    4 +-
 .../timeline/aggregators/DownSamplerTest.java      |    2 +
 .../timeline/aggregators/ITClusterAggregator.java  |   15 +-
 .../timeline/aggregators/ITMetricAggregator.java   |    8 +-
 .../TimelineMetricClusterAggregatorSecondTest.java |   65 +-
 .../timeline/discovery/TestMetadataManager.java    |  173 ++-
 .../timeline/discovery/TestMetadataSync.java       |   32 +-
 .../uuid/TimelineMetricUuidManagerTest.java        |  184 +++
 .../test/resources/test_data/full_whitelist.dat    | 1615 ++++++++++++++++++++
 49 files changed, 4050 insertions(+), 902 deletions(-)

diff --git a/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/SingleValuedTimelineMetric.java b/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/SingleValuedTimelineMetric.java
index 8ecca54..4bb9355 100644
--- a/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/SingleValuedTimelineMetric.java
+++ b/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/SingleValuedTimelineMetric.java
@@ -30,7 +30,6 @@ public class SingleValuedTimelineMetric {
   private String instanceId;
   private String hostName;
   private Long startTime;
-  private String type;
 
   public void setSingleTimeseriesValue(Long timestamp, Double value) {
     this.timestamp = timestamp;
@@ -39,14 +38,13 @@ public class SingleValuedTimelineMetric {
 
   public SingleValuedTimelineMetric(String metricName, String appId,
                                     String instanceId, String hostName,
-                                    long timestamp, long startTime, String type) {
+                                    long timestamp, long startTime) {
     this.metricName = metricName;
     this.appId = appId;
     this.instanceId = instanceId;
     this.hostName = hostName;
     this.timestamp = timestamp;
     this.startTime = startTime;
-    this.type = type;
   }
 
   public Long getTimestamp() {
@@ -57,10 +55,6 @@ public class SingleValuedTimelineMetric {
     return startTime;
   }
 
-  public String getType() {
-    return type;
-  }
-
   public Double getValue() {
     return value;
   }
@@ -97,7 +91,6 @@ public class SingleValuedTimelineMetric {
     metric.setMetricName(this.metricName);
     metric.setAppId(this.appId);
     metric.setHostName(this.hostName);
-    metric.setType(this.type);
     metric.setInstanceId(this.instanceId);
     metric.setStartTime(this.startTime);
     metric.setTimestamp(this.timestamp);
diff --git a/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetric.java b/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetric.java
index edace52..3d3b19c 100644
--- a/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetric.java
+++ b/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetric.java
@@ -52,6 +52,14 @@ public class TimelineMetric implements Comparable<TimelineMetric> {
 
   }
 
+  // To reconstruct TimelineMetric from UUID.
+  public TimelineMetric(String metricName, String hostname, String appId, String instanceId) {
+    this.metricName = metricName;
+    this.hostName = hostname;
+    this.appId = appId;
+    this.instanceId = instanceId;
+  }
+
   // copy constructor
   public TimelineMetric(TimelineMetric metric) {
     setMetricName(metric.getMetricName());
diff --git a/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetricMetadata.java b/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetricMetadata.java
index 727becc..6c9712f 100644
--- a/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetricMetadata.java
+++ b/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/TimelineMetricMetadata.java
@@ -17,6 +17,8 @@
  */
 package org.apache.hadoop.metrics2.sink.timeline;
 
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.classification.InterfaceStability;
 import org.codehaus.jackson.annotate.JsonIgnore;
@@ -32,6 +34,8 @@ import javax.xml.bind.annotation.XmlRootElement;
 public class TimelineMetricMetadata {
   private String metricName;
   private String appId;
+  private String instanceId;
+  private byte[] uuid;
   private String units;
   private String type = "UNDEFINED";
   private Long seriesStartTime;
@@ -51,11 +55,12 @@ public class TimelineMetricMetadata {
   public TimelineMetricMetadata() {
   }
 
-  public TimelineMetricMetadata(String metricName, String appId, String units,
+  public TimelineMetricMetadata(String metricName, String appId, String instanceId, String units,
                                 String type, Long seriesStartTime,
                                 boolean supportsAggregates, boolean isWhitelisted) {
     this.metricName = metricName;
     this.appId = appId;
+    this.instanceId = instanceId;
     this.units = units;
     this.type = type;
     this.seriesStartTime = seriesStartTime;
@@ -82,6 +87,24 @@ public class TimelineMetricMetadata {
     this.appId = appId;
   }
 
+  @XmlElement(name = "instanceId")
+  public String getInstanceId() {
+    return instanceId;
+  }
+
+  public void setInstanceId(String instanceId) {
+    this.instanceId = instanceId;
+  }
+
+  @XmlElement(name = "uuid")
+  public byte[] getUuid() {
+    return uuid;
+  }
+
+  public void setUuid(byte[] uuid) {
+    this.uuid = uuid;
+  }
+
   @XmlElement(name = "units")
   public String getUnits() {
     return units;
@@ -102,7 +125,7 @@ public class TimelineMetricMetadata {
 
   @XmlElement(name = "seriesStartTime")
   public Long getSeriesStartTime() {
-    return seriesStartTime;
+    return (seriesStartTime != null) ? seriesStartTime : 0l;
   }
 
   public void setSeriesStartTime(Long seriesStartTime) {
@@ -138,9 +161,10 @@ public class TimelineMetricMetadata {
    */
   public boolean needsToBeSynced(TimelineMetricMetadata metadata) throws MetadataException {
     if (!this.metricName.equals(metadata.getMetricName()) ||
-        !this.appId.equals(metadata.getAppId())) {
+        !this.appId.equals(metadata.getAppId()) ||
+      !(StringUtils.isNotEmpty(instanceId) ? instanceId.equals(metadata.instanceId) : StringUtils.isEmpty(metadata.instanceId))) {
       throw new MetadataException("Unexpected argument: metricName = " +
-        metadata.getMetricName() + ", appId = " + metadata.getAppId());
+        metadata.getMetricName() + ", appId = " + metadata.getAppId() + ", instanceId = " + metadata.getInstanceId());
     }
 
     // Series start time should never change
@@ -159,14 +183,15 @@ public class TimelineMetricMetadata {
     TimelineMetricMetadata that = (TimelineMetricMetadata) o;
 
     if (!metricName.equals(that.metricName)) return false;
-    return !(appId != null ? !appId.equals(that.appId) : that.appId != null);
-
+    if (!appId.equals(that.appId)) return false;
+    return (StringUtils.isNotEmpty(instanceId) ? instanceId.equals(that.instanceId) : StringUtils.isEmpty(that.instanceId));
   }
 
   @Override
   public int hashCode() {
     int result = metricName.hashCode();
     result = 31 * result + (appId != null ? appId.hashCode() : 0);
+    result = 31 * result + (instanceId != null ? instanceId.hashCode() : 0);
     return result;
   }
 }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/HBaseTimelineMetricsService.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/HBaseTimelineMetricsService.java
index 1ba01bc..2d890c0 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/HBaseTimelineMetricsService.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/HBaseTimelineMetricsService.java
@@ -19,7 +19,6 @@ package org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline
 
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Multimap;
-import org.apache.ambari.metrics.alertservice.spark.AmsKafkaProducer;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
@@ -41,15 +40,16 @@ import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.aggregators.TimelineMetricAggregatorFactory;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.availability.AggregationTaskRunner.AGGREGATOR_NAME;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.availability.MetricCollectorHAController;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery.TimelineMetricHostMetadata;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery.TimelineMetricMetadataKey;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery.TimelineMetricMetadataManager;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.function.SeriesAggregateFunction;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.function.TimelineMetricsSeriesAggregateFunction;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.function.TimelineMetricsSeriesAggregateFunctionFactory;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.query.Condition;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.query.ConditionBuilder;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.query.PhoenixTransactSQL;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.query.TopNCondition;
-import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.function.SeriesAggregateFunction;
-import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.function.TimelineMetricsSeriesAggregateFunction;
-import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.function.TimelineMetricsSeriesAggregateFunctionFactory;
 
 import java.io.IOException;
 import java.net.MalformedURLException;
@@ -64,11 +64,14 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.*;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
 
+import static org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.TimelineMetricConfiguration.DEFAULT_TOPN_HOSTS_LIMIT;
 import static org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.TimelineMetricConfiguration.TIMELINE_METRICS_HOST_INMEMORY_AGGREGATION;
 import static org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.TimelineMetricConfiguration.USE_GROUPBY_AGGREGATOR_QUERIES;
-import static org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.TimelineMetricConfiguration.DEFAULT_TOPN_HOSTS_LIMIT;
 import static org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.availability.AggregationTaskRunner.ACTUAL_AGGREGATOR_NAMES;
 
 public class HBaseTimelineMetricsService extends AbstractService implements TimelineMetricStore {
@@ -83,7 +86,7 @@ public class HBaseTimelineMetricsService extends AbstractService implements Time
   private Integer defaultTopNHostsLimit;
   private MetricCollectorHAController haController;
   private boolean containerMetricsDisabled = false;
-  private AmsKafkaProducer kafkaProducer;
+
   /**
    * Construct the service.
    *
@@ -143,8 +146,6 @@ public class HBaseTimelineMetricsService extends AbstractService implements Time
         LOG.info("Using group by aggregators for aggregating host and cluster metrics.");
       }
 
-      kafkaProducer = new AmsKafkaProducer(metricsConf.get("kafka.bootstrap.servers")); //104.196.85.21:6667
-
       // Start the cluster aggregator second
       TimelineMetricAggregator secondClusterAggregator =
         TimelineMetricAggregatorFactory.createTimelineClusterAggregatorSecond(
@@ -154,19 +155,19 @@ public class HBaseTimelineMetricsService extends AbstractService implements Time
       // Start the minute cluster aggregator
       TimelineMetricAggregator minuteClusterAggregator =
         TimelineMetricAggregatorFactory.createTimelineClusterAggregatorMinute(
-          hBaseAccessor, metricsConf, haController);
+          hBaseAccessor, metricsConf, metricMetadataManager, haController);
       scheduleAggregatorThread(minuteClusterAggregator);
 
       // Start the hourly cluster aggregator
       TimelineMetricAggregator hourlyClusterAggregator =
         TimelineMetricAggregatorFactory.createTimelineClusterAggregatorHourly(
-          hBaseAccessor, metricsConf, haController);
+          hBaseAccessor, metricsConf, metricMetadataManager, haController);
       scheduleAggregatorThread(hourlyClusterAggregator);
 
       // Start the daily cluster aggregator
       TimelineMetricAggregator dailyClusterAggregator =
         TimelineMetricAggregatorFactory.createTimelineClusterAggregatorDaily(
-          hBaseAccessor, metricsConf, haController);
+          hBaseAccessor, metricsConf, metricMetadataManager, haController);
       scheduleAggregatorThread(dailyClusterAggregator);
 
       // Start the minute host aggregator
@@ -175,20 +176,20 @@ public class HBaseTimelineMetricsService extends AbstractService implements Time
       } else {
         TimelineMetricAggregator minuteHostAggregator =
           TimelineMetricAggregatorFactory.createTimelineMetricAggregatorMinute(
-            hBaseAccessor, metricsConf, haController);
+            hBaseAccessor, metricsConf, metricMetadataManager, haController);
         scheduleAggregatorThread(minuteHostAggregator);
       }
 
       // Start the hourly host aggregator
       TimelineMetricAggregator hourlyHostAggregator =
         TimelineMetricAggregatorFactory.createTimelineMetricAggregatorHourly(
-          hBaseAccessor, metricsConf, haController);
+          hBaseAccessor, metricsConf, metricMetadataManager, haController);
       scheduleAggregatorThread(hourlyHostAggregator);
 
       // Start the daily host aggregator
       TimelineMetricAggregator dailyHostAggregator =
         TimelineMetricAggregatorFactory.createTimelineMetricAggregatorDaily(
-          hBaseAccessor, metricsConf, haController);
+          hBaseAccessor, metricsConf, metricMetadataManager, haController);
       scheduleAggregatorThread(dailyHostAggregator);
 
       if (!configuration.isTimelineMetricsServiceWatcherDisabled()) {
@@ -238,6 +239,8 @@ public class HBaseTimelineMetricsService extends AbstractService implements Time
     Multimap<String, List<Function>> metricFunctions =
       parseMetricNamesToAggregationFunctions(metricNames);
 
+    List<byte[]> uuids = metricMetadataManager.getUuids(metricFunctions.keySet(), hostnames, applicationId, instanceId);
+
     ConditionBuilder conditionBuilder = new ConditionBuilder(new ArrayList<String>(metricFunctions.keySet()))
       .hostnames(hostnames)
       .appId(applicationId)
@@ -246,7 +249,8 @@ public class HBaseTimelineMetricsService extends AbstractService implements Time
       .endTime(endTime)
       .precision(precision)
       .limit(limit)
-      .grouped(groupedByHosts);
+      .grouped(groupedByHosts)
+      .uuid(uuids);
 
     if (topNConfig != null) {
       if (TopNCondition.isTopNHostCondition(metricNames, hostnames) ^ //Only 1 condition should be true.
@@ -372,13 +376,6 @@ public class HBaseTimelineMetricsService extends AbstractService implements Time
     // Error indicated by the Sql exception
     TimelinePutResponse response = new TimelinePutResponse();
 
-    try {
-      if (!metrics.getMetrics().isEmpty() && metrics.getMetrics().get(0).getAppId().equals("HOST")) {
-        kafkaProducer.sendMetrics(fromTimelineMetrics(metrics));
-      }
-    } catch (InterruptedException | ExecutionException e) {
-      LOG.error(e);
-    }
     hBaseAccessor.insertMetricRecordsWithMetadata(metricMetadataManager, metrics, false);
 
     return response;
@@ -449,8 +446,18 @@ public class HBaseTimelineMetricsService extends AbstractService implements Time
   }
 
   @Override
+  public Map<String, TimelineMetricMetadataKey> getUuids() throws SQLException, IOException {
+    return metricMetadataManager.getUuidKeyMap();
+  }
+
+  @Override
   public Map<String, Set<String>> getHostAppsMetadata() throws SQLException, IOException {
-    return metricMetadataManager.getHostedAppsCache();
+    Map<String, TimelineMetricHostMetadata> hostsMetadata = metricMetadataManager.getHostedAppsCache();
+    Map<String, Set<String>> hostAppMap = new HashMap<>();
+    for (String hostname : hostsMetadata.keySet()) {
+      hostAppMap.put(hostname, hostsMetadata.get(hostname).getHostedApps());
+    }
+    return hostAppMap;
   }
 
   @Override
@@ -469,7 +476,7 @@ public class HBaseTimelineMetricsService extends AbstractService implements Time
   public Map<String, Map<String,Set<String>>> getInstanceHostsMetadata(String instanceId, String appId)
           throws SQLException, IOException {
 
-    Map<String, Set<String>> hostedApps = metricMetadataManager.getHostedAppsCache();
+    Map<String, TimelineMetricHostMetadata> hostedApps = metricMetadataManager.getHostedAppsCache();
     Map<String, Set<String>> instanceHosts = new HashMap<>();
     if (configuration.getTimelineMetricsMultipleClusterSupport()) {
       instanceHosts = metricMetadataManager.getHostedInstanceCache();
@@ -480,7 +487,7 @@ public class HBaseTimelineMetricsService extends AbstractService implements Time
     if (MapUtils.isEmpty(instanceHosts)) {
       Map<String, Set<String>> appHostMap = new HashMap<String, Set<String>>();
       for (String host : hostedApps.keySet()) {
-        for (String app : hostedApps.get(host)) {
+        for (String app : hostedApps.get(host).getHostedApps()) {
           if (!appHostMap.containsKey(app)) {
             appHostMap.put(app, new HashSet<String>());
           }
@@ -499,7 +506,7 @@ public class HBaseTimelineMetricsService extends AbstractService implements Time
 
         Set<String> hostsWithInstance = instanceHosts.get(instance);
         for (String host : hostsWithInstance) {
-          for (String app : hostedApps.get(host)) {
+          for (String app : hostedApps.get(host).getHostedApps()) {
             if (StringUtils.isNotEmpty(appId) && !app.equals(appId)) {
               continue;
             }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/PhoenixHBaseAccessor.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/PhoenixHBaseAccessor.java
index bab6bb2..0c1e979 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/PhoenixHBaseAccessor.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/PhoenixHBaseAccessor.java
@@ -132,6 +132,7 @@ import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.aggregators.Function;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.aggregators.TimelineClusterMetric;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.aggregators.TimelineMetricReadHelper;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery.TimelineMetricHostMetadata;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery.TimelineMetricMetadataKey;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery.TimelineMetricMetadataManager;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.query.Condition;
@@ -171,7 +172,7 @@ public class PhoenixHBaseAccessor {
   private static final int POINTS_PER_MINUTE = 6;
   public static int RESULTSET_LIMIT = (int)TimeUnit.HOURS.toMinutes(2) * METRICS_PER_MINUTE * POINTS_PER_MINUTE ;
 
-  static final TimelineMetricReadHelper TIMELINE_METRIC_READ_HELPER = new TimelineMetricReadHelper();
+  static TimelineMetricReadHelper TIMELINE_METRIC_READ_HELPER = new TimelineMetricReadHelper();
   static ObjectMapper mapper = new ObjectMapper();
   static TypeReference<TreeMap<Long, Double>> metricValuesTypeRef = new TypeReference<TreeMap<Long, Double>>() {};
 
@@ -190,6 +191,7 @@ public class PhoenixHBaseAccessor {
   private final boolean skipBlockCacheForAggregatorsEnabled;
   private final String timelineMetricsTablesDurability;
   private final String timelineMetricsPrecisionTableDurability;
+  private TimelineMetricMetadataManager metadataManagerInstance;
 
   static final String HSTORE_COMPACTION_CLASS_KEY =
     "hbase.hstore.defaultengine.compactionpolicy.class";
@@ -282,6 +284,7 @@ public class PhoenixHBaseAccessor {
       }
       rawMetricsSource = internalSourceProvider.getInternalMetricsSource(RAW_METRICS, interval, rawMetricsSink);
     }
+    TIMELINE_METRIC_READ_HELPER = new TimelineMetricReadHelper(this.metadataManagerInstance);
   }
 
   public boolean isInsertCacheEmpty() {
@@ -336,19 +339,20 @@ public class PhoenixHBaseAccessor {
           double[] aggregates = AggregatorUtils.calculateAggregates(
                   metric.getMetricValues());
 
-          metricRecordStmt.setString(1, metric.getMetricName());
-          metricRecordStmt.setString(2, metric.getHostName());
-          metricRecordStmt.setString(3, metric.getAppId());
-          metricRecordStmt.setString(4, metric.getInstanceId());
-          metricRecordStmt.setLong(5, currentTime);
-          metricRecordStmt.setLong(6, metric.getStartTime());
-          metricRecordStmt.setString(7, metric.getUnits());
-          metricRecordStmt.setDouble(8, aggregates[0]);
-          metricRecordStmt.setDouble(9, aggregates[1]);
-          metricRecordStmt.setDouble(10, aggregates[2]);
-          metricRecordStmt.setLong(11, (long) aggregates[3]);
+          byte[] uuid = metadataManagerInstance.getUuid(metric);
+          if (uuid == null) {
+            LOG.error("Error computing UUID for metric. Cannot write metrics : " + metric.toString());
+            continue;
+          }
+          metricRecordStmt.setBytes(1, uuid);
+          metricRecordStmt.setLong(2, currentTime);
+          metricRecordStmt.setLong(3, metric.getStartTime());
+          metricRecordStmt.setDouble(4, aggregates[0]);
+          metricRecordStmt.setDouble(5, aggregates[1]);
+          metricRecordStmt.setDouble(6, aggregates[2]);
+          metricRecordStmt.setLong(7, (long) aggregates[3]);
           String json = TimelineUtils.dumpTimelineRecordtoJSON(metric.getMetricValues());
-          metricRecordStmt.setString(12, json);
+          metricRecordStmt.setString(8, json);
 
           try {
             metricRecordStmt.executeUpdate();
@@ -477,20 +481,12 @@ public class PhoenixHBaseAccessor {
       // Host level
       String precisionSql = String.format(CREATE_METRICS_TABLE_SQL,
         encoding, tableTTL.get(METRICS_RECORD_TABLE_NAME), compression);
-      String splitPoints = metricsConf.get(PRECISION_TABLE_SPLIT_POINTS);
-      if (!StringUtils.isEmpty(splitPoints)) {
-        precisionSql += getSplitPointsStr(splitPoints);
-      }
       stmt.executeUpdate(precisionSql);
 
       String hostMinuteAggregrateSql = String.format(CREATE_METRICS_AGGREGATE_TABLE_SQL,
         METRICS_AGGREGATE_MINUTE_TABLE_NAME, encoding,
         tableTTL.get(METRICS_AGGREGATE_MINUTE_TABLE_NAME),
         compression);
-      splitPoints = metricsConf.get(AGGREGATE_TABLE_SPLIT_POINTS);
-      if (!StringUtils.isEmpty(splitPoints)) {
-        hostMinuteAggregrateSql += getSplitPointsStr(splitPoints);
-      }
       stmt.executeUpdate(hostMinuteAggregrateSql);
 
       stmt.executeUpdate(String.format(CREATE_METRICS_AGGREGATE_TABLE_SQL,
@@ -507,10 +503,7 @@ public class PhoenixHBaseAccessor {
         METRICS_CLUSTER_AGGREGATE_TABLE_NAME, encoding,
         tableTTL.get(METRICS_CLUSTER_AGGREGATE_TABLE_NAME),
         compression);
-      splitPoints = metricsConf.get(AGGREGATE_TABLE_SPLIT_POINTS);
-      if (!StringUtils.isEmpty(splitPoints)) {
-        aggregateSql += getSplitPointsStr(splitPoints);
-      }
+
       stmt.executeUpdate(aggregateSql);
       stmt.executeUpdate(String.format(CREATE_METRICS_CLUSTER_AGGREGATE_GROUPED_TABLE_SQL,
         METRICS_CLUSTER_AGGREGATE_MINUTE_TABLE_NAME, encoding,
@@ -961,7 +954,8 @@ public class PhoenixHBaseAccessor {
   private void appendMetricFromResultSet(TimelineMetrics metrics, Condition condition,
                                          Multimap<String, List<Function>> metricFunctions,
                                          ResultSet rs) throws SQLException, IOException {
-    String metricName = rs.getString("METRIC_NAME");
+    byte[] uuid = rs.getBytes("UUID");
+    String metricName = metadataManagerInstance.getMetricNameFromUuid(uuid);
     Collection<List<Function>> functionList = findMetricFunctions(metricFunctions, metricName);
 
     for (List<Function> functions : functionList) {
@@ -1103,7 +1097,8 @@ public class PhoenixHBaseAccessor {
       Condition condition, Multimap<String, List<Function>> metricFunctions,
       ResultSet rs) throws SQLException {
 
-    String metricName = rs.getString("METRIC_NAME");
+    byte[] uuid = rs.getBytes("UUID");
+    String metricName = metadataManagerInstance.getMetricNameFromUuid(uuid);
     Collection<List<Function>> functionList = findMetricFunctions(metricFunctions, metricName);
 
     for (List<Function> functions : functionList) {
@@ -1136,14 +1131,15 @@ public class PhoenixHBaseAccessor {
     SplitByMetricNamesCondition splitCondition =
       new SplitByMetricNamesCondition(condition);
 
-    for (String metricName: splitCondition.getOriginalMetricNames()) {
+    for (byte[] uuid: condition.getUuids()) {
 
-      splitCondition.setCurrentMetric(metricName);
+      splitCondition.setCurrentUuid(uuid);
       stmt = PhoenixTransactSQL.prepareGetLatestAggregateMetricSqlStmt(conn, splitCondition);
       ResultSet rs = null;
       try {
         rs = stmt.executeQuery();
         while (rs.next()) {
+          String metricName = metadataManagerInstance.getMetricNameFromUuid(uuid);
           Collection<List<Function>> functionList = findMetricFunctions(metricFunctions, metricName);
           for (List<Function> functions : functionList) {
             if (functions != null) {
@@ -1187,14 +1183,16 @@ public class PhoenixHBaseAccessor {
       countColumnName = "HOSTS_COUNT";
     }
 
+    byte[] uuid = rs.getBytes("UUID");
+    TimelineMetric timelineMetric = metadataManagerInstance.getMetricFromUuid(uuid);
+
     SingleValuedTimelineMetric metric = new SingleValuedTimelineMetric(
-      rs.getString("METRIC_NAME") + f.getSuffix(),
-      rs.getString("APP_ID"),
-      rs.getString("INSTANCE_ID"),
+      timelineMetric.getMetricName() + f.getSuffix(),
+      timelineMetric.getAppId(),
+      timelineMetric.getInstanceId(),
       null,
       rs.getLong("SERVER_TIME"),
-      rs.getLong("SERVER_TIME"),
-      rs.getString("UNITS")
+      rs.getLong("SERVER_TIME")
     );
 
     double value;
@@ -1281,18 +1279,19 @@ public class PhoenixHBaseAccessor {
         TimelineMetric metric = metricAggregate.getKey();
         MetricHostAggregate hostAggregate = metricAggregate.getValue();
 
+        byte[] uuid = metadataManagerInstance.getUuid(metric);
+        if (uuid == null) {
+          LOG.error("Error computing UUID for metric. Cannot write metric : " + metric.toString());
+          continue;
+        }
         rowCount++;
         stmt.clearParameters();
-        stmt.setString(1, metric.getMetricName());
-        stmt.setString(2, metric.getHostName());
-        stmt.setString(3, metric.getAppId());
-        stmt.setString(4, metric.getInstanceId());
-        stmt.setLong(5, metric.getTimestamp());
-        stmt.setString(6, metric.getType());
-        stmt.setDouble(7, hostAggregate.getSum());
-        stmt.setDouble(8, hostAggregate.getMax());
-        stmt.setDouble(9, hostAggregate.getMin());
-        stmt.setDouble(10, hostAggregate.getNumberOfSamples());
+        stmt.setBytes(1, uuid);
+        stmt.setLong(2, metric.getTimestamp());
+        stmt.setDouble(3, hostAggregate.getSum());
+        stmt.setDouble(4, hostAggregate.getMax());
+        stmt.setDouble(5, hostAggregate.getMin());
+        stmt.setDouble(6, hostAggregate.getNumberOfSamples());
 
         try {
           stmt.executeUpdate();
@@ -1376,16 +1375,18 @@ public class PhoenixHBaseAccessor {
         }
 
         rowCount++;
+        byte[] uuid =  metadataManagerInstance.getUuid(clusterMetric);
+        if (uuid == null) {
+          LOG.error("Error computing UUID for metric. Cannot write metrics : " + clusterMetric.toString());
+          continue;
+        }
         stmt.clearParameters();
-        stmt.setString(1, clusterMetric.getMetricName());
-        stmt.setString(2, clusterMetric.getAppId());
-        stmt.setString(3, clusterMetric.getInstanceId());
-        stmt.setLong(4, clusterMetric.getTimestamp());
-        stmt.setString(5, clusterMetric.getType());
-        stmt.setDouble(6, aggregate.getSum());
-        stmt.setInt(7, aggregate.getNumberOfHosts());
-        stmt.setDouble(8, aggregate.getMax());
-        stmt.setDouble(9, aggregate.getMin());
+        stmt.setBytes(1, uuid);
+        stmt.setLong(2, clusterMetric.getTimestamp());
+        stmt.setDouble(3, aggregate.getSum());
+        stmt.setInt(4, aggregate.getNumberOfHosts());
+        stmt.setDouble(5, aggregate.getMax());
+        stmt.setDouble(6, aggregate.getMin());
 
         try {
           stmt.executeUpdate();
@@ -1462,17 +1463,20 @@ public class PhoenixHBaseAccessor {
             "aggregate = " + aggregate);
         }
 
+        byte[] uuid = metadataManagerInstance.getUuid(clusterMetric);
+        if (uuid == null) {
+          LOG.error("Error computing UUID for metric. Cannot write metric : " + clusterMetric.toString());
+          continue;
+        }
+
         rowCount++;
         stmt.clearParameters();
-        stmt.setString(1, clusterMetric.getMetricName());
-        stmt.setString(2, clusterMetric.getAppId());
-        stmt.setString(3, clusterMetric.getInstanceId());
-        stmt.setLong(4, clusterMetric.getTimestamp());
-        stmt.setString(5, clusterMetric.getType());
-        stmt.setDouble(6, aggregate.getSum());
-        stmt.setLong(7, aggregate.getNumberOfSamples());
-        stmt.setDouble(8, aggregate.getMax());
-        stmt.setDouble(9, aggregate.getMin());
+        stmt.setBytes(1, uuid);
+        stmt.setLong(2, clusterMetric.getTimestamp());
+        stmt.setDouble(3, aggregate.getSum());
+        stmt.setLong(4, aggregate.getNumberOfSamples());
+        stmt.setDouble(5, aggregate.getMax());
+        stmt.setDouble(6, aggregate.getMin());
 
         try {
           stmt.executeUpdate();
@@ -1560,21 +1564,23 @@ public class PhoenixHBaseAccessor {
    * One time save of metadata when discovering topology during aggregation.
    * @throws SQLException
    */
-  public void saveHostAppsMetadata(Map<String, Set<String>> hostedApps) throws SQLException {
+  public void saveHostAppsMetadata(Map<String, TimelineMetricHostMetadata> hostMetadata) throws SQLException {
     Connection conn = getConnection();
     PreparedStatement stmt = null;
     try {
       stmt = conn.prepareStatement(UPSERT_HOSTED_APPS_METADATA_SQL);
       int rowCount = 0;
 
-      for (Map.Entry<String, Set<String>> hostedAppsEntry : hostedApps.entrySet()) {
+      for (Map.Entry<String, TimelineMetricHostMetadata> hostedAppsEntry : hostMetadata.entrySet()) {
+        TimelineMetricHostMetadata timelineMetricHostMetadata = hostedAppsEntry.getValue();
         if (LOG.isTraceEnabled()) {
           LOG.trace("HostedAppsMetadata: " + hostedAppsEntry);
         }
 
         stmt.clearParameters();
         stmt.setString(1, hostedAppsEntry.getKey());
-        stmt.setString(2, StringUtils.join(hostedAppsEntry.getValue(), ","));
+        stmt.setBytes(2, timelineMetricHostMetadata.getUuid());
+        stmt.setString(3, StringUtils.join(timelineMetricHostMetadata.getHostedApps(), ","));
         try {
           stmt.executeUpdate();
           rowCount++;
@@ -1678,15 +1684,21 @@ public class PhoenixHBaseAccessor {
             + ", seriesStartTime = " + metadata.getSeriesStartTime()
           );
         }
-
-        stmt.clearParameters();
-        stmt.setString(1, metadata.getMetricName());
-        stmt.setString(2, metadata.getAppId());
-        stmt.setString(3, metadata.getUnits());
-        stmt.setString(4, metadata.getType());
-        stmt.setLong(5, metadata.getSeriesStartTime());
-        stmt.setBoolean(6, metadata.isSupportsAggregates());
-        stmt.setBoolean(7, metadata.isWhitelisted());
+        try {
+          stmt.clearParameters();
+          stmt.setString(1, metadata.getMetricName());
+          stmt.setString(2, metadata.getAppId());
+          stmt.setString(3, metadata.getInstanceId());
+          stmt.setBytes(4, metadata.getUuid());
+          stmt.setString(5, metadata.getUnits());
+          stmt.setString(6, metadata.getType());
+          stmt.setLong(7, metadata.getSeriesStartTime());
+          stmt.setBoolean(8, metadata.isSupportsAggregates());
+          stmt.setBoolean(9, metadata.isWhitelisted());
+        } catch (Exception e) {
+          LOG.error("Exception in saving metric metadata entry. ");
+          continue;
+        }
 
         try {
           stmt.executeUpdate();
@@ -1717,8 +1729,8 @@ public class PhoenixHBaseAccessor {
     }
   }
 
-  public Map<String, Set<String>> getHostedAppsMetadata() throws SQLException {
-    Map<String, Set<String>> hostedAppMap = new HashMap<>();
+  public Map<String, TimelineMetricHostMetadata> getHostedAppsMetadata() throws SQLException {
+    Map<String, TimelineMetricHostMetadata> hostedAppMap = new HashMap<>();
     Connection conn = getConnection();
     PreparedStatement stmt = null;
     ResultSet rs = null;
@@ -1728,8 +1740,9 @@ public class PhoenixHBaseAccessor {
       rs = stmt.executeQuery();
 
       while (rs.next()) {
-        hostedAppMap.put(rs.getString("HOSTNAME"),
-          new HashSet<>(Arrays.asList(StringUtils.split(rs.getString("APP_IDS"), ","))));
+        TimelineMetricHostMetadata hostMetadata = new TimelineMetricHostMetadata(new HashSet<>(Arrays.asList(StringUtils.split(rs.getString("APP_IDS"), ","))));
+        hostMetadata.setUuid(rs.getBytes("UUID"));
+        hostedAppMap.put(rs.getString("HOSTNAME"), hostMetadata);
       }
 
     } finally {
@@ -1820,9 +1833,11 @@ public class PhoenixHBaseAccessor {
       while (rs.next()) {
         String metricName = rs.getString("METRIC_NAME");
         String appId = rs.getString("APP_ID");
+        String instanceId = rs.getString("INSTANCE_ID");
         TimelineMetricMetadata metadata = new TimelineMetricMetadata(
           metricName,
           appId,
+          instanceId,
           rs.getString("UNITS"),
           rs.getString("TYPE"),
           rs.getLong("START_TIME"),
@@ -1830,8 +1845,9 @@ public class PhoenixHBaseAccessor {
           rs.getBoolean("IS_WHITELISTED")
         );
 
-        TimelineMetricMetadataKey key = new TimelineMetricMetadataKey(metricName, appId);
+        TimelineMetricMetadataKey key = new TimelineMetricMetadataKey(metricName, appId, instanceId);
         metadata.setIsPersisted(true); // Always true on retrieval
+        metadata.setUuid(rs.getBytes("UUID"));
         metadataMap.put(key, metadata);
       }
 
@@ -1862,4 +1878,8 @@ public class PhoenixHBaseAccessor {
     return metadataMap;
   }
 
+  public void setMetadataInstance(TimelineMetricMetadataManager metadataManager) {
+    this.metadataManagerInstance = metadataManager;
+    TIMELINE_METRIC_READ_HELPER = new TimelineMetricReadHelper(this.metadataManagerInstance);
+  }
 }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TimelineMetricConfiguration.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TimelineMetricConfiguration.java
index b1ecc51..6083859 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TimelineMetricConfiguration.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TimelineMetricConfiguration.java
@@ -313,11 +313,16 @@ public class TimelineMetricConfiguration {
   public static final String TIMELINE_METRICS_PRECISION_TABLE_HBASE_BLOCKING_STORE_FILES =
     "timeline.metrics.precision.table.hbase.hstore.blockingStoreFiles";
 
+<<<<<<< HEAD
   public static final String TIMELINE_METRICS_SUPPORT_MULTIPLE_CLUSTERS =
     "timeline.metrics.support.multiple.clusters";
 
   public static final String TIMELINE_METRICS_EVENT_METRIC_PATTERNS =
     "timeline.metrics.downsampler.event.metric.patterns";
+=======
+  public static final String TIMELINE_METRICS_UUID_GEN_STRATEGY =
+    "timeline.metrics.uuid.gen.strategy";
+>>>>>>> AMBARI-21214 : Use a uuid vs long row key for metrics in AMS schema. (avijayan)
 
   public static final String HOST_APP_ID = "HOST";
 
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TimelineMetricStore.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TimelineMetricStore.java
index d052d54..dab4494 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TimelineMetricStore.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TimelineMetricStore.java
@@ -25,6 +25,8 @@ import org.apache.hadoop.metrics2.sink.timeline.TimelineMetricMetadata;
 import org.apache.hadoop.metrics2.sink.timeline.TimelineMetrics;
 import org.apache.hadoop.metrics2.sink.timeline.TopNConfig;
 import org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery.TimelineMetricMetadataKey;
+
 import java.io.IOException;
 import java.sql.SQLException;
 import java.util.List;
@@ -98,9 +100,11 @@ public interface TimelineMetricStore {
    */
   Map<String, Map<String,Set<String>>> getInstanceHostsMetadata(String instanceId, String appId) throws SQLException, IOException;
 
-  /**
-   * Return a list of known live collector nodes
-   * @return [ hostname ]
-   */
+ Map<String, TimelineMetricMetadataKey> getUuids() throws SQLException, IOException;
+
+    /**
+     * Return a list of known live collector nodes
+     * @return [ hostname ]
+     */
   List<String> getLiveInstances();
 }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TimelineMetricsFilter.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TimelineMetricsFilter.java
index 63cc510..ef7186c 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TimelineMetricsFilter.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TimelineMetricsFilter.java
@@ -167,11 +167,4 @@ public class TimelineMetricsFilter {
     return false;
   }
 
-  public static void addToWhitelist(String metricName) {
-
-    if (StringUtils.isNotEmpty(metricName)) {
-      whitelistedMetrics.add(metricName);
-    }
-  }
-
 }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/AbstractTimelineAggregator.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/AbstractTimelineAggregator.java
index e161abe..d953be4 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/AbstractTimelineAggregator.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/AbstractTimelineAggregator.java
@@ -272,7 +272,8 @@ public abstract class AbstractTimelineAggregator implements TimelineMetricAggreg
         conn.commit();
         LOG.info(rows + " row(s) updated in aggregation.");
 
-        downsample(conn, startTime, endTime);
+        //TODO : Fix downsampling after UUID change.
+        //downsample(conn, startTime, endTime);
       } else {
         rs = stmt.executeQuery();
       }
@@ -280,7 +281,7 @@ public abstract class AbstractTimelineAggregator implements TimelineMetricAggreg
 
       aggregate(rs, startTime, endTime);
 
-    } catch (SQLException | IOException e) {
+    } catch (Exception e) {
       LOG.error("Exception during aggregating metrics.", e);
       success = false;
     } finally {
@@ -455,25 +456,29 @@ public abstract class AbstractTimelineAggregator implements TimelineMetricAggreg
    * @return
    */
   protected String getDownsampledMetricSkipClause() {
-    if (CollectionUtils.isEmpty(this.downsampleMetricPatterns)) {
-      return StringUtils.EMPTY;
-    }
-
-    StringBuilder sb = new StringBuilder();
-
-    for (int i = 0; i < downsampleMetricPatterns.size(); i++) {
-      sb.append(" METRIC_NAME");
-      sb.append(" NOT");
-      sb.append(" LIKE ");
-      sb.append("'" + downsampleMetricPatterns.get(i) + "'");
 
-      if (i < downsampleMetricPatterns.size() - 1) {
-        sb.append(" AND ");
-      }
-    }
-
-    sb.append(" AND ");
-    return sb.toString();
+    //TODO Fix downsampling for UUID change.
+    return StringUtils.EMPTY;
+
+//    if (CollectionUtils.isEmpty(this.downsampleMetricPatterns)) {
+//      return StringUtils.EMPTY;
+//    }
+//
+//    StringBuilder sb = new StringBuilder();
+//
+//    for (int i = 0; i < downsampleMetricPatterns.size(); i++) {
+//      sb.append(" METRIC_NAME");
+//      sb.append(" NOT");
+//      sb.append(" LIKE ");
+//      sb.append("'" + downsampleMetricPatterns.get(i) + "'");
+//
+//      if (i < downsampleMetricPatterns.size() - 1) {
+//        sb.append(" AND ");
+//      }
+//    }
+//
+//    sb.append(" AND ");
+//    return sb.toString();
   }
 
   /**
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineClusterMetric.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineClusterMetric.java
index b7d9110..6e793e1 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineClusterMetric.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineClusterMetric.java
@@ -22,15 +22,13 @@ public class TimelineClusterMetric {
   private String appId;
   private String instanceId;
   private long timestamp;
-  private String type;
 
   public TimelineClusterMetric(String metricName, String appId, String instanceId,
-                        long timestamp, String type) {
+                        long timestamp) {
     this.metricName = metricName;
     this.appId = appId;
     this.instanceId = instanceId;
     this.timestamp = timestamp;
-    this.type = type;
   }
 
   public String getMetricName() {
@@ -49,8 +47,6 @@ public class TimelineClusterMetric {
     return timestamp;
   }
 
-  public String getType() { return type; }
-
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricAggregatorFactory.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricAggregatorFactory.java
index 2eb3553..081e610 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricAggregatorFactory.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricAggregatorFactory.java
@@ -95,6 +95,7 @@ public class TimelineMetricAggregatorFactory {
    */
   public static TimelineMetricAggregator createTimelineMetricAggregatorMinute
     (PhoenixHBaseAccessor hBaseAccessor, Configuration metricsConf,
+     TimelineMetricMetadataManager metadataManager,
      MetricCollectorHAController haController) {
 
     String checkpointDir = metricsConf.get(
@@ -128,6 +129,7 @@ public class TimelineMetricAggregatorFactory {
 
     return new TimelineMetricHostAggregator(
       METRIC_RECORD_MINUTE,
+      metadataManager,
       hBaseAccessor, metricsConf,
       checkpointLocation,
       sleepIntervalMillis,
@@ -145,6 +147,7 @@ public class TimelineMetricAggregatorFactory {
    */
   public static TimelineMetricAggregator createTimelineMetricAggregatorHourly
     (PhoenixHBaseAccessor hBaseAccessor, Configuration metricsConf,
+     TimelineMetricMetadataManager metadataManager,
      MetricCollectorHAController haController) {
 
     String checkpointDir = metricsConf.get(
@@ -178,6 +181,7 @@ public class TimelineMetricAggregatorFactory {
 
     return new TimelineMetricHostAggregator(
       METRIC_RECORD_HOURLY,
+      metadataManager,
       hBaseAccessor, metricsConf,
       checkpointLocation,
       sleepIntervalMillis,
@@ -195,6 +199,7 @@ public class TimelineMetricAggregatorFactory {
    */
   public static TimelineMetricAggregator createTimelineMetricAggregatorDaily
     (PhoenixHBaseAccessor hBaseAccessor, Configuration metricsConf,
+     TimelineMetricMetadataManager metadataManager,
      MetricCollectorHAController haController) {
 
     String checkpointDir = metricsConf.get(
@@ -228,6 +233,7 @@ public class TimelineMetricAggregatorFactory {
 
     return new TimelineMetricHostAggregator(
       METRIC_RECORD_DAILY,
+      metadataManager,
       hBaseAccessor, metricsConf,
       checkpointLocation,
       sleepIntervalMillis,
@@ -291,6 +297,7 @@ public class TimelineMetricAggregatorFactory {
    */
   public static TimelineMetricAggregator createTimelineClusterAggregatorMinute(
     PhoenixHBaseAccessor hBaseAccessor, Configuration metricsConf,
+    TimelineMetricMetadataManager metadataManager,
     MetricCollectorHAController haController) {
 
     String checkpointDir = metricsConf.get(
@@ -326,6 +333,7 @@ public class TimelineMetricAggregatorFactory {
 
     return new TimelineMetricClusterAggregator(
       METRIC_AGGREGATE_MINUTE,
+      metadataManager,
       hBaseAccessor, metricsConf,
       checkpointLocation,
       sleepIntervalMillis,
@@ -344,6 +352,7 @@ public class TimelineMetricAggregatorFactory {
    */
   public static TimelineMetricAggregator createTimelineClusterAggregatorHourly(
     PhoenixHBaseAccessor hBaseAccessor, Configuration metricsConf,
+    TimelineMetricMetadataManager metadataManager,
     MetricCollectorHAController haController) {
 
     String checkpointDir = metricsConf.get(
@@ -379,6 +388,7 @@ public class TimelineMetricAggregatorFactory {
 
     return new TimelineMetricClusterAggregator(
       METRIC_AGGREGATE_HOURLY,
+      metadataManager,
       hBaseAccessor, metricsConf,
       checkpointLocation,
       sleepIntervalMillis,
@@ -397,6 +407,7 @@ public class TimelineMetricAggregatorFactory {
    */
   public static TimelineMetricAggregator createTimelineClusterAggregatorDaily(
     PhoenixHBaseAccessor hBaseAccessor, Configuration metricsConf,
+    TimelineMetricMetadataManager metadataManager,
     MetricCollectorHAController haController) {
 
     String checkpointDir = metricsConf.get(
@@ -432,6 +443,7 @@ public class TimelineMetricAggregatorFactory {
 
     return new TimelineMetricClusterAggregator(
       METRIC_AGGREGATE_DAILY,
+      metadataManager,
       hBaseAccessor, metricsConf,
       checkpointLocation,
       sleepIntervalMillis,
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricAppAggregator.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricAppAggregator.java
index 9eaf456..55104de 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricAppAggregator.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricAppAggregator.java
@@ -24,6 +24,7 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.metrics2.sink.timeline.MetricClusterAggregate;
 import org.apache.hadoop.metrics2.sink.timeline.TimelineMetricMetadata;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.TimelineMetricsFilter;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery.TimelineMetricHostMetadata;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery.TimelineMetricMetadataKey;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery.TimelineMetricMetadataManager;
 
@@ -48,14 +49,14 @@ public class TimelineMetricAppAggregator {
   private static final Log LOG = LogFactory.getLog(TimelineMetricAppAggregator.class);
   // Lookup to check candidacy of an app
   private final List<String> appIdsToAggregate;
-  private final Map<String, Set<String>> hostedAppsMap;
+  private final Map<String, TimelineMetricHostMetadata> hostMetadata;
   Map<TimelineClusterMetric, MetricClusterAggregate> aggregateClusterMetrics = new HashMap<>();
   TimelineMetricMetadataManager metadataManagerInstance;
 
   public TimelineMetricAppAggregator(TimelineMetricMetadataManager metadataManager,
                                      Configuration metricsConf) {
     appIdsToAggregate = getAppIdsForHostAggregation(metricsConf);
-    hostedAppsMap = metadataManager.getHostedAppsCache();
+    hostMetadata = metadataManager.getHostedAppsCache();
     metadataManagerInstance = metadataManager;
     LOG.info("AppIds configured for aggregation: " + appIdsToAggregate);
   }
@@ -95,17 +96,20 @@ public class TimelineMetricAppAggregator {
     // If metric is a host metric and host has apps on it
     if (appId.equalsIgnoreCase(HOST_APP_ID)) {
       // Candidate metric, update app aggregates
-      if (hostedAppsMap.containsKey(hostname)) {
+      if (hostMetadata.containsKey(hostname)) {
         updateAppAggregatesFromHostMetric(clusterMetric, hostname, metricValue);
       }
     } else {
       // Build the hostedapps map if not a host metric
       // Check app candidacy for host aggregation
       if (appIdsToAggregate.contains(appId)) {
-        Set<String> appIds = hostedAppsMap.get(hostname);
-        if (appIds == null) {
+        TimelineMetricHostMetadata timelineMetricHostMetadata = hostMetadata.get(hostname);
+        Set<String> appIds;
+        if (timelineMetricHostMetadata == null) {
           appIds = new HashSet<>();
-          hostedAppsMap.put(hostname, appIds);
+          hostMetadata.put(hostname, new TimelineMetricHostMetadata(appIds));
+        } else {
+          appIds = timelineMetricHostMetadata.getHostedApps();
         }
         if (!appIds.contains(appId)) {
           appIds.add(appId);
@@ -127,20 +131,20 @@ public class TimelineMetricAppAggregator {
       return;
     }
 
-    TimelineMetricMetadataKey appKey =  new TimelineMetricMetadataKey(clusterMetric.getMetricName(), HOST_APP_ID);
-    Set<String> apps = hostedAppsMap.get(hostname);
+    TimelineMetricMetadataKey appKey =  new TimelineMetricMetadataKey(clusterMetric.getMetricName(), HOST_APP_ID, clusterMetric.getInstanceId());
+    Set<String> apps = hostMetadata.get(hostname).getHostedApps();
     for (String appId : apps) {
       if (appIdsToAggregate.contains(appId)) {
 
         appKey.setAppId(appId);
         TimelineMetricMetadata appMetadata = metadataManagerInstance.getMetadataCacheValue(appKey);
         if (appMetadata == null) {
-          TimelineMetricMetadataKey key = new TimelineMetricMetadataKey(clusterMetric.getMetricName(), HOST_APP_ID);
+          TimelineMetricMetadataKey key = new TimelineMetricMetadataKey(clusterMetric.getMetricName(), HOST_APP_ID, clusterMetric.getInstanceId());
           TimelineMetricMetadata hostMetricMetadata = metadataManagerInstance.getMetadataCacheValue(key);
 
           if (hostMetricMetadata != null) {
             TimelineMetricMetadata timelineMetricMetadata = new TimelineMetricMetadata(clusterMetric.getMetricName(),
-              appId, hostMetricMetadata.getUnits(), hostMetricMetadata.getType(), hostMetricMetadata.getSeriesStartTime(),
+              appId, clusterMetric.getInstanceId(), hostMetricMetadata.getUnits(), hostMetricMetadata.getType(), hostMetricMetadata.getSeriesStartTime(),
               hostMetricMetadata.isSupportsAggregates(), TimelineMetricsFilter.acceptMetric(clusterMetric.getMetricName(), appId));
             metadataManagerInstance.putIfModifiedTimelineMetricMetadata(timelineMetricMetadata);
           }
@@ -151,9 +155,7 @@ public class TimelineMetricAppAggregator {
           new TimelineClusterMetric(clusterMetric.getMetricName(),
             appId,
             clusterMetric.getInstanceId(),
-            clusterMetric.getTimestamp(),
-            clusterMetric.getType()
-          );
+            clusterMetric.getTimestamp());
 
         MetricClusterAggregate clusterAggregate = aggregateClusterMetrics.get(appTimelineClusterMetric);
 
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricClusterAggregator.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricClusterAggregator.java
index 74d4013..0f6dd79 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricClusterAggregator.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricClusterAggregator.java
@@ -23,6 +23,7 @@ import org.apache.hadoop.metrics2.sink.timeline.MetricHostAggregate;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.PhoenixHBaseAccessor;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.availability.AggregationTaskRunner.AGGREGATOR_NAME;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.availability.MetricCollectorHAController;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery.TimelineMetricMetadataManager;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.query.Condition;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.query.DefaultCondition;
 
@@ -37,10 +38,11 @@ import static org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.ti
 import static org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.query.PhoenixTransactSQL.METRICS_CLUSTER_AGGREGATE_TABLE_NAME;
 
 public class TimelineMetricClusterAggregator extends AbstractTimelineAggregator {
-  private final TimelineMetricReadHelper readHelper = new TimelineMetricReadHelper(true);
+  private final TimelineMetricReadHelper readHelper;
   private final boolean isClusterPrecisionInputTable;
 
   public TimelineMetricClusterAggregator(AGGREGATOR_NAME aggregatorName,
+                                         TimelineMetricMetadataManager metricMetadataManager,
                                          PhoenixHBaseAccessor hBaseAccessor,
                                          Configuration metricsConf,
                                          String checkpointLocation,
@@ -56,6 +58,7 @@ public class TimelineMetricClusterAggregator extends AbstractTimelineAggregator
       hostAggregatorDisabledParam, inputTableName, outputTableName,
       nativeTimeRangeDelay, haController);
     isClusterPrecisionInputTable = inputTableName.equals(METRICS_CLUSTER_AGGREGATE_TABLE_NAME);
+    readHelper = new TimelineMetricReadHelper(metricMetadataManager, true);
   }
 
   @Override
@@ -71,9 +74,7 @@ public class TimelineMetricClusterAggregator extends AbstractTimelineAggregator
     }
 
     condition.setStatement(sqlStr);
-    condition.addOrderByColumn("METRIC_NAME");
-    condition.addOrderByColumn("APP_ID");
-    condition.addOrderByColumn("INSTANCE_ID");
+    condition.addOrderByColumn("UUID");
     condition.addOrderByColumn("SERVER_TIME");
     return condition;
   }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricClusterAggregatorSecond.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricClusterAggregatorSecond.java
index ca457f0..8dfc950 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricClusterAggregatorSecond.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricClusterAggregatorSecond.java
@@ -61,7 +61,7 @@ import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.
  */
 public class TimelineMetricClusterAggregatorSecond extends AbstractTimelineAggregator {
   public Long timeSliceIntervalMillis;
-  private TimelineMetricReadHelper timelineMetricReadHelper = new TimelineMetricReadHelper(true);
+  private TimelineMetricReadHelper timelineMetricReadHelper;
   // Aggregator to perform app-level aggregates for host metrics
   private final TimelineMetricAppAggregator appAggregator;
   // 1 minute client side buffering adjustment
@@ -69,8 +69,12 @@ public class TimelineMetricClusterAggregatorSecond extends AbstractTimelineAggre
   private final boolean interpolationEnabled;
   private TimelineMetricMetadataManager metadataManagerInstance;
   private String skipAggrPatternStrings;
+<<<<<<< HEAD
   private String skipInterpolationMetricPatternStrings;
   private Set<Pattern> skipInterpolationMetricPatterns = new HashSet<>();
+=======
+  private final static String liveHostsMetricName = "live_hosts";
+>>>>>>> AMBARI-21214 : Use a uuid vs long row key for metrics in AMS schema. (avijayan)
 
   public TimelineMetricClusterAggregatorSecond(AGGREGATOR_NAME aggregatorName,
                                                TimelineMetricMetadataManager metadataManager,
@@ -95,6 +99,7 @@ public class TimelineMetricClusterAggregatorSecond extends AbstractTimelineAggre
     this.serverTimeShiftAdjustment = Long.parseLong(metricsConf.get(SERVER_SIDE_TIMESIFT_ADJUSTMENT, "90000"));
     this.interpolationEnabled = Boolean.parseBoolean(metricsConf.get(TIMELINE_METRICS_CLUSTER_AGGREGATOR_INTERPOLATION_ENABLED, "true"));
     this.skipAggrPatternStrings = metricsConf.get(TIMELINE_METRIC_AGGREGATION_SQL_FILTERS);
+<<<<<<< HEAD
     this.skipInterpolationMetricPatternStrings = metricsConf.get(TIMELINE_METRICS_EVENT_METRIC_PATTERNS, "");
 
     if (StringUtils.isNotEmpty(skipInterpolationMetricPatternStrings)) {
@@ -104,6 +109,9 @@ public class TimelineMetricClusterAggregatorSecond extends AbstractTimelineAggre
         skipInterpolationMetricPatterns.add(Pattern.compile(javaPatternString));
       }
     }
+=======
+    this.timelineMetricReadHelper = new TimelineMetricReadHelper(metadataManager, true);
+>>>>>>> AMBARI-21214 : Use a uuid vs long row key for metrics in AMS schema. (avijayan)
   }
 
   @Override
@@ -143,10 +151,7 @@ public class TimelineMetricClusterAggregatorSecond extends AbstractTimelineAggre
     condition.setStatement(String.format(GET_METRIC_SQL,
       getQueryHint(startTime), METRICS_RECORD_TABLE_NAME));
     // Retaining order of the row-key avoids client side merge sort.
-    condition.addOrderByColumn("METRIC_NAME");
-    condition.addOrderByColumn("HOSTNAME");
-    condition.addOrderByColumn("APP_ID");
-    condition.addOrderByColumn("INSTANCE_ID");
+    condition.addOrderByColumn("UUID");
     condition.addOrderByColumn("SERVER_TIME");
     return condition;
   }
@@ -228,7 +233,7 @@ public class TimelineMetricClusterAggregatorSecond extends AbstractTimelineAggre
   protected int processAggregateClusterMetrics(Map<TimelineClusterMetric, MetricClusterAggregate> aggregateClusterMetrics,
                                               TimelineMetric metric, List<Long[]> timeSlices) {
     // Create time slices
-    TimelineMetricMetadataKey appKey =  new TimelineMetricMetadataKey(metric.getMetricName(), metric.getAppId());
+    TimelineMetricMetadataKey appKey =  new TimelineMetricMetadataKey(metric.getMetricName(), metric.getAppId(), metric.getInstanceId());
     TimelineMetricMetadata metricMetadata = metadataManagerInstance.getMetadataCacheValue(appKey);
 
     if (metricMetadata != null && !metricMetadata.isSupportsAggregates()) {
@@ -301,8 +306,7 @@ public class TimelineMetricClusterAggregatorSecond extends AbstractTimelineAggre
           timelineMetric.getMetricName(),
           timelineMetric.getAppId(),
           timelineMetric.getInstanceId(),
-          timestamp,
-          timelineMetric.getType());
+          timestamp);
 
         if (prevTimestamp < 0 || timestamp.equals(prevTimestamp)) {
           Double newValue = metric.getValue();
@@ -369,8 +373,7 @@ public class TimelineMetricClusterAggregatorSecond extends AbstractTimelineAggre
               timelineMetric.getMetricName(),
               timelineMetric.getAppId(),
               timelineMetric.getInstanceId(),
-              entry.getKey(),
-              timelineMetric.getType());
+              entry.getKey());
 
             timelineClusterMetricMap.put(clusterMetric, interpolatedValue);
           } else {
@@ -427,8 +430,7 @@ public class TimelineMetricClusterAggregatorSecond extends AbstractTimelineAggre
               timelineMetric.getMetricName(),
               timelineMetric.getAppId(),
               timelineMetric.getInstanceId(),
-              timeSlice[1],
-              timelineMetric.getType());
+              timeSlice[1]);
 
             LOG.debug("Interpolated value : " + interpolatedValue);
             timelineClusterMetricMap.put(clusterMetric, interpolatedValue);
@@ -458,13 +460,15 @@ public class TimelineMetricClusterAggregatorSecond extends AbstractTimelineAggre
 
     for (Map.Entry<String, MutableInt> appHostsEntry : appHostsCount.entrySet()) {
       TimelineClusterMetric timelineClusterMetric = new TimelineClusterMetric(
-        "live_hosts", appHostsEntry.getKey(), null, timestamp, null);
+        liveHostsMetricName, appHostsEntry.getKey(), null, timestamp);
 
       Integer numOfHosts = appHostsEntry.getValue().intValue();
 
       MetricClusterAggregate metricClusterAggregate = new MetricClusterAggregate(
         (double) numOfHosts, 1, null, (double) numOfHosts, (double) numOfHosts);
 
+      metadataManagerInstance.getUuid(timelineClusterMetric);
+
       aggregateClusterMetrics.put(timelineClusterMetric, metricClusterAggregate);
     }
 
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricHostAggregator.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricHostAggregator.java
index a17433b..8f941e1 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricHostAggregator.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricHostAggregator.java
@@ -25,6 +25,7 @@ import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.PhoenixHBaseAccessor;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.availability.AggregationTaskRunner.AGGREGATOR_NAME;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.availability.MetricCollectorHAController;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery.TimelineMetricMetadataManager;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.query.Condition;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.query.DefaultCondition;
 
@@ -38,9 +39,10 @@ import static org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.ti
 
 public class TimelineMetricHostAggregator extends AbstractTimelineAggregator {
   private static final Log LOG = LogFactory.getLog(TimelineMetricHostAggregator.class);
-  TimelineMetricReadHelper readHelper = new TimelineMetricReadHelper(false);
+  TimelineMetricReadHelper readHelper;
 
   public TimelineMetricHostAggregator(AGGREGATOR_NAME aggregatorName,
+                                      TimelineMetricMetadataManager metricMetadataManager,
                                       PhoenixHBaseAccessor hBaseAccessor,
                                       Configuration metricsConf,
                                       String checkpointLocation,
@@ -54,6 +56,7 @@ public class TimelineMetricHostAggregator extends AbstractTimelineAggregator {
     super(aggregatorName, hBaseAccessor, metricsConf, checkpointLocation,
       sleepIntervalMillis, checkpointCutOffMultiplier, hostAggregatorDisabledParam,
       tableName, outputTableName, nativeTimeRangeDelay, haController);
+    readHelper = new TimelineMetricReadHelper(metricMetadataManager, false);
   }
 
   @Override
@@ -74,11 +77,8 @@ public class TimelineMetricHostAggregator extends AbstractTimelineAggregator {
     condition.setStatement(String.format(GET_METRIC_AGGREGATE_ONLY_SQL,
       getQueryHint(startTime), tableName));
     // Retaining order of the row-key avoids client side merge sort.
-    condition.addOrderByColumn("METRIC_NAME");
-    condition.addOrderByColumn("HOSTNAME");
+    condition.addOrderByColumn("UUID");
     condition.addOrderByColumn("SERVER_TIME");
-    condition.addOrderByColumn("APP_ID");
-    condition.addOrderByColumn("INSTANCE_ID");
     return condition;
   }
 
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricReadHelper.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricReadHelper.java
index be21f5a..8a5606a 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricReadHelper.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricReadHelper.java
@@ -23,16 +23,17 @@ import org.apache.hadoop.metrics2.sink.timeline.MetricHostAggregate;
 import org.apache.hadoop.metrics2.sink.timeline.SingleValuedTimelineMetric;
 import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.PhoenixHBaseAccessor;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery.TimelineMetricMetadataManager;
 
 import java.io.IOException;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.util.Map;
 import java.util.TreeMap;
 
 public class TimelineMetricReadHelper {
 
   private boolean ignoreInstance = false;
+  private TimelineMetricMetadataManager metadataManagerInstance = null;
 
   public TimelineMetricReadHelper() {}
 
@@ -40,6 +41,15 @@ public class TimelineMetricReadHelper {
     this.ignoreInstance = ignoreInstance;
   }
 
+  public TimelineMetricReadHelper(TimelineMetricMetadataManager timelineMetricMetadataManager) {
+    this.metadataManagerInstance = timelineMetricMetadataManager;
+  }
+
+  public TimelineMetricReadHelper(TimelineMetricMetadataManager timelineMetricMetadataManager, boolean ignoreInstance) {
+    this.metadataManagerInstance = timelineMetricMetadataManager;
+    this.ignoreInstance = ignoreInstance;
+  }
+
   public TimelineMetric getTimelineMetricFromResultSet(ResultSet rs)
       throws SQLException, IOException {
     TimelineMetric metric = getTimelineMetricCommonsFromResultSet(rs);
@@ -51,15 +61,16 @@ public class TimelineMetricReadHelper {
   public SingleValuedTimelineMetric getAggregatedTimelineMetricFromResultSet(ResultSet rs,
       Function f) throws SQLException, IOException {
 
+    byte[] uuid = rs.getBytes("UUID");
+    TimelineMetric timelineMetric = metadataManagerInstance.getMetricFromUuid(uuid);
     Function function = (f != null) ? f : Function.DEFAULT_VALUE_FUNCTION;
     SingleValuedTimelineMetric metric = new SingleValuedTimelineMetric(
-      rs.getString("METRIC_NAME") + function.getSuffix(),
-      rs.getString("APP_ID"),
-      rs.getString("INSTANCE_ID"),
-      rs.getString("HOSTNAME"),
-      rs.getLong("SERVER_TIME"),
+      timelineMetric.getMetricName() + function.getSuffix(),
+      timelineMetric.getAppId(),
+      timelineMetric.getInstanceId(),
+      timelineMetric.getHostName(),
       rs.getLong("SERVER_TIME"),
-      rs.getString("UNITS")
+      rs.getLong("SERVER_TIME")
     );
 
     double value;
@@ -91,16 +102,14 @@ public class TimelineMetricReadHelper {
    */
   public TimelineMetric getTimelineMetricCommonsFromResultSet(ResultSet rs)
       throws SQLException {
-    TimelineMetric metric = new TimelineMetric();
-    metric.setMetricName(rs.getString("METRIC_NAME"));
-    metric.setAppId(rs.getString("APP_ID"));
-    if (!ignoreInstance) {
-      metric.setInstanceId(rs.getString("INSTANCE_ID"));
+
+    byte[] uuid = rs.getBytes("UUID");
+    TimelineMetric metric = metadataManagerInstance.getMetricFromUuid(uuid);
+    if (ignoreInstance) {
+      metric.setInstanceId(null);
     }
-    metric.setHostName(rs.getString("HOSTNAME"));
     metric.setTimestamp(rs.getLong("SERVER_TIME"));
     metric.setStartTime(rs.getLong("START_TIME"));
-    metric.setType(rs.getString("UNITS"));
     return metric;
   }
 
@@ -130,14 +139,16 @@ public class TimelineMetricReadHelper {
     return agg;
   }
 
-
   public TimelineClusterMetric fromResultSet(ResultSet rs) throws SQLException {
+
+    byte[] uuid = rs.getBytes("UUID");
+    TimelineMetric timelineMetric = metadataManagerInstance.getMetricFromUuid(uuid);
+
     return new TimelineClusterMetric(
-      rs.getString("METRIC_NAME"),
-      rs.getString("APP_ID"),
-      ignoreInstance ? null : rs.getString("INSTANCE_ID"),
-      rs.getLong("SERVER_TIME"),
-      rs.getString("UNITS"));
+      timelineMetric.getMetricName(),
+      timelineMetric.getAppId(),
+      ignoreInstance ? null : timelineMetric.getInstanceId(),
+      rs.getLong("SERVER_TIME"));
   }
 
   public MetricHostAggregate getMetricHostAggregateFromResultSet(ResultSet rs)
@@ -154,14 +165,8 @@ public class TimelineMetricReadHelper {
 
   public TimelineMetric getTimelineMetricKeyFromResultSet(ResultSet rs)
       throws SQLException, IOException {
-    TimelineMetric metric = new TimelineMetric();
-    metric.setMetricName(rs.getString("METRIC_NAME"));
-    metric.setAppId(rs.getString("APP_ID"));
-    metric.setInstanceId(rs.getString("INSTANCE_ID"));
-    metric.setHostName(rs.getString("HOSTNAME"));
-    metric.setTimestamp(rs.getLong("SERVER_TIME"));
-    metric.setType(rs.getString("UNITS"));
-    return metric;
+    byte[] uuid = rs.getBytes("UUID");
+    return metadataManagerInstance.getMetricFromUuid(uuid);
   }
 }
 
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/Condition.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TimelineMetricHostMetadata.java
similarity index 52%
copy from ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/Condition.java
copy to ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TimelineMetricHostMetadata.java
index 9aa64bd..06e9279 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/Condition.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TimelineMetricHostMetadata.java
@@ -1,9 +1,3 @@
-package org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.query;
-
-import org.apache.hadoop.metrics2.sink.timeline.Precision;
-
-import java.util.List;
-
 /**
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -21,28 +15,37 @@ import java.util.List;
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-public interface Condition {
-  boolean isEmpty();
-
-  List<String> getMetricNames();
-  boolean isPointInTime();
-  boolean isGrouped();
-  void setStatement(String statement);
-  List<String> getHostnames();
-  Precision getPrecision();
-  void setPrecision(Precision precision);
-  String getAppId();
-  String getInstanceId();
-  StringBuilder getConditionClause();
-  String getOrderByClause(boolean asc);
-  String getStatement();
-  Long getStartTime();
-  Long getEndTime();
-  Integer getLimit();
-  Integer getFetchSize();
-  void setFetchSize(Integer fetchSize);
-  void addOrderByColumn(String column);
-  void setNoLimit();
-  boolean doUpdate();
-  void setMetricNamesNotCondition(boolean metricNamesNotCondition);
+
+package org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class TimelineMetricHostMetadata {
+  private Set<String> hostedApps = new HashSet<>();
+  private byte[] uuid;
+
+  // Default constructor
+  public TimelineMetricHostMetadata() {
+  }
+
+  public TimelineMetricHostMetadata(Set<String> hostedApps) {
+    this.hostedApps = hostedApps;
+  }
+
+  public Set<String> getHostedApps() {
+    return hostedApps;
+  }
+
+  public void setHostedApps(Set<String> hostedApps) {
+    this.hostedApps = hostedApps;
+  }
+
+  public byte[] getUuid() {
+    return uuid;
+  }
+
+  public void setUuid(byte[] uuid) {
+    this.uuid = uuid;
+  }
 }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TimelineMetricMetadataKey.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TimelineMetricMetadataKey.java
index 504b502..6aeb2dd 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TimelineMetricMetadataKey.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TimelineMetricMetadataKey.java
@@ -17,13 +17,20 @@
  */
 package org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery;
 
+import org.apache.commons.lang3.StringUtils;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
 public class TimelineMetricMetadataKey {
   String metricName;
   String appId;
+  String instanceId;
 
-  public TimelineMetricMetadataKey(String metricName, String appId) {
+  public TimelineMetricMetadataKey(String metricName, String appId, String instanceId) {
     this.metricName = metricName;
     this.appId = appId;
+    this.instanceId = instanceId;
   }
 
   public String getMetricName() {
@@ -34,6 +41,10 @@ public class TimelineMetricMetadataKey {
     return appId;
   }
 
+  public String getInstanceId() {
+    return instanceId;
+  }
+
   public void setAppId(String appId) {
     this.appId = appId;
   }
@@ -46,15 +57,24 @@ public class TimelineMetricMetadataKey {
     TimelineMetricMetadataKey that = (TimelineMetricMetadataKey) o;
 
     if (!metricName.equals(that.metricName)) return false;
-    return !(appId != null ? !appId.equals(that.appId) : that.appId != null);
-
+    if (!appId.equals(that.appId)) return false;
+    return (StringUtils.isNotEmpty(instanceId) ? instanceId.equals(that.instanceId) : StringUtils.isEmpty(that.instanceId));
   }
 
   @Override
   public int hashCode() {
     int result = metricName.hashCode();
     result = 31 * result + (appId != null ? appId.hashCode() : 0);
+    result = 31 * result + (instanceId != null ? instanceId.hashCode() : 0);
     return result;
   }
 
+  @Override
+  public String toString() {
+    return "TimelineMetricMetadataKey{" +
+      "metricName='" + metricName + '\'' +
+      ", appId='" + appId + '\'' +
+      ", instanceId='" + instanceId + '\'' +
+      '}';
+  }
 }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TimelineMetricMetadataManager.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TimelineMetricMetadataManager.java
index 8a71756..e00c045 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TimelineMetricMetadataManager.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TimelineMetricMetadataManager.java
@@ -19,6 +19,7 @@ package org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline
 
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -29,6 +30,9 @@ import org.apache.hadoop.metrics2.sink.timeline.TimelineMetricMetadata;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.PhoenixHBaseAccessor;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.TimelineMetricConfiguration;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.aggregators.TimelineClusterMetric;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.uuid.HashBasedUuidGenStrategy;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.uuid.MetricUuidGenStrategy;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.uuid.RandomUuidGenStrategy;
 
 import java.net.MalformedURLException;
 import java.net.URISyntaxException;
@@ -48,6 +52,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import static org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.TimelineMetricConfiguration.DISABLE_METRIC_METADATA_MGMT;
 import static org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.TimelineMetricConfiguration.METRICS_METADATA_SYNC_INIT_DELAY;
 import static org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.TimelineMetricConfiguration.METRICS_METADATA_SYNC_SCHEDULE_DELAY;
+import static org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.TimelineMetricConfiguration.TIMELINE_METRICS_UUID_GEN_STRATEGY;
 import static org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.TimelineMetricConfiguration.TIMELINE_METRIC_METADATA_FILTERS;
 
 public class TimelineMetricMetadataManager {
@@ -55,12 +60,17 @@ public class TimelineMetricMetadataManager {
   private boolean isDisabled = false;
   // Cache all metadata on retrieval
   private final Map<TimelineMetricMetadataKey, TimelineMetricMetadata> METADATA_CACHE = new ConcurrentHashMap<>();
+  private final Map<String, TimelineMetricMetadataKey> uuidKeyMap = new ConcurrentHashMap<>();
   // Map to lookup apps on a host
-  private final Map<String, Set<String>> HOSTED_APPS_MAP = new ConcurrentHashMap<>();
+  private final Map<String, TimelineMetricHostMetadata> HOSTED_APPS_MAP = new ConcurrentHashMap<>();
+  private final Map<String, String> uuidHostMap = new ConcurrentHashMap<>();
   private final Map<String, Set<String>> INSTANCE_HOST_MAP = new ConcurrentHashMap<>();
   // Sync only when needed
   AtomicBoolean SYNC_HOSTED_APPS_METADATA = new AtomicBoolean(false);
   AtomicBoolean SYNC_HOSTED_INSTANCES_METADATA = new AtomicBoolean(false);
+  private MetricUuidGenStrategy uuidGenStrategy = new HashBasedUuidGenStrategy();
+  private static final int timelineMetricUuidLength = 16;
+  private static final int hostnameUuidLength = 4;
 
   // Single thread to sync back new writes to the store
   private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
@@ -81,6 +91,8 @@ public class TimelineMetricMetadataManager {
     if (!StringUtils.isEmpty(patternStrings)) {
       metricNameFilters.addAll(Arrays.asList(patternStrings.split(",")));
     }
+
+    uuidGenStrategy = getUuidStrategy(metricsConf);
   }
 
   public TimelineMetricMetadataManager(PhoenixHBaseAccessor hBaseAccessor) throws MalformedURLException, URISyntaxException {
@@ -108,11 +120,14 @@ public class TimelineMetricMetadataManager {
         // Store in the cache
         METADATA_CACHE.putAll(metadata);
 
-        Map<String, Set<String>> hostedAppData = getHostedAppsFromStore();
+        Map<String, TimelineMetricHostMetadata> hostedAppData = getHostedAppsFromStore();
 
         LOG.info("Retrieved " + hostedAppData.size() + " host objects from store.");
         HOSTED_APPS_MAP.putAll(hostedAppData);
 
+        loadUuidMapsOnInit();
+
+        hBaseAccessor.setMetadataInstance(this);
       } catch (SQLException e) {
         LOG.warn("Exception loading metric metadata", e);
       }
@@ -127,7 +142,7 @@ public class TimelineMetricMetadataManager {
     return METADATA_CACHE.get(key);
   }
 
-  public Map<String, Set<String>> getHostedAppsCache() {
+  public Map<String, TimelineMetricHostMetadata> getHostedAppsCache() {
     return HOSTED_APPS_MAP;
   }
 
@@ -172,7 +187,7 @@ public class TimelineMetricMetadataManager {
     }
 
     TimelineMetricMetadataKey key = new TimelineMetricMetadataKey(
-      metadata.getMetricName(), metadata.getAppId());
+      metadata.getMetricName(), metadata.getAppId(), metadata.getInstanceId());
 
     TimelineMetricMetadata metadataFromCache = METADATA_CACHE.get(key);
 
@@ -197,10 +212,15 @@ public class TimelineMetricMetadataManager {
    * @param appId Application Id
    */
   public void putIfModifiedHostedAppsMetadata(String hostname, String appId) {
-    Set<String> apps = HOSTED_APPS_MAP.get(hostname);
+    TimelineMetricHostMetadata timelineMetricHostMetadata = HOSTED_APPS_MAP.get(hostname);
+    Set<String> apps = (timelineMetricHostMetadata != null) ? timelineMetricHostMetadata.getHostedApps() : null;
     if (apps == null) {
       apps = new HashSet<>();
-      HOSTED_APPS_MAP.put(hostname, apps);
+      if (timelineMetricHostMetadata == null) {
+        HOSTED_APPS_MAP.put(hostname, new TimelineMetricHostMetadata(apps));
+      } else {
+        HOSTED_APPS_MAP.get(hostname).setHostedApps(apps);
+      }
     }
 
     if (!apps.contains(appId)) {
@@ -230,7 +250,7 @@ public class TimelineMetricMetadataManager {
     hBaseAccessor.saveMetricMetadata(metadata);
   }
 
-  public void persistHostedAppsMetadata(Map<String, Set<String>> hostedApps) throws SQLException {
+  public void persistHostedAppsMetadata(Map<String, TimelineMetricHostMetadata> hostedApps) throws SQLException {
     hBaseAccessor.saveHostAppsMetadata(hostedApps);
   }
 
@@ -242,6 +262,7 @@ public class TimelineMetricMetadataManager {
     return new TimelineMetricMetadata(
       timelineMetric.getMetricName(),
       timelineMetric.getAppId(),
+      timelineMetric.getInstanceId(),
       timelineMetric.getUnits(),
       timelineMetric.getType(),
       timelineMetric.getStartTime(),
@@ -255,7 +276,7 @@ public class TimelineMetricMetadataManager {
   }
 
   boolean isDistributedModeEnabled() {
-    return metricsConf.get("timeline.metrics.service.operation.mode", "").equals("distributed");
+    return metricsConf.get("timeline.metrics.service.operation.mode").equals("distributed");
   }
 
   /**
@@ -270,7 +291,7 @@ public class TimelineMetricMetadataManager {
    * Fetch hosted apps from store
    * @throws SQLException
    */
-  Map<String, Set<String>> getHostedAppsFromStore() throws SQLException {
+  Map<String, TimelineMetricHostMetadata> getHostedAppsFromStore() throws SQLException {
     return hBaseAccessor.getHostedAppsMetadata();
   }
 
@@ -282,4 +303,255 @@ public class TimelineMetricMetadataManager {
     return MapUtils.isEmpty(metric.getMetadata()) ||
       !(String.valueOf(true).equals(metric.getMetadata().get("skipAggregation")));
   }
+
+  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+  // UUID Management
+  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+  /**
+   * Load the UUID mappings from the UUID table on startup.
+   */
+  private void loadUuidMapsOnInit() {
+
+    for (TimelineMetricMetadataKey key : METADATA_CACHE.keySet()) {
+      TimelineMetricMetadata timelineMetricMetadata = METADATA_CACHE.get(key);
+      if (timelineMetricMetadata != null && timelineMetricMetadata.getUuid() != null) {
+        uuidKeyMap.put(new String(timelineMetricMetadata.getUuid()), key);
+      }
+    }
+
+    for (String host : HOSTED_APPS_MAP.keySet()) {
+      TimelineMetricHostMetadata timelineMetricHostMetadata = HOSTED_APPS_MAP.get(host);
+      if (timelineMetricHostMetadata != null && timelineMetricHostMetadata.getUuid() != null) {
+        uuidHostMap.put(new String(timelineMetricHostMetadata.getUuid()), host);
+      }
+    }
+  }
+
+  /**
+   * Returns the UUID gen strategy.
+   * @param configuration
+   * @return
+   */
+  private MetricUuidGenStrategy getUuidStrategy(Configuration configuration) {
+    String strategy = configuration.get(TIMELINE_METRICS_UUID_GEN_STRATEGY, "");
+    if ("random".equalsIgnoreCase(strategy)) {
+      return new RandomUuidGenStrategy();
+    } else {
+      return new HashBasedUuidGenStrategy();
+    }
+  }
+
+  /**
+   * Given the hostname, generates a byte array of length 'hostnameUuidLength'
+   * @param hostname
+   * @return uuid byte array of length 'hostnameUuidLength'
+   */
+  private byte[] getUuidForHostname(String hostname) {
+
+    TimelineMetricHostMetadata timelineMetricHostMetadata = HOSTED_APPS_MAP.get(hostname);
+    if (timelineMetricHostMetadata != null) {
+      byte[] uuid = timelineMetricHostMetadata.getUuid();
+      if (uuid != null) {
+        return uuid;
+      }
+    }
+
+    byte[] uuid = uuidGenStrategy.computeUuid(hostname, hostnameUuidLength);
+
+    String uuidStr = new String(uuid);
+    if (uuidHostMap.containsKey(uuidStr)) {
+      LOG.error("Duplicate key computed for " + hostname +", Collides with  " + uuidHostMap.get(uuidStr));
+      return null;
+    }
+
+    if (timelineMetricHostMetadata == null) {
+      timelineMetricHostMetadata = new TimelineMetricHostMetadata();
+      HOSTED_APPS_MAP.put(hostname, timelineMetricHostMetadata);
+    }
+    timelineMetricHostMetadata.setUuid(uuid);
+    uuidHostMap.put(uuidStr, hostname);
+
+    return uuid;
+  }
+
+  /**
+   * Given a timelineClusterMetric instance, generates a UUID for Metric-App-Instance combination.
+   * @param timelineClusterMetric
+   * @return uuid byte array of length 'timelineMetricUuidLength'
+   */
+  public byte[] getUuid(TimelineClusterMetric timelineClusterMetric) {
+    TimelineMetricMetadataKey key = new TimelineMetricMetadataKey(timelineClusterMetric.getMetricName(),
+      timelineClusterMetric.getAppId(), timelineClusterMetric.getInstanceId());
+
+    TimelineMetricMetadata timelineMetricMetadata = METADATA_CACHE.get(key);
+    if (timelineMetricMetadata != null) {
+      byte[] uuid = timelineMetricMetadata.getUuid();
+      if (uuid != null) {
+        return uuid;
+      }
+    }
+
+    byte[] uuid = uuidGenStrategy.computeUuid(timelineClusterMetric, timelineMetricUuidLength);
+
+    String uuidStr = new String(uuid);
+    if (uuidKeyMap.containsKey(uuidStr) && !uuidKeyMap.get(uuidStr).equals(key)) {
+      TimelineMetricMetadataKey collidingKey = (TimelineMetricMetadataKey)uuidKeyMap.get(uuidStr);
+      LOG.error("Duplicate key " + Arrays.toString(uuid) + "(" + uuid +  ") computed for " + timelineClusterMetric.toString() + ", Collides with  " + collidingKey.toString());
+      return null;
+    }
+
+    if (timelineMetricMetadata == null) {
+      timelineMetricMetadata = new TimelineMetricMetadata();
+      timelineMetricMetadata.setMetricName(timelineClusterMetric.getMetricName());
+      timelineMetricMetadata.setAppId(timelineClusterMetric.getAppId());
+      timelineMetricMetadata.setInstanceId(timelineClusterMetric.getInstanceId());
+      METADATA_CACHE.put(key, timelineMetricMetadata);
+    }
+
+    timelineMetricMetadata.setUuid(uuid);
+    timelineMetricMetadata.setIsPersisted(false);
+    uuidKeyMap.put(uuidStr, key);
+    return uuid;
+  }
+
+  /**
+   * Given a timelineMetric instance, generates a UUID for Metric-App-Instance combination.
+   * @param timelineMetric
+   * @return uuid byte array of length 'timelineMetricUuidLength' + 'hostnameUuidLength'
+   */
+  public byte[] getUuid(TimelineMetric timelineMetric) {
+
+    byte[] metricUuid = getUuid(new TimelineClusterMetric(timelineMetric.getMetricName(), timelineMetric.getAppId(),
+      timelineMetric.getInstanceId(), -1l));
+    byte[] hostUuid = getUuidForHostname(timelineMetric.getHostName());
+
+    return ArrayUtils.addAll(metricUuid, hostUuid);
+  }
+
+  public String getMetricNameFromUuid(byte[]  uuid) {
+
+    byte[] metricUuid = uuid;
+    if (uuid.length == timelineMetricUuidLength + hostnameUuidLength) {
+      metricUuid = ArrayUtils.subarray(uuid, 0, timelineMetricUuidLength);
+    }
+
+    TimelineMetricMetadataKey key = uuidKeyMap.get(new String(metricUuid));
+    return key != null ? key.getMetricName() : null;
+  }
+
+  public TimelineMetric getMetricFromUuid(byte[] uuid) {
+    if (uuid == null) {
+      return null;
+    }
+
+    if (uuid.length == timelineMetricUuidLength) {
+      TimelineMetricMetadataKey key = uuidKeyMap.get(new String(uuid));
+      return key != null ? new TimelineMetric(key.metricName, null, key.appId, key.instanceId) : null;
+    } else {
+      byte[] metricUuid = ArrayUtils.subarray(uuid, 0, timelineMetricUuidLength);
+      TimelineMetricMetadataKey key = uuidKeyMap.get(new String(metricUuid));
+      if (key == null) {
+        LOG.error("TimelineMetricMetadataKey is null for : " + Arrays.toString(uuid));
+        return null;
+      }
+      TimelineMetric timelineMetric = new TimelineMetric();
+      timelineMetric.setMetricName(key.metricName);
+      timelineMetric.setAppId(key.appId);
+      timelineMetric.setInstanceId(key.instanceId);
+
+      byte[] hostUuid = ArrayUtils.subarray(uuid, timelineMetricUuidLength, hostnameUuidLength + timelineMetricUuidLength);
+      timelineMetric.setHostName(uuidHostMap.get(new String(hostUuid)));
+      return timelineMetric;
+    }
+  }
+
+  /**
+   * Returns the set of UUIDs for a given GET request. If there are wildcards (%), resolves them based on UUID map.
+   * @param metricNames
+   * @param hostnames
+   * @param appId
+   * @param instanceId
+   * @return Set of UUIds
+   */
+  public List<byte[]> getUuids(Collection<String> metricNames, List<String> hostnames, String appId, String instanceId) {
+
+    Collection<String> sanitizedMetricNames = new HashSet<>();
+
+    for (String metricName : metricNames) {
+      if (metricName.contains("%")) {
+        String metricRegEx;
+        //Special case handling for metric name with * and __%.
+        //For example, dfs.NNTopUserOpCounts.windowMs=300000.op=*.user=%.count
+        // or dfs.NNTopUserOpCounts.windowMs=300000.op=__%.user=%.count
+        if (metricName.contains("*") || metricName.contains("__%")) {
+          String metricNameWithEscSeq = metricName.replace("*", "\\*").replace("__%", "..%");
+          metricRegEx = metricNameWithEscSeq.replace("%", ".*");
+        } else {
+          metricRegEx = metricName.replace("%", ".*");
+        }
+        for (TimelineMetricMetadataKey key : METADATA_CACHE.keySet()) {
+          String metricNameFromMetadata = key.getMetricName();
+          if (metricNameFromMetadata.matches(metricRegEx)) {
+            sanitizedMetricNames.add(metricNameFromMetadata);
+          }
+        }
+      } else {
+        sanitizedMetricNames.add(metricName);
+      }
+    }
+
+    Set<String> sanitizedHostNames = new HashSet<>();
+    if (CollectionUtils.isNotEmpty(hostnames)) {
+      for (String hostname : hostnames) {
+        if (hostname.contains("%")) {
+          String hostRegEx;
+          hostRegEx = hostname.replace("%", ".*");
+          for (String host : HOSTED_APPS_MAP.keySet()) {
+            if (host.matches(hostRegEx)) {
+              sanitizedHostNames.add(host);
+            }
+          }
+        } else {
+          sanitizedHostNames.add(hostname);
+        }
+      }
+    }
+
+    List<byte[]> uuids = new ArrayList<>();
+
+    if (!(appId.equals("HOST") || appId.equals("FLUME_HANDLER"))) { //HACK.. Why??
+      appId = appId.toLowerCase();
+    }
+    if (CollectionUtils.isNotEmpty(sanitizedHostNames)) {
+      for (String metricName : sanitizedMetricNames) {
+        TimelineMetric metric = new TimelineMetric();
+        metric.setMetricName(metricName);
+        metric.setAppId(appId);
+        metric.setInstanceId(instanceId);
+        for (String hostname : sanitizedHostNames) {
+          metric.setHostName(hostname);
+          byte[] uuid = getUuid(metric);
+          if (uuid != null) {
+            uuids.add(uuid);
+          }
+        }
+      }
+    } else {
+      for (String metricName : sanitizedMetricNames) {
+        TimelineClusterMetric metric = new TimelineClusterMetric(metricName, appId, instanceId, -1l);
+        byte[] uuid = getUuid(metric);
+        if (uuid != null) {
+          uuids.add(uuid);
+        }
+      }
+    }
+
+    return uuids;
+  }
+
+  public Map<String, TimelineMetricMetadataKey> getUuidKeyMap() {
+    return uuidKeyMap;
+  }
 }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TimelineMetricMetadataSync.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TimelineMetricMetadataSync.java
index 6d519f6..f808cd7 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TimelineMetricMetadataSync.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TimelineMetricMetadataSync.java
@@ -81,7 +81,7 @@ public class TimelineMetricMetadataSync implements Runnable {
     if (markSuccess) {
       for (TimelineMetricMetadata metadata : metadataToPersist) {
         TimelineMetricMetadataKey key = new TimelineMetricMetadataKey(
-          metadata.getMetricName(), metadata.getAppId()
+          metadata.getMetricName(), metadata.getAppId(), metadata.getInstanceId()
         );
 
         // Mark entry as being persisted
@@ -119,7 +119,7 @@ public class TimelineMetricMetadataSync implements Runnable {
    */
   private void persistHostAppsMetadata() {
     if (cacheManager.syncHostedAppsMetadata()) {
-      Map<String, Set<String>> persistedData = null;
+      Map<String, TimelineMetricHostMetadata> persistedData = null;
       try {
         persistedData = cacheManager.getHostedAppsFromStore();
       } catch (SQLException e) {
@@ -127,14 +127,14 @@ public class TimelineMetricMetadataSync implements Runnable {
         return; // Something wrong with store
       }
 
-      Map<String, Set<String>> cachedData = cacheManager.getHostedAppsCache();
-      Map<String, Set<String>> dataToSync = new HashMap<>();
+      Map<String, TimelineMetricHostMetadata> cachedData = cacheManager.getHostedAppsCache();
+      Map<String, TimelineMetricHostMetadata> dataToSync = new HashMap<>();
       if (cachedData != null && !cachedData.isEmpty()) {
-        for (Map.Entry<String, Set<String>> cacheEntry : cachedData.entrySet()) {
+        for (Map.Entry<String, TimelineMetricHostMetadata> cacheEntry : cachedData.entrySet()) {
           // No persistence / stale data in store
           if (persistedData == null || persistedData.isEmpty() ||
             !persistedData.containsKey(cacheEntry.getKey()) ||
-            !persistedData.get(cacheEntry.getKey()).containsAll(cacheEntry.getValue())) {
+            !persistedData.get(cacheEntry.getKey()).getHostedApps().containsAll(cacheEntry.getValue().getHostedApps())) {
             dataToSync.put(cacheEntry.getKey(), cacheEntry.getValue());
           }
         }
@@ -189,16 +189,16 @@ public class TimelineMetricMetadataSync implements Runnable {
    * Read all hosted apps metadata and update cached values - HA
    */
   private void refreshHostAppsMetadata() {
-    Map<String, Set<String>> hostedAppsDataFromStore = null;
+    Map<String, TimelineMetricHostMetadata> hostedAppsDataFromStore = null;
     try {
       hostedAppsDataFromStore = cacheManager.getHostedAppsFromStore();
     } catch (SQLException e) {
       LOG.warn("Error refreshing metadata from store.", e);
     }
     if (hostedAppsDataFromStore != null) {
-      Map<String, Set<String>> cachedData = cacheManager.getHostedAppsCache();
+      Map<String, TimelineMetricHostMetadata> cachedData = cacheManager.getHostedAppsCache();
 
-      for (Map.Entry<String, Set<String>> storeEntry : hostedAppsDataFromStore.entrySet()) {
+      for (Map.Entry<String, TimelineMetricHostMetadata> storeEntry : hostedAppsDataFromStore.entrySet()) {
         if (!cachedData.containsKey(storeEntry.getKey())) {
           cachedData.put(storeEntry.getKey(), storeEntry.getValue());
         }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/Condition.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/Condition.java
index 9aa64bd..9714e1a 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/Condition.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/Condition.java
@@ -24,6 +24,7 @@ import java.util.List;
 public interface Condition {
   boolean isEmpty();
 
+  List<byte[]> getUuids();
   List<String> getMetricNames();
   boolean isPointInTime();
   boolean isGrouped();
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/ConditionBuilder.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/ConditionBuilder.java
index 32c1e84..f395c3e 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/ConditionBuilder.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/ConditionBuilder.java
@@ -42,6 +42,7 @@ public class ConditionBuilder {
   private Integer topN;
   private boolean isBottomN;
   private Function topNFunction;
+  private List<byte[]> uuids;
 
   public ConditionBuilder(List<String> metricNames) {
     this.metricNames = metricNames;
@@ -122,14 +123,19 @@ public class ConditionBuilder {
     return this;
   }
 
+  public ConditionBuilder uuid(List<byte[]> uuids) {
+    this.uuids = uuids;
+    return this;
+  }
+
   public Condition build() {
     if (topN == null) {
       return new DefaultCondition(
-        metricNames,
+        uuids, metricNames,
         hostnames, appId, instanceId, startTime, endTime,
         precision, limit, grouped);
     } else {
-      return new TopNCondition(metricNames, hostnames, appId, instanceId,
+      return new TopNCondition(uuids, metricNames, hostnames, appId, instanceId,
         startTime, endTime, precision, limit, grouped, topN, topNFunction, isBottomN);
     }
   }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/DefaultCondition.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/DefaultCondition.java
index a4f7014..3c03dca 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/DefaultCondition.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/DefaultCondition.java
@@ -43,6 +43,7 @@ public class DefaultCondition implements Condition {
   String statement;
   Set<String> orderByColumns = new LinkedHashSet<String>();
   boolean metricNamesNotCondition = false;
+  List<byte[]> uuids = new ArrayList<>();
 
   private static final Log LOG = LogFactory.getLog(DefaultCondition.class);
 
@@ -60,6 +61,21 @@ public class DefaultCondition implements Condition {
     this.grouped = grouped;
   }
 
+  public DefaultCondition(List<byte[]> uuids, List<String> metricNames, List<String> hostnames, String appId,
+                          String instanceId, Long startTime, Long endTime, Precision precision,
+                          Integer limit, boolean grouped) {
+    this.uuids = uuids;
+    this.metricNames = metricNames;
+    this.hostnames = hostnames;
+    this.appId = appId;
+    this.instanceId = instanceId;
+    this.startTime = startTime;
+    this.endTime = endTime;
+    this.precision = precision;
+    this.limit = limit;
+    this.grouped = grouped;
+  }
+
   public String getStatement() {
     return statement;
   }
@@ -74,13 +90,7 @@ public class DefaultCondition implements Condition {
 
   public StringBuilder getConditionClause() {
     StringBuilder sb = new StringBuilder();
-
-    boolean appendConjunction = appendMetricNameClause(sb);
-
-    appendConjunction = appendHostnameClause(sb, appendConjunction);
-
-    appendConjunction = append(sb, appendConjunction, getAppId(), " APP_ID = ?");
-    appendConjunction = append(sb, appendConjunction, getInstanceId(), " INSTANCE_ID = ?");
+    boolean appendConjunction = appendUuidClause(sb);
     appendConjunction = append(sb, appendConjunction, getStartTime(), " SERVER_TIME >= ?");
     append(sb, appendConjunction, getEndTime(), " SERVER_TIME < ?");
 
@@ -216,6 +226,37 @@ public class DefaultCondition implements Condition {
     return null;
   }
 
+  protected boolean appendUuidClause(StringBuilder sb) {
+    boolean appendConjunction = false;
+
+    if (CollectionUtils.isNotEmpty(uuids)) {
+      // Put a '(' first
+      sb.append("(");
+
+      //IN clause
+      // UUID (NOT) IN (?,?,?,?)
+      if (CollectionUtils.isNotEmpty(uuids)) {
+        sb.append("UUID");
+        if (metricNamesNotCondition) {
+          sb.append(" NOT");
+        }
+        sb.append(" IN (");
+        //Append ?,?,?,?
+        for (int i = 0; i < uuids.size(); i++) {
+          sb.append("?");
+          if (i < uuids.size() - 1) {
+            sb.append(", ");
+          }
+        }
+        sb.append(")");
+      }
+      appendConjunction = true;
+      sb.append(")");
+    }
+
+    return appendConjunction;
+  }
+
   protected boolean appendMetricNameClause(StringBuilder sb) {
     boolean appendConjunction = false;
     List<String> metricsLike = new ArrayList<>();
@@ -381,4 +422,9 @@ public class DefaultCondition implements Condition {
   public void setMetricNamesNotCondition(boolean metricNamesNotCondition) {
     this.metricNamesNotCondition = metricNamesNotCondition;
   }
+
+  @Override
+  public List<byte[]> getUuids() {
+    return uuids;
+  }
 }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/EmptyCondition.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/EmptyCondition.java
index 43ab88c..b667df3 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/EmptyCondition.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/EmptyCondition.java
@@ -35,6 +35,11 @@ public class EmptyCondition implements Condition {
   }
 
   @Override
+  public List<byte[]> getUuids() {
+    return null;
+  }
+
+  @Override
   public List<String> getMetricNames() {
     return null;
   }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/PhoenixTransactSQL.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/PhoenixTransactSQL.java
index e55ff61..25e9a02 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/PhoenixTransactSQL.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/PhoenixTransactSQL.java
@@ -40,20 +40,15 @@ public class PhoenixTransactSQL {
    * Create table to store individual metric records.
    */
   public static final String CREATE_METRICS_TABLE_SQL = "CREATE TABLE IF NOT " +
-    "EXISTS METRIC_RECORD (METRIC_NAME VARCHAR, " +
-    "HOSTNAME VARCHAR, " +
-    "SERVER_TIME UNSIGNED_LONG NOT NULL, " +
-    "APP_ID VARCHAR, " +
-    "INSTANCE_ID VARCHAR, " +
+    "EXISTS METRIC_RECORD (UUID BINARY(20) NOT NULL, " +
+    "SERVER_TIME BIGINT NOT NULL, " +
     "START_TIME UNSIGNED_LONG, " +
-    "UNITS CHAR(20), " +
     "METRIC_SUM DOUBLE, " +
     "METRIC_COUNT UNSIGNED_INT, " +
     "METRIC_MAX DOUBLE, " +
     "METRIC_MIN DOUBLE, " +
     "METRICS VARCHAR CONSTRAINT pk " +
-    "PRIMARY KEY (METRIC_NAME, HOSTNAME, SERVER_TIME, APP_ID, " +
-    "INSTANCE_ID)) DATA_BLOCK_ENCODING='%s', IMMUTABLE_ROWS=true, " +
+    "PRIMARY KEY (UUID, SERVER_TIME)) DATA_BLOCK_ENCODING='%s', IMMUTABLE_ROWS=true, " +
     "TTL=%s, COMPRESSION='%s'";
 
   public static final String CREATE_CONTAINER_METRICS_TABLE_SQL =
@@ -85,55 +80,44 @@ public class PhoenixTransactSQL {
 
   public static final String CREATE_METRICS_AGGREGATE_TABLE_SQL =
     "CREATE TABLE IF NOT EXISTS %s " +
-      "(METRIC_NAME VARCHAR, " +
-      "HOSTNAME VARCHAR, " +
-      "APP_ID VARCHAR, " +
-      "INSTANCE_ID VARCHAR, " +
+      "(UUID BINARY(20) NOT NULL, " +
       "SERVER_TIME UNSIGNED_LONG NOT NULL, " +
-      "UNITS CHAR(20), " +
       "METRIC_SUM DOUBLE," +
       "METRIC_COUNT UNSIGNED_INT, " +
       "METRIC_MAX DOUBLE," +
       "METRIC_MIN DOUBLE CONSTRAINT pk " +
-      "PRIMARY KEY (METRIC_NAME, HOSTNAME, APP_ID, INSTANCE_ID, " +
-      "SERVER_TIME)) DATA_BLOCK_ENCODING='%s', IMMUTABLE_ROWS=true, TTL=%s," +
+      "PRIMARY KEY (UUID, SERVER_TIME)) DATA_BLOCK_ENCODING='%s', IMMUTABLE_ROWS=true, TTL=%s," +
       " COMPRESSION='%s'";
 
   public static final String CREATE_METRICS_CLUSTER_AGGREGATE_TABLE_SQL =
     "CREATE TABLE IF NOT EXISTS %s " +
-      "(METRIC_NAME VARCHAR, " +
-      "APP_ID VARCHAR, " +
-      "INSTANCE_ID VARCHAR, " +
+      "(UUID BINARY(16) NOT NULL, " +
       "SERVER_TIME UNSIGNED_LONG NOT NULL, " +
-      "UNITS CHAR(20), " +
       "METRIC_SUM DOUBLE, " +
       "HOSTS_COUNT UNSIGNED_INT, " +
       "METRIC_MAX DOUBLE, " +
       "METRIC_MIN DOUBLE " +
-      "CONSTRAINT pk PRIMARY KEY (METRIC_NAME, APP_ID, INSTANCE_ID, " +
-      "SERVER_TIME)) DATA_BLOCK_ENCODING='%s', IMMUTABLE_ROWS=true, " +
+      "CONSTRAINT pk PRIMARY KEY (UUID, SERVER_TIME)) DATA_BLOCK_ENCODING='%s', IMMUTABLE_ROWS=true, " +
       "TTL=%s, COMPRESSION='%s'";
 
   // HOSTS_COUNT vs METRIC_COUNT
   public static final String CREATE_METRICS_CLUSTER_AGGREGATE_GROUPED_TABLE_SQL =
     "CREATE TABLE IF NOT EXISTS %s " +
-      "(METRIC_NAME VARCHAR, " +
-      "APP_ID VARCHAR, " +
-      "INSTANCE_ID VARCHAR, " +
+      "(UUID BINARY(16) NOT NULL, " +
       "SERVER_TIME UNSIGNED_LONG NOT NULL, " +
-      "UNITS CHAR(20), " +
       "METRIC_SUM DOUBLE, " +
       "METRIC_COUNT UNSIGNED_INT, " +
       "METRIC_MAX DOUBLE, " +
       "METRIC_MIN DOUBLE " +
-      "CONSTRAINT pk PRIMARY KEY (METRIC_NAME, APP_ID, INSTANCE_ID, " +
-      "SERVER_TIME)) DATA_BLOCK_ENCODING='%s', IMMUTABLE_ROWS=true, " +
+      "CONSTRAINT pk PRIMARY KEY (UUID, SERVER_TIME)) DATA_BLOCK_ENCODING='%s', IMMUTABLE_ROWS=true, " +
       "TTL=%s, COMPRESSION='%s'";
 
   public static final String CREATE_METRICS_METADATA_TABLE_SQL =
     "CREATE TABLE IF NOT EXISTS METRICS_METADATA " +
       "(METRIC_NAME VARCHAR, " +
       "APP_ID VARCHAR, " +
+      "INSTANCE_ID VARCHAR, " +
+      "UUID BINARY(16), " +
       "UNITS CHAR(20), " +
       "TYPE CHAR(20), " +
       "START_TIME UNSIGNED_LONG, " +
@@ -144,7 +128,7 @@ public class PhoenixTransactSQL {
 
   public static final String CREATE_HOSTED_APPS_METADATA_TABLE_SQL =
     "CREATE TABLE IF NOT EXISTS HOSTED_APPS_METADATA " +
-      "(HOSTNAME VARCHAR, APP_IDS VARCHAR, " +
+      "(HOSTNAME VARCHAR, UUID BINARY(4), APP_IDS VARCHAR, " +
       "CONSTRAINT pk PRIMARY KEY (HOSTNAME))" +
       "DATA_BLOCK_ENCODING='%s', COMPRESSION='%s'";
 
@@ -166,14 +150,15 @@ public class PhoenixTransactSQL {
    * Insert into metric records table.
    */
   public static final String UPSERT_METRICS_SQL = "UPSERT INTO %s " +
-    "(METRIC_NAME, HOSTNAME, APP_ID, INSTANCE_ID, SERVER_TIME, START_TIME, " +
-    "UNITS, " +
+    "(UUID, " +
+    "SERVER_TIME, " +
+    "START_TIME, " +
     "METRIC_SUM, " +
     "METRIC_MAX, " +
     "METRIC_MIN, " +
     "METRIC_COUNT, " +
     "METRICS) VALUES " +
-    "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+    "(?, ?, ?, ?, ?, ?, ?, ?)";
 
   public static final String UPSERT_CONTAINER_METRICS_SQL = "UPSERT INTO %s " +
       "(APP_ID,"
@@ -201,40 +186,40 @@ public class PhoenixTransactSQL {
       "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
 
   public static final String UPSERT_CLUSTER_AGGREGATE_SQL = "UPSERT INTO " +
-    "%s (METRIC_NAME, APP_ID, INSTANCE_ID, SERVER_TIME, " +
-    "UNITS, " +
+    "%s (UUID, " +
+    "SERVER_TIME, " +
     "METRIC_SUM, " +
     "HOSTS_COUNT, " +
     "METRIC_MAX, " +
     "METRIC_MIN) " +
-    "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
+    "VALUES (?, ?, ?, ?, ?, ?)";
 
   public static final String UPSERT_CLUSTER_AGGREGATE_TIME_SQL = "UPSERT INTO" +
-    " %s (METRIC_NAME, APP_ID, INSTANCE_ID, SERVER_TIME, " +
+    " %s (UUID, SERVER_TIME, " +
     "UNITS, " +
     "METRIC_SUM, " +
     "METRIC_COUNT, " +
     "METRIC_MAX, " +
     "METRIC_MIN) " +
-    "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
+    "VALUES (?, ?, ?, ?, ?, ?)";
 
   public static final String UPSERT_AGGREGATE_RECORD_SQL = "UPSERT INTO " +
-    "%s (METRIC_NAME, HOSTNAME, APP_ID, INSTANCE_ID, " +
+    "%s (UUID, " +
     "SERVER_TIME, " +
     "UNITS, " +
     "METRIC_SUM, " +
     "METRIC_MAX, " +
     "METRIC_MIN," +
     "METRIC_COUNT) " +
-    "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+    "VALUES (?, ?, ?, ?, ?, ?)";
 
   public static final String UPSERT_METADATA_SQL =
-    "UPSERT INTO METRICS_METADATA (METRIC_NAME, APP_ID, UNITS, TYPE, " +
+    "UPSERT INTO METRICS_METADATA (METRIC_NAME, APP_ID, INSTANCE_ID, UUID, UNITS, TYPE, " +
       "START_TIME, SUPPORTS_AGGREGATION, IS_WHITELISTED) " +
-      "VALUES (?, ?, ?, ?, ?, ?, ?)";
+      "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
 
   public static final String UPSERT_HOSTED_APPS_METADATA_SQL =
-    "UPSERT INTO HOSTED_APPS_METADATA (HOSTNAME, APP_IDS) VALUES (?, ?)";
+    "UPSERT INTO HOSTED_APPS_METADATA (HOSTNAME, UUID, APP_IDS) VALUES (?, ?, ?)";
 
   public static final String UPSERT_INSTANCE_HOST_METADATA_SQL =
     "UPSERT INTO INSTANCE_HOST_METADATA (INSTANCE_ID, HOSTNAME) VALUES (?, ?)";
@@ -242,8 +227,7 @@ public class PhoenixTransactSQL {
   /**
    * Retrieve a set of rows from metrics records table.
    */
-  public static final String GET_METRIC_SQL = "SELECT %s METRIC_NAME, " +
-    "HOSTNAME, APP_ID, INSTANCE_ID, SERVER_TIME, START_TIME, UNITS, " +
+  public static final String GET_METRIC_SQL = "SELECT %s UUID, SERVER_TIME, START_TIME, " +
     "METRIC_SUM, " +
     "METRIC_MAX, " +
     "METRIC_MIN, " +
@@ -257,31 +241,24 @@ public class PhoenixTransactSQL {
    * Different queries for a number and a single hosts are used due to bug
    * in Apache Phoenix
    */
-  public static final String GET_LATEST_METRIC_SQL = "SELECT %s " +
-    "E.METRIC_NAME AS METRIC_NAME, E.HOSTNAME AS HOSTNAME, " +
-    "E.APP_ID AS APP_ID, E.INSTANCE_ID AS INSTANCE_ID, " +
+  public static final String GET_LATEST_METRIC_SQL = "SELECT %s E.UUID AS UUID, " +
     "E.SERVER_TIME AS SERVER_TIME, E.START_TIME AS START_TIME, " +
-    "E.UNITS AS UNITS, E.METRIC_SUM AS METRIC_SUM, " +
+    "E.METRIC_SUM AS METRIC_SUM, " +
     "E.METRIC_MAX AS METRIC_MAX, E.METRIC_MIN AS METRIC_MIN, " +
     "E.METRIC_COUNT AS METRIC_COUNT, E.METRICS AS METRICS " +
     "FROM %s AS E " +
     "INNER JOIN " +
-    "(SELECT METRIC_NAME, HOSTNAME, MAX(SERVER_TIME) AS MAX_SERVER_TIME, " +
-    "APP_ID, INSTANCE_ID " +
+    "(SELECT UUID, MAX(SERVER_TIME) AS MAX_SERVER_TIME " +
     "FROM %s " +
     "WHERE " +
     "%s " +
-    "GROUP BY METRIC_NAME, HOSTNAME, APP_ID, INSTANCE_ID) " +
+    "GROUP BY UUID) " +
     "AS I " +
-    "ON E.METRIC_NAME=I.METRIC_NAME " +
-    "AND E.HOSTNAME=I.HOSTNAME " +
-    "AND E.SERVER_TIME=I.MAX_SERVER_TIME " +
-    "AND E.APP_ID=I.APP_ID " +
-    "AND E.INSTANCE_ID=I.INSTANCE_ID";
-
-  public static final String GET_METRIC_AGGREGATE_ONLY_SQL = "SELECT %s " +
-    "METRIC_NAME, HOSTNAME, APP_ID, INSTANCE_ID, SERVER_TIME, " +
-    "UNITS, " +
+    "ON E.UUID=I.UUID " +
+    "AND E.SERVER_TIME=I.MAX_SERVER_TIME";
+
+  public static final String GET_METRIC_AGGREGATE_ONLY_SQL = "SELECT %s UUID, " +
+    "SERVER_TIME, " +
     "METRIC_SUM, " +
     "METRIC_MAX, " +
     "METRIC_MIN, " +
@@ -289,9 +266,8 @@ public class PhoenixTransactSQL {
     "FROM %s";
 
   public static final String GET_CLUSTER_AGGREGATE_SQL = "SELECT %s " +
-    "METRIC_NAME, APP_ID, " +
-    "INSTANCE_ID, SERVER_TIME, " +
-    "UNITS, " +
+    "UUID, " +
+    "SERVER_TIME, " +
     "METRIC_SUM, " +
     "HOSTS_COUNT, " +
     "METRIC_MAX, " +
@@ -299,24 +275,23 @@ public class PhoenixTransactSQL {
     "FROM %s";
 
   public static final String GET_CLUSTER_AGGREGATE_TIME_SQL = "SELECT %s " +
-    "METRIC_NAME, APP_ID, " +
-    "INSTANCE_ID, SERVER_TIME, " +
-    "UNITS, " +
+    "UUID, " +
+    "SERVER_TIME, " +
     "METRIC_SUM, " +
     "METRIC_COUNT, " +
     "METRIC_MAX, " +
     "METRIC_MIN " +
     "FROM %s";
 
-  public static final String TOP_N_INNER_SQL = "SELECT %s %s " +
-    "FROM %s WHERE %s GROUP BY %s ORDER BY %s LIMIT %s";
+  public static final String TOP_N_INNER_SQL = "SELECT %s UUID " +
+    "FROM %s WHERE %s GROUP BY UUID ORDER BY %s LIMIT %s";
 
   public static final String GET_METRIC_METADATA_SQL = "SELECT " +
-    "METRIC_NAME, APP_ID, UNITS, TYPE, START_TIME, " +
+    "METRIC_NAME, APP_ID, INSTANCE_ID, UUID, UNITS, TYPE, START_TIME, " +
     "SUPPORTS_AGGREGATION, IS_WHITELISTED FROM METRICS_METADATA";
 
   public static final String GET_HOSTED_APPS_METADATA_SQL = "SELECT " +
-    "HOSTNAME, APP_IDS FROM HOSTED_APPS_METADATA";
+    "HOSTNAME, UUID, APP_IDS FROM HOSTED_APPS_METADATA";
 
   public static final String GET_INSTANCE_HOST_METADATA_SQL = "SELECT " +
     "INSTANCE_ID, HOSTNAME FROM INSTANCE_HOST_METADATA";
@@ -325,44 +300,41 @@ public class PhoenixTransactSQL {
    * Aggregate host metrics using a GROUP BY clause to take advantage of
    * N - way parallel scan where N = number of regions.
    */
-  public static final String GET_AGGREGATED_HOST_METRIC_GROUPBY_SQL = "UPSERT %s " +
-    "INTO %s (METRIC_NAME, HOSTNAME, APP_ID, INSTANCE_ID, SERVER_TIME, UNITS, " +
-    "METRIC_SUM, METRIC_COUNT, METRIC_MAX, METRIC_MIN) " +
-    "SELECT METRIC_NAME, HOSTNAME, APP_ID, INSTANCE_ID, %s AS SERVER_TIME, UNITS, " +
+  public static final String GET_AGGREGATED_HOST_METRIC_GROUPBY_SQL = "UPSERT " +
+    "INTO %s (UUID, SERVER_TIME, METRIC_SUM, METRIC_COUNT, METRIC_MAX, METRIC_MIN) " +
+    "SELECT UUID, %s AS SERVER_TIME, " +
     "ROUND(SUM(METRIC_SUM)/SUM(METRIC_COUNT),2), SUM(METRIC_COUNT), MAX(METRIC_MAX), MIN(METRIC_MIN) " +
     "FROM %s WHERE%s SERVER_TIME > %s AND SERVER_TIME <= %s " +
-    "GROUP BY METRIC_NAME, HOSTNAME, APP_ID, INSTANCE_ID, UNITS";
+    "GROUP BY UUID";
 
   /**
    * Downsample host metrics.
    */
-  public static final String DOWNSAMPLE_HOST_METRIC_SQL_UPSERT_PREFIX = "UPSERT %s INTO %s (METRIC_NAME, HOSTNAME, " +
-    "APP_ID, INSTANCE_ID, SERVER_TIME, UNITS, METRIC_SUM, METRIC_COUNT, METRIC_MAX, METRIC_MIN) ";
+  public static final String DOWNSAMPLE_HOST_METRIC_SQL_UPSERT_PREFIX = "UPSERT %s INTO %s (UUID, SERVER_TIME, " +
+    "METRIC_SUM, METRIC_COUNT, METRIC_MAX, METRIC_MIN) ";
 
-  public static final String TOPN_DOWNSAMPLER_HOST_METRIC_SELECT_SQL = "SELECT METRIC_NAME, HOSTNAME, APP_ID, INSTANCE_ID, " +
-    "%s AS SERVER_TIME, UNITS, %s, 1, %s, %s FROM %s WHERE METRIC_NAME LIKE %s AND SERVER_TIME > %s AND SERVER_TIME <= %s " +
-    "GROUP BY METRIC_NAME, HOSTNAME, APP_ID, INSTANCE_ID, UNITS ORDER BY %s DESC LIMIT %s";
+  public static final String TOPN_DOWNSAMPLER_HOST_METRIC_SELECT_SQL = "SELECT UUID, " +
+    "%s AS SERVER_TIME, %s, 1, %s, %s FROM %s WHERE UUID IN %s AND SERVER_TIME > %s AND SERVER_TIME <= %s " +
+    "GROUP BY UUID ORDER BY %s DESC LIMIT %s";
 
   /**
    * Aggregate app metrics using a GROUP BY clause to take advantage of
    * N - way parallel scan where N = number of regions.
    */
   public static final String GET_AGGREGATED_APP_METRIC_GROUPBY_SQL = "UPSERT %s " +
-    "INTO %s (METRIC_NAME, APP_ID, INSTANCE_ID, SERVER_TIME, UNITS, " +
-    "METRIC_SUM, METRIC_COUNT, METRIC_MAX, METRIC_MIN) SELECT METRIC_NAME, APP_ID, " +
-    "INSTANCE_ID, %s AS SERVER_TIME, UNITS, ROUND(AVG(METRIC_SUM),2), ROUND(AVG(%s)), " +
-    "MAX(METRIC_MAX), MIN(METRIC_MIN) FROM %s WHERE%s SERVER_TIME > %s AND " +
-    "SERVER_TIME <= %s GROUP BY METRIC_NAME, APP_ID, INSTANCE_ID, UNITS";
+         "INTO %s (UUID, SERVER_TIME, METRIC_SUM, METRIC_COUNT, METRIC_MAX, METRIC_MIN) SELECT UUID, %s AS SERVER_TIME, " +
+         "ROUND(AVG(METRIC_SUM),2), ROUND(AVG(%s)), MAX(METRIC_MAX), MIN(METRIC_MIN) FROM %s WHERE%s SERVER_TIME > %s AND " +
+         "SERVER_TIME <= %s GROUP BY UUID";
 
   /**
    * Downsample cluster metrics.
    */
-  public static final String DOWNSAMPLE_CLUSTER_METRIC_SQL_UPSERT_PREFIX = "UPSERT %s INTO %s (METRIC_NAME, APP_ID, " +
-    "INSTANCE_ID, SERVER_TIME, UNITS, METRIC_SUM, METRIC_COUNT, METRIC_MAX, METRIC_MIN) ";
+  public static final String DOWNSAMPLE_CLUSTER_METRIC_SQL_UPSERT_PREFIX = "UPSERT %s INTO %s (UUID, SERVER_TIME, " +
+    "METRIC_SUM, METRIC_COUNT, METRIC_MAX, METRIC_MIN) ";
 
-  public static final String TOPN_DOWNSAMPLER_CLUSTER_METRIC_SELECT_SQL = "SELECT METRIC_NAME, APP_ID, INSTANCE_ID," +
-    " %s AS SERVER_TIME, UNITS, %s, 1, %s, %s FROM %s WHERE METRIC_NAME LIKE %s AND SERVER_TIME > %s AND SERVER_TIME <= %s " +
-    "GROUP BY METRIC_NAME, APP_ID, INSTANCE_ID, UNITS ORDER BY %s DESC LIMIT %s";
+  public static final String TOPN_DOWNSAMPLER_CLUSTER_METRIC_SELECT_SQL = "SELECT UUID, " +
+    "%s AS SERVER_TIME, %s, 1, %s, %s FROM %s WHERE UUID IN %s AND SERVER_TIME > %s AND SERVER_TIME <= %s " +
+    "GROUP BY UUID ORDER BY %s DESC LIMIT %s";
 
   /**
    * Event based downsampler SELECT query.
@@ -489,7 +461,7 @@ public class PhoenixTransactSQL {
       if (orderByClause != null) {
         sb.append(orderByClause);
       } else {
-        sb.append(" ORDER BY METRIC_NAME, SERVER_TIME ");
+        sb.append(" ORDER BY UUID, SERVER_TIME ");
       }
     }
 
@@ -505,30 +477,13 @@ public class PhoenixTransactSQL {
     try {
       stmt = connection.prepareStatement(sb.toString());
       int pos = 1;
-      pos = addMetricNames(condition, pos, stmt);
+      pos = addUuids(condition, pos, stmt);
 
       if (condition instanceof TopNCondition) {
-        TopNCondition topNCondition = (TopNCondition) condition;
-        if (topNCondition.isTopNHostCondition()) {
-          pos = addMetricNames(condition, pos, stmt);
-        }
-      }
-
-      pos = addHostNames(condition, pos, stmt);
-
-      if (condition instanceof TopNCondition) {
-        pos = addAppId(condition, pos, stmt);
-        pos = addInstanceId(condition, pos, stmt);
         pos = addStartTime(condition, pos, stmt);
         pos = addEndTime(condition, pos, stmt);
-        TopNCondition topNCondition = (TopNCondition) condition;
-        if (topNCondition.isTopNMetricCondition()) {
-          pos = addHostNames(condition, pos, stmt);
-        }
       }
 
-      pos = addAppId(condition, pos, stmt);
-      pos = addInstanceId(condition, pos, stmt);
       pos = addStartTime(condition, pos, stmt);
       addEndTime(condition, pos, stmt);
 
@@ -542,6 +497,9 @@ public class PhoenixTransactSQL {
       throw e;
     }
 
+    if (condition instanceof TopNCondition) {
+      LOG.info(sb.toString());
+    }
     return stmt;
   }
 
@@ -639,36 +597,11 @@ public class PhoenixTransactSQL {
     int pos = 1;
     //For GET_LATEST_METRIC_SQL_SINGLE_HOST parameters should be set 2 times
     do {
-      if (condition.getMetricNames() != null) {
-        for (String metricName : condition.getMetricNames()) {
-          if (LOG.isDebugEnabled()) {
-            LOG.debug("Setting pos: " + pos + ", value = " + metricName);
-          }
-          stmt.setString(pos++, metricName);
-        }
-      }
-      if (condition.getHostnames() != null) {
-        for (String hostname : condition.getHostnames()) {
-          if (LOG.isDebugEnabled()) {
-            LOG.debug("Setting pos: " + pos + ", value: " + hostname);
-          }
-          stmt.setString(pos++, hostname);
+      if (condition.getUuids() != null) {
+        for (byte[] uuid : condition.getUuids()) {
+          stmt.setBytes(pos++, uuid);
         }
       }
-      if (condition.getAppId() != null) {
-        if (LOG.isDebugEnabled()) {
-          LOG.debug("Setting pos: " + pos + ", value: " + condition.getAppId());
-        }
-        stmt.setString(pos++, condition.getAppId());
-      }
-      if (condition.getInstanceId() != null) {
-        if (LOG.isDebugEnabled()) {
-          LOG.debug("Setting pos: " + pos +
-            ", value: " + condition.getInstanceId());
-        }
-        stmt.setString(pos++, condition.getInstanceId());
-      }
-
       if (condition.getFetchSize() != null) {
         stmt.setFetchSize(condition.getFetchSize());
         pos++;
@@ -716,7 +649,7 @@ public class PhoenixTransactSQL {
     StringBuilder sb = new StringBuilder(queryStmt);
     sb.append(" WHERE ");
     sb.append(condition.getConditionClause());
-    sb.append(" ORDER BY METRIC_NAME, SERVER_TIME");
+    sb.append(" ORDER BY UUID, SERVER_TIME");
     if (condition.getLimit() != null) {
       sb.append(" LIMIT ").append(condition.getLimit());
     }
@@ -731,20 +664,16 @@ public class PhoenixTransactSQL {
       stmt = connection.prepareStatement(query);
       int pos = 1;
 
-      pos = addMetricNames(condition, pos, stmt);
+      pos = addUuids(condition, pos, stmt);
 
       if (condition instanceof TopNCondition) {
-        pos = addAppId(condition, pos, stmt);
-        pos = addInstanceId(condition, pos, stmt);
         pos = addStartTime(condition, pos, stmt);
         pos = addEndTime(condition, pos, stmt);
       }
 
       // TODO: Upper case all strings on POST
-      pos = addAppId(condition, pos, stmt);
-      pos = addInstanceId(condition, pos, stmt);
       pos = addStartTime(condition, pos, stmt);
-      pos = addEndTime(condition, pos, stmt);
+      addEndTime(condition, pos, stmt);
     } catch (SQLException e) {
       if (stmt != null) {
         stmt.close();
@@ -752,11 +681,14 @@ public class PhoenixTransactSQL {
       throw e;
     }
 
+    if (condition instanceof TopNCondition) {
+      LOG.info(sb.toString());
+    }
     return stmt;
   }
 
   public static PreparedStatement prepareGetLatestAggregateMetricSqlStmt(
-    Connection connection, Condition condition) throws SQLException {
+    Connection connection, SplitByMetricNamesCondition condition) throws SQLException {
 
     validateConditionIsNotEmpty(condition);
 
@@ -775,7 +707,7 @@ public class PhoenixTransactSQL {
     if (orderByClause != null) {
       sb.append(orderByClause);
     } else {
-      sb.append(" ORDER BY METRIC_NAME DESC, SERVER_TIME DESC  ");
+      sb.append(" ORDER BY UUID DESC, SERVER_TIME DESC  ");
     }
 
     sb.append(" LIMIT ").append(condition.getMetricNames().size());
@@ -791,18 +723,9 @@ public class PhoenixTransactSQL {
       int pos = 1;
       if (condition.getMetricNames() != null) {
         for (; pos <= condition.getMetricNames().size(); pos++) {
-          stmt.setString(pos, condition.getMetricNames().get(pos - 1));
+          stmt.setBytes(pos, condition.getCurrentUuid());
         }
       }
-      if (condition.getAppId() != null) {
-        if (LOG.isDebugEnabled()) {
-          LOG.debug("Setting pos: " + pos + ", value: " + condition.getAppId());
-        }
-        stmt.setString(pos++, condition.getAppId());
-      }
-      if (condition.getInstanceId() != null) {
-        stmt.setString(pos, condition.getInstanceId());
-      }
     } catch (SQLException e) {
       if (stmt != null) {
 
@@ -856,50 +779,14 @@ public class PhoenixTransactSQL {
     return inputTable;
   }
 
-  private static int addMetricNames(Condition condition, int pos, PreparedStatement stmt) throws SQLException {
-    if (condition.getMetricNames() != null) {
-      for (int pos2 = 1 ; pos2 <= condition.getMetricNames().size(); pos2++,pos++) {
+  private static int addUuids(Condition condition, int pos, PreparedStatement stmt) throws SQLException {
+    if (condition.getUuids() != null) {
+      for (int pos2 = 1 ; pos2 <= condition.getUuids().size(); pos2++,pos++) {
         if (LOG.isDebugEnabled()) {
-          LOG.debug("Setting pos: " + pos + ", value = " + condition.getMetricNames().get(pos2 - 1));
+          LOG.debug("Setting pos: " + pos + ", value = " + condition.getUuids().get(pos2 - 1));
         }
-        stmt.setString(pos, condition.getMetricNames().get(pos2 - 1));
-      }
-    }
-    return pos;
-  }
-
-  private static int addHostNames(Condition condition, int pos, PreparedStatement stmt) throws SQLException {
-    int i = pos;
-    if (condition.getHostnames() != null) {
-      for (String hostname : condition.getHostnames()) {
-        if (LOG.isDebugEnabled()) {
-          LOG.debug("Setting pos: " + pos + ", value: " + hostname);
-        }
-        stmt.setString(i++, hostname);
-      }
-    }
-    return i;
-  }
-
-
-  private static int addAppId(Condition condition, int pos, PreparedStatement stmt) throws SQLException {
-
-    if (condition.getAppId() != null) {
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Setting pos: " + pos + ", value: " + condition.getAppId());
-      }
-      stmt.setString(pos++, condition.getAppId());
-    }
-    return pos;
-  }
-
-  private static int addInstanceId(Condition condition, int pos, PreparedStatement stmt) throws SQLException {
-
-    if (condition.getInstanceId() != null) {
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Setting pos: " + pos + ", value: " + condition.getInstanceId());
+        stmt.setBytes(pos, condition.getUuids().get(pos2 - 1));
       }
-      stmt.setString(pos++, condition.getInstanceId());
     }
     return pos;
   }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/SplitByMetricNamesCondition.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/SplitByMetricNamesCondition.java
index bb4dced..45ea74c 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/SplitByMetricNamesCondition.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/SplitByMetricNamesCondition.java
@@ -24,7 +24,7 @@ import java.util.List;
 // TODO get rid of this class
 public class SplitByMetricNamesCondition implements Condition {
   private final Condition adaptee;
-  private String currentMetric;
+  private byte[] currentUuid;
   private boolean metricNamesNotCondition = false;
 
   public SplitByMetricNamesCondition(Condition condition){
@@ -37,8 +37,13 @@ public class SplitByMetricNamesCondition implements Condition {
   }
 
   @Override
+  public List<byte[]> getUuids() {
+    return adaptee.getUuids();
+  }
+
+  @Override
   public List<String> getMetricNames() {
-    return Collections.singletonList(currentMetric);
+    return Collections.singletonList(new String(currentUuid));
   }
 
   @Override
@@ -91,31 +96,12 @@ public class SplitByMetricNamesCondition implements Condition {
         if (sb.length() > 1) {
           sb.append(" OR ");
         }
-        sb.append("METRIC_NAME = ?");
+        sb.append("UUID = ?");
       }
 
       appendConjunction = true;
     }
-    // TODO prevent user from using this method with multiple hostnames and SQL LIMIT clause
-    if (getHostnames() != null && getHostnames().size() > 1) {
-      StringBuilder hostnamesCondition = new StringBuilder();
-      for (String hostname: getHostnames()) {
-        if (hostnamesCondition.length() > 0) {
-          hostnamesCondition.append(" ,");
-        } else {
-          hostnamesCondition.append(" HOSTNAME IN (");
-        }
-        hostnamesCondition.append('?');
-      }
-      hostnamesCondition.append(')');
-      appendConjunction = DefaultCondition.append(sb, appendConjunction, getHostnames(), hostnamesCondition.toString());
-    } else {
-      appendConjunction = DefaultCondition.append(sb, appendConjunction, getHostnames(), " HOSTNAME = ?");
-    }
-    appendConjunction = DefaultCondition.append(sb, appendConjunction,
-      getAppId(), " APP_ID = ?");
-    appendConjunction = DefaultCondition.append(sb, appendConjunction,
-      getInstanceId(), " INSTANCE_ID = ?");
+
     appendConjunction = DefaultCondition.append(sb, appendConjunction,
       getStartTime(), " SERVER_TIME >= ?");
     DefaultCondition.append(sb, appendConjunction, getEndTime(),
@@ -178,8 +164,12 @@ public class SplitByMetricNamesCondition implements Condition {
     return adaptee.getMetricNames();
   }
 
-  public void setCurrentMetric(String currentMetric) {
-    this.currentMetric = currentMetric;
+  public void setCurrentUuid(byte[] uuid) {
+    this.currentUuid = uuid;
+  }
+
+  public byte[] getCurrentUuid() {
+    return currentUuid;
   }
 
  @Override
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/TopNCondition.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/TopNCondition.java
index 0f2a02c..93242bd 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/TopNCondition.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/TopNCondition.java
@@ -32,11 +32,11 @@ public class TopNCondition extends DefaultCondition{
   private Function topNFunction;
   private static final Log LOG = LogFactory.getLog(TopNCondition.class);
 
-  public TopNCondition(List<String> metricNames, List<String> hostnames, String appId,
+  public TopNCondition(List<byte[]> uuids, List<String> metricNames, List<String> hostnames, String appId,
                           String instanceId, Long startTime, Long endTime, Precision precision,
                           Integer limit, boolean grouped, Integer topN, Function topNFunction,
                           boolean isBottomN) {
-    super(metricNames, hostnames, appId, instanceId, startTime, endTime, precision, limit, grouped);
+    super(uuids, metricNames, hostnames, appId, instanceId, startTime, endTime, precision, limit, grouped);
     this.topN = topN;
     this.isBottomN = isBottomN;
     this.topNFunction = topNFunction;
@@ -44,34 +44,20 @@ public class TopNCondition extends DefaultCondition{
 
   @Override
   public StringBuilder getConditionClause() {
-    StringBuilder sb = new StringBuilder();
-    boolean appendConjunction = false;
-
-    if (isTopNHostCondition(metricNames, hostnames)) {
-      appendConjunction = appendMetricNameClause(sb);
-
-      StringBuilder hostnamesCondition = new StringBuilder();
-      hostnamesCondition.append(" HOSTNAME IN (");
-      hostnamesCondition.append(getTopNInnerQuery());
-      hostnamesCondition.append(")");
-      appendConjunction = append(sb, appendConjunction, getHostnames(), hostnamesCondition.toString());
-
-    } else if (isTopNMetricCondition(metricNames, hostnames)) {
-
-      StringBuilder metricNamesCondition = new StringBuilder();
-      metricNamesCondition.append(" METRIC_NAME IN (");
-      metricNamesCondition.append(getTopNInnerQuery());
-      metricNamesCondition.append(")");
-      appendConjunction = append(sb, appendConjunction, getMetricNames(), metricNamesCondition.toString());
-      appendConjunction = appendHostnameClause(sb, appendConjunction);
-    } else {
+
+
+    if (!(isTopNHostCondition(metricNames, hostnames) || isTopNMetricCondition(metricNames, hostnames))) {
       LOG.error("Unsupported TopN Operation requested. Query can have either multiple hosts or multiple metric names " +
         "but not both.");
       return null;
     }
 
-    appendConjunction = append(sb, appendConjunction, getAppId(), " APP_ID = ?");
-    appendConjunction = append(sb, appendConjunction, getInstanceId(), " INSTANCE_ID = ?");
+    StringBuilder sb = new StringBuilder();
+    sb.append(" UUID IN (");
+    sb.append(getTopNInnerQuery());
+    sb.append(")");
+
+    boolean appendConjunction = true;
     appendConjunction = append(sb, appendConjunction, getStartTime(), " SERVER_TIME >= ?");
     append(sb, appendConjunction, getEndTime(), " SERVER_TIME < ?");
 
@@ -79,29 +65,10 @@ public class TopNCondition extends DefaultCondition{
   }
 
   public String getTopNInnerQuery() {
-    String innerQuery = null;
-
-    if (isTopNHostCondition(metricNames, hostnames)) {
-      String groupByClause = "METRIC_NAME, HOSTNAME, APP_ID";
-      String orderByClause = getTopNOrderByClause();
-
-      innerQuery = String.format(PhoenixTransactSQL.TOP_N_INNER_SQL, PhoenixTransactSQL.getNaiveTimeRangeHint(getStartTime(), NATIVE_TIME_RANGE_DELTA),
-        "HOSTNAME", PhoenixTransactSQL.getTargetTableUsingPrecision(precision, true), super.getConditionClause().toString(),
-        groupByClause, orderByClause, topN);
-
-
-    } else if (isTopNMetricCondition(metricNames, hostnames)) {
-
-      String groupByClause = "METRIC_NAME, APP_ID";
-      String orderByClause = getTopNOrderByClause();
-
-      innerQuery = String.format(PhoenixTransactSQL.TOP_N_INNER_SQL, PhoenixTransactSQL.getNaiveTimeRangeHint(getStartTime(), NATIVE_TIME_RANGE_DELTA),
-        "METRIC_NAME", PhoenixTransactSQL.getTargetTableUsingPrecision(precision, (hostnames != null && hostnames.size() == 1)),
-        super.getConditionClause().toString(),
-        groupByClause, orderByClause, topN);
-    }
-
-    return innerQuery;
+    return String.format(PhoenixTransactSQL.TOP_N_INNER_SQL,
+      PhoenixTransactSQL.getNaiveTimeRangeHint(getStartTime(), NATIVE_TIME_RANGE_DELTA),
+      PhoenixTransactSQL.getTargetTableUsingPrecision(precision, CollectionUtils.isNotEmpty(hostnames)),
+      super.getConditionClause().toString(), getTopNOrderByClause(), topN);
   }
 
   private String getTopNOrderByClause() {
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/uuid/HashBasedUuidGenStrategy.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/uuid/HashBasedUuidGenStrategy.java
new file mode 100644
index 0000000..f35c23a
--- /dev/null
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/uuid/HashBasedUuidGenStrategy.java
@@ -0,0 +1,202 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES   OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.uuid;
+
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.aggregators.TimelineClusterMetric;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class HashBasedUuidGenStrategy implements MetricUuidGenStrategy {
+
+  /**
+   * Computes the UUID for a timelineClusterMetric.
+   * @param timelineClusterMetric
+   * @param maxLength
+   * @return byte array of length 'maxlength'
+   */
+  @Override
+  public byte[] computeUuid(TimelineClusterMetric timelineClusterMetric, int maxLength) {
+
+    int metricNameUuidLength = 12;
+    String metricName = timelineClusterMetric.getMetricName();
+
+    //Compute the individual splits.
+    String[] splits = getIndidivualSplits(metricName);
+
+    /*
+    Compute the ascii sum of every split in the metric name. (asciiSum += (int) splits[s].charAt(i))
+    For the last split, use weighted sum instead of ascii sum. (asciiSum += ((i+1) * (int) splits[s].charAt(i)))
+    These weighted sums are 'appended' to get the unique ID for metric name.
+     */
+    StringBuilder splitSums = new StringBuilder();
+    if (splits.length > 0) {
+      for (int s = 0; s < splits.length; s++) {
+        int asciiSum = 0;
+        if ( s < splits.length -1) {
+          for (int i = 0; i < splits[s].length(); i++) {
+            asciiSum += (int) splits[s].charAt(i); // Get Ascii Sum.
+          }
+        } else {
+          for (int i = 0; i < splits[s].length(); i++) {
+            asciiSum += ((i+1) * (int) splits[s].charAt(i)); //weighted sum for last split.
+          }
+        }
+        splitSums.append(asciiSum); //Append the sum to the array of sums.
+      }
+    }
+
+    //Compute a unique metric seed for the stemmed metric name
+    String stemmedMetric = stem(metricName);
+    long metricSeed = 100123456789L;
+    for (int i = 0; i < stemmedMetric.length(); i++) {
+      metricSeed += stemmedMetric.charAt(i);
+    }
+
+    //Reverse the computed seed to get a metric UUID portion which is used optionally.
+    byte[] metricUuidPortion = StringUtils.reverse(String.valueOf(metricSeed)).getBytes();
+    String splitSumString = splitSums.toString();
+    int splitLength = splitSumString.length();
+
+    //If splitSums length > required metric UUID length, use only the required length suffix substring of the splitSums as metric UUID.
+    if (splitLength > metricNameUuidLength) {
+      metricUuidPortion = ArrayUtils.subarray(splitSumString.getBytes(), splitLength - metricNameUuidLength, splitLength);
+    } else {
+      //If splitSums is not enough for required metric UUID length, pad with the metric uuid portion.
+      int pad = metricNameUuidLength - splitLength;
+      metricUuidPortion = ArrayUtils.addAll(splitSumString.getBytes(), ArrayUtils.subarray(metricUuidPortion, 0, pad));
+    }
+
+    /*
+      For appId and instanceId the logic is similar. Use a seed integer to start with and compute ascii sum.
+      Based on required length, use a suffix of the computed uuid.
+     */
+    String appId = timelineClusterMetric.getAppId();
+    int appidSeed = 11;
+    for (int i = 0; i < appId.length(); i++) {
+      appidSeed += appId.charAt(i);
+    }
+    String appIdSeedStr = String.valueOf(appidSeed);
+    byte[] appUuidPortion = ArrayUtils.subarray(appIdSeedStr.getBytes(), appIdSeedStr.length() - 2, appIdSeedStr.length());
+
+    String instanceId = timelineClusterMetric.getInstanceId();
+    ByteBuffer buffer = ByteBuffer.allocate(4);
+    byte[] instanceUuidPortion = new byte[2];
+    if (StringUtils.isNotEmpty(instanceId)) {
+      int instanceIdSeed = 1489;
+      for (int i = 0; i < appId.length(); i++) {
+        instanceIdSeed += appId.charAt(i);
+      }
+      buffer.putInt(instanceIdSeed);
+      ArrayUtils.subarray(buffer.array(), 2, 4);
+    }
+
+    // Concatenate all UUIDs together (metric uuid + appId uuid + instanceId uuid)
+    return ArrayUtils.addAll(ArrayUtils.addAll(metricUuidPortion, appUuidPortion), instanceUuidPortion);
+  }
+
+  /**
+   * Splits the metric name into individual tokens.
+   * For example,
+   *  kafka.server.ReplicaManager.LeaderCount -> [kafka, server, ReplicaManager, LeaderCount]
+   *  default.General.api_drop_table_15min_rate -> [default, General, api, drop, table, 15min, rate]
+   * @param metricName
+   * @return
+   */
+  private String[] getIndidivualSplits(String metricName) {
+    List<String> tokens = new ArrayList<>();
+    String[] splits = new String[0];
+    if (metricName.contains("\\.")) {
+      splits = metricName.split("\\.");
+      for (String split : splits) {
+        if (split.contains("_")) {
+          tokens.addAll(Arrays.asList(split.split("_")));
+        } else {
+          tokens.add(split);
+        }
+      }
+    }
+
+    if (splits.length <= 1) {
+      splits = metricName.split("\\_");
+      return splits;
+    }
+
+    if (splits.length <= 1) {
+      splits = metricName.split("\\=");
+      return splits;
+    }
+
+    return tokens.toArray(new String[tokens.size()]);
+  }
+
+  /**
+   * Stem the metric name. Remove a set of usual suspects characters.
+   * @param metricName
+   * @return
+   */
+  private String stem(String metricName) {
+    String metric = metricName.toLowerCase();
+    String regex = "[\\.\\_\\%\\-\\=]";
+    String trimmedMetric = StringUtils.removePattern(metric, regex);
+    return trimmedMetric;
+  }
+
+
+  /**
+   * Computes the UUID of a string. (hostname)
+   * Uses the ascii sum of the String. Numbers in the String are treated as actual numerical values rather than ascii values.
+   * @param value
+   * @param maxLength
+   * @return byte array of length 'maxlength'
+   */
+  @Override
+  public byte[] computeUuid(String value, int maxLength) {
+
+    if (StringUtils.isEmpty(value)) {
+      return null;
+    }
+    int len = value.length();
+    int numericValue = 0;
+    int seed = 1489;
+    for (int i = 0; i < len; i++) {
+      int ascii = value.charAt(i);
+      if (48 <= ascii && ascii <= 57) {
+        numericValue += numericValue * 10 + (ascii - 48);
+      } else {
+        if (numericValue > 0) {
+          seed += numericValue;
+          numericValue = 0;
+        }
+        seed+= value.charAt(i);
+      }
+    }
+
+    String seedStr = String.valueOf(seed);
+    if (seedStr.length() < maxLength) {
+      return null;
+    } else {
+      return seedStr.substring(seedStr.length() - maxLength, seedStr.length()).getBytes();
+    }
+  }
+}
\ No newline at end of file
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/uuid/MetricUuidGenStrategy.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/uuid/MetricUuidGenStrategy.java
new file mode 100644
index 0000000..9aab96a
--- /dev/null
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/uuid/MetricUuidGenStrategy.java
@@ -0,0 +1,49 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES   OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.uuid;
+
+import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.aggregators.TimelineClusterMetric;
+
+public interface MetricUuidGenStrategy {
+
+  /**
+   * Compute UUID for a given value
+   * @param timelineMetric instance
+   * @param maxLength
+   * @return
+   */
+//  byte[] computeUuid(TimelineMetric timelineMetric, int maxLength);
+
+  /**
+   * Compute UUID for a given value
+   * @param value
+   * @param maxLength
+   * @return
+   */
+  byte[] computeUuid(TimelineClusterMetric timelineClusterMetric, int maxLength);
+
+  /**
+   * Compute UUID for a given value
+   * @param value
+   * @param maxLength
+   * @return
+   */
+  byte[] computeUuid(String value, int maxLength);
+
+}
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/uuid/RandomUuidGenStrategy.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/uuid/RandomUuidGenStrategy.java
new file mode 100644
index 0000000..39d9549
--- /dev/null
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/uuid/RandomUuidGenStrategy.java
@@ -0,0 +1,53 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES   OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.uuid;
+
+import com.google.common.primitives.Longs;
+import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.aggregators.TimelineClusterMetric;
+
+import java.security.SecureRandom;
+
+public class RandomUuidGenStrategy implements MetricUuidGenStrategy {
+  private static SecureRandom randomGenerator;
+
+  public RandomUuidGenStrategy() {
+    randomGenerator = new SecureRandom(
+      Longs.toByteArray(System.currentTimeMillis()));
+  }
+
+  @Override
+  public byte[] computeUuid(TimelineClusterMetric timelineClusterMetric, int maxLength) {
+    final byte[] bytes = new byte[maxLength];
+    randomGenerator.nextBytes(bytes);
+    return bytes;
+  }
+
+//  @Override
+//  public byte[] computeUuid(TimelineMetric timelineMetric, int maxLength) {
+//    return new byte[10];
+//  }
+
+  @Override
+  public byte[] computeUuid(String value, int maxLength) {
+    final byte[] bytes = new byte[maxLength];
+    randomGenerator.nextBytes(bytes);
+    return bytes;
+  }
+}
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/TimelineWebServices.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/TimelineWebServices.java
index 50cfb08..472a787 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/TimelineWebServices.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/TimelineWebServices.java
@@ -38,6 +38,7 @@ import org.apache.hadoop.metrics2.sink.timeline.TimelineMetrics;
 import org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse;
 import org.apache.hadoop.metrics2.sink.timeline.Precision;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.TimelineMetricStore;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery.TimelineMetricMetadataKey;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.timeline.EntityIdentifier;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.timeline.GenericObjectMapper;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.timeline.NameValuePair;
@@ -461,6 +462,22 @@ public class TimelineWebServices {
     }
   }
 
+  @GET
+  @Path("/metrics/uuids")
+  @Produces({ MediaType.APPLICATION_JSON })
+  public Map<String, TimelineMetricMetadataKey> getUuids(
+    @Context HttpServletRequest req,
+    @Context HttpServletResponse res
+  ) {
+    init(res);
+
+    try {
+      return timelineMetricStore.getUuids();
+    } catch (Exception e) {
+      throw new WebApplicationException(e, Response.Status.INTERNAL_SERVER_ERROR);
+    }
+  }
+
   /**
    * This is a discovery endpoint that advertises known live collector
    * instances. Note: It will always answer with current instance as live.
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/AMBARI_SERVER.dat b/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/AMBARI_SERVER.dat
new file mode 100644
index 0000000..407b0f8
--- /dev/null
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/AMBARI_SERVER.dat
@@ -0,0 +1,40 @@
+jvm.buffers.direct.capacity
+jvm.buffers.direct.count
+jvm.buffers.direct.used
+jvm.buffers.mapped.capacity
+jvm.buffers.mapped.count
+jvm.buffers.mapped.used
+jvm.file.open.descriptor.ratio
+jvm.gc.ConcurrentMarkSweep.count
+jvm.gc.ConcurrentMarkSweep.time
+jvm.gc.ParNew.count
+jvm.gc.ParNew.time
+jvm.memory.heap.committed
+jvm.memory.heap.init
+jvm.memory.heap.max
+jvm.memory.heap.usage
+jvm.memory.heap.used
+jvm.memory.non-heap.committed
+jvm.memory.non-heap.init
+jvm.memory.non-heap.max
+jvm.memory.non-heap.usage
+jvm.memory.non-heap.used
+jvm.memory.pools.CMS-Old-Gen.usage
+jvm.memory.pools.Code-Cache.usage
+jvm.memory.pools.Compressed-Class-Space.usage
+jvm.memory.pools.Metaspace.usage
+jvm.memory.pools.Par-Eden-Space.usage
+jvm.memory.pools.Par-Survivor-Space.usage
+jvm.memory.total.committed
+jvm.memory.total.init
+jvm.memory.total.max
+jvm.memory.total.used
+jvm.threads.blocked.count
+jvm.threads.count
+jvm.threads.daemon.count
+jvm.threads.deadlock.count
+jvm.threads.new.count
+jvm.threads.runnable.count
+jvm.threads.terminated.count
+jvm.threads.timed_waiting.count
+jvm.threads.waiting.count
\ No newline at end of file
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/JOBHISTORYSERVER.dat b/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/JOBHISTORYSERVER.dat
new file mode 100644
index 0000000..f4eccce
--- /dev/null
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/JOBHISTORYSERVER.dat
@@ -0,0 +1,58 @@
+jvm.JvmMetrics.GcCount
+jvm.JvmMetrics.GcCountCopy
+jvm.JvmMetrics.GcCountMarkSweepCompact
+jvm.JvmMetrics.GcTimeMillis
+jvm.JvmMetrics.GcTimeMillisCopy
+jvm.JvmMetrics.GcTimeMillisMarkSweepCompact
+jvm.JvmMetrics.LogError
+jvm.JvmMetrics.LogFatal
+jvm.JvmMetrics.LogInfo
+jvm.JvmMetrics.LogWarn
+jvm.JvmMetrics.MemHeapCommittedM
+jvm.JvmMetrics.MemHeapMaxM
+jvm.JvmMetrics.MemHeapUsedM
+jvm.JvmMetrics.MemMaxM
+jvm.JvmMetrics.MemNonHeapCommittedM
+jvm.JvmMetrics.MemNonHeapMaxM
+jvm.JvmMetrics.MemNonHeapUsedM
+jvm.JvmMetrics.ThreadsBlocked
+jvm.JvmMetrics.ThreadsNew
+jvm.JvmMetrics.ThreadsRunnable
+jvm.JvmMetrics.ThreadsTerminated
+jvm.JvmMetrics.ThreadsTimedWaiting
+jvm.JvmMetrics.ThreadsWaiting
+metricssystem.MetricsSystem.DroppedPubAll
+metricssystem.MetricsSystem.NumActiveSinks
+metricssystem.MetricsSystem.NumActiveSources
+metricssystem.MetricsSystem.NumAllSinks
+metricssystem.MetricsSystem.NumAllSources
+metricssystem.MetricsSystem.PublishAvgTime
+metricssystem.MetricsSystem.PublishNumOps
+metricssystem.MetricsSystem.Sink_timelineAvgTime
+metricssystem.MetricsSystem.Sink_timelineDropped
+metricssystem.MetricsSystem.Sink_timelineNumOps
+metricssystem.MetricsSystem.Sink_timelineQsize
+metricssystem.MetricsSystem.SnapshotAvgTime
+metricssystem.MetricsSystem.SnapshotNumOps
+rpc.rpc.CallQueueLength
+rpc.rpc.NumOpenConnections
+rpc.rpc.ReceivedBytes
+rpc.rpc.RpcAuthenticationFailures
+rpc.rpc.RpcAuthenticationSuccesses
+rpc.rpc.RpcAuthorizationFailures
+rpc.rpc.RpcAuthorizationSuccesses
+rpc.rpc.RpcClientBackoff
+rpc.rpc.RpcProcessingTimeAvgTime
+rpc.rpc.RpcProcessingTimeNumOps
+rpc.rpc.RpcQueueTimeAvgTime
+rpc.rpc.RpcQueueTimeNumOps
+rpc.rpc.RpcSlowCalls
+rpc.rpc.SentBytes
+ugi.UgiMetrics.GetGroupsAvgTime
+ugi.UgiMetrics.GetGroupsNumOps
+ugi.UgiMetrics.LoginFailureAvgTime
+ugi.UgiMetrics.LoginFailureNumOps
+ugi.UgiMetrics.LoginSuccessAvgTime
+ugi.UgiMetrics.LoginSuccessNumOps
+ugi.UgiMetrics.RenewalFailures
+ugi.UgiMetrics.RenewalFailuresTotal
\ No newline at end of file
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/MASTER_HBASE.dat b/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/MASTER_HBASE.dat
index 9ba90f1..bce85f2 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/MASTER_HBASE.dat
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/MASTER_HBASE.dat
@@ -25,29 +25,213 @@ ipc.IPC.QueueCallTime_num_ops
 ipc.IPC.queueSize 
 ipc.IPC.receivedBytes 
 ipc.IPC.sentBytes 
-jvm.JvmMetrics.GcCount 
-jvm.JvmMetrics.GcCountConcurrentMarkSweep 
-jvm.JvmMetrics.GcCountCopy 
-jvm.JvmMetrics.GcTimeMillis 
-jvm.JvmMetrics.GcTimeMillisConcurrentMarkSweep 
-jvm.JvmMetrics.GcTimeMillisCopy 
-jvm.JvmMetrics.LogError 
-jvm.JvmMetrics.LogFatal 
-jvm.JvmMetrics.LogInfo 
-jvm.JvmMetrics.LogWarn 
-jvm.JvmMetrics.MemHeapCommittedM 
-jvm.JvmMetrics.MemHeapMaxM 
-jvm.JvmMetrics.MemHeapUsedM 
-jvm.JvmMetrics.MemMaxM 
-jvm.JvmMetrics.MemNonHeapCommittedM 
-jvm.JvmMetrics.MemNonHeapMaxM 
-jvm.JvmMetrics.MemNonHeapUsedM 
-jvm.JvmMetrics.ThreadsBlocked 
-jvm.JvmMetrics.ThreadsNew 
-jvm.JvmMetrics.ThreadsRunnable 
-jvm.JvmMetrics.ThreadsTerminated 
-jvm.JvmMetrics.ThreadsTimedWaiting 
-jvm.JvmMetrics.ThreadsWaiting 
+jvm.Master.JvmMetrics.GcCount
+jvm.Master.JvmMetrics.GcCountConcurrentMarkSweep
+jvm.Master.JvmMetrics.GcCountParNew
+jvm.Master.JvmMetrics.GcTimeMillis
+jvm.Master.JvmMetrics.GcTimeMillisConcurrentMarkSweep
+jvm.Master.JvmMetrics.GcTimeMillisParNew
+jvm.Master.JvmMetrics.LogError
+jvm.Master.JvmMetrics.LogFatal
+jvm.Master.JvmMetrics.LogInfo
+jvm.Master.JvmMetrics.LogWarn
+jvm.Master.JvmMetrics.MemHeapCommittedM
+jvm.Master.JvmMetrics.MemHeapMaxM
+jvm.Master.JvmMetrics.MemHeapUsedM
+jvm.Master.JvmMetrics.MemMaxM
+jvm.Master.JvmMetrics.MemNonHeapCommittedM
+jvm.Master.JvmMetrics.MemNonHeapMaxM
+jvm.Master.JvmMetrics.MemNonHeapUsedM
+jvm.Master.JvmMetrics.ThreadsBlocked
+jvm.Master.JvmMetrics.ThreadsNew
+jvm.Master.JvmMetrics.ThreadsRunnable
+jvm.Master.JvmMetrics.ThreadsTerminated
+jvm.Master.JvmMetrics.ThreadsTimedWaiting
+jvm.Master.JvmMetrics.ThreadsWaiting
+master.AssignmentManger.Assign_25th_percentile
+master.AssignmentManger.Assign_75th_percentile
+master.AssignmentManger.Assign_90th_percentile
+master.AssignmentManger.Assign_95th_percentile
+master.AssignmentManger.Assign_98th_percentile
+master.AssignmentManger.Assign_99.9th_percentile
+master.AssignmentManger.Assign_99th_percentile
+master.AssignmentManger.Assign_max
+master.AssignmentManger.Assign_mean
+master.AssignmentManger.Assign_median
+master.AssignmentManger.Assign_min
+master.AssignmentManger.Assign_num_ops
+master.AssignmentManger.BulkAssign_25th_percentile
+master.AssignmentManger.BulkAssign_75th_percentile
+master.AssignmentManger.BulkAssign_90th_percentile
+master.AssignmentManger.BulkAssign_95th_percentile
+master.AssignmentManger.BulkAssign_98th_percentile
+master.AssignmentManger.BulkAssign_99.9th_percentile
+master.AssignmentManger.BulkAssign_99th_percentile
+master.AssignmentManger.BulkAssign_max
+master.AssignmentManger.BulkAssign_mean
+master.AssignmentManger.BulkAssign_median
+master.AssignmentManger.BulkAssign_min
+master.AssignmentManger.BulkAssign_num_ops
+master.AssignmentManger.ritCount
+master.AssignmentManger.ritCountOverThreshold
+master.AssignmentManger.ritOldestAge
+master.Balancer.BalancerCluster_25th_percentile
+master.Balancer.BalancerCluster_75th_percentile
+master.Balancer.BalancerCluster_90th_percentile
+master.Balancer.BalancerCluster_95th_percentile
+master.Balancer.BalancerCluster_98th_percentile
+master.Balancer.BalancerCluster_99.9th_percentile
+master.Balancer.BalancerCluster_99th_percentile
+master.Balancer.BalancerCluster_max
+master.Balancer.BalancerCluster_mean
+master.Balancer.BalancerCluster_median
+master.Balancer.BalancerCluster_min
+master.Balancer.BalancerCluster_num_ops
+master.Balancer.miscInvocationCount
+master.FileSystem.HlogSplitSize_25th_percentile
+master.FileSystem.HlogSplitSize_75th_percentile
+master.FileSystem.HlogSplitSize_90th_percentile
+master.FileSystem.HlogSplitSize_95th_percentile
+master.FileSystem.HlogSplitSize_98th_percentile
+master.FileSystem.HlogSplitSize_99.9th_percentile
+master.FileSystem.HlogSplitSize_99th_percentile
+master.FileSystem.HlogSplitSize_max
+master.FileSystem.HlogSplitSize_mean
+master.FileSystem.HlogSplitSize_median
+master.FileSystem.HlogSplitSize_min
+master.FileSystem.HlogSplitSize_num_ops
+master.FileSystem.HlogSplitTime_25th_percentile
+master.FileSystem.HlogSplitTime_75th_percentile
+master.FileSystem.HlogSplitTime_90th_percentile
+master.FileSystem.HlogSplitTime_95th_percentile
+master.FileSystem.HlogSplitTime_98th_percentile
+master.FileSystem.HlogSplitTime_99.9th_percentile
+master.FileSystem.HlogSplitTime_99th_percentile
+master.FileSystem.HlogSplitTime_max
+master.FileSystem.HlogSplitTime_mean
+master.FileSystem.HlogSplitTime_median
+master.FileSystem.HlogSplitTime_min
+master.FileSystem.HlogSplitTime_num_ops
+master.FileSystem.MetaHlogSplitSize_25th_percentile
+master.FileSystem.MetaHlogSplitSize_75th_percentile
+master.FileSystem.MetaHlogSplitSize_90th_percentile
+master.FileSystem.MetaHlogSplitSize_95th_percentile
+master.FileSystem.MetaHlogSplitSize_98th_percentile
+master.FileSystem.MetaHlogSplitSize_99.9th_percentile
+master.FileSystem.MetaHlogSplitSize_99th_percentile
+master.FileSystem.MetaHlogSplitSize_max
+master.FileSystem.MetaHlogSplitSize_mean
+master.FileSystem.MetaHlogSplitSize_median
+master.FileSystem.MetaHlogSplitSize_min
+master.FileSystem.MetaHlogSplitSize_num_ops
+master.FileSystem.MetaHlogSplitTime_25th_percentile
+master.FileSystem.MetaHlogSplitTime_75th_percentile
+master.FileSystem.MetaHlogSplitTime_90th_percentile
+master.FileSystem.MetaHlogSplitTime_95th_percentile
+master.FileSystem.MetaHlogSplitTime_98th_percentile
+master.FileSystem.MetaHlogSplitTime_99.9th_percentile
+master.FileSystem.MetaHlogSplitTime_99th_percentile
+master.FileSystem.MetaHlogSplitTime_max
+master.FileSystem.MetaHlogSplitTime_mean
+master.FileSystem.MetaHlogSplitTime_median
+master.FileSystem.MetaHlogSplitTime_min
+master.FileSystem.MetaHlogSplitTime_num_ops
+master.Master.ProcessCallTime_25th_percentile
+master.Master.ProcessCallTime_75th_percentile
+master.Master.ProcessCallTime_90th_percentile
+master.Master.ProcessCallTime_95th_percentile
+master.Master.ProcessCallTime_98th_percentile
+master.Master.ProcessCallTime_99.9th_percentile
+master.Master.ProcessCallTime_99th_percentile
+master.Master.ProcessCallTime_TimeRangeCount_0-1
+master.Master.ProcessCallTime_max
+master.Master.ProcessCallTime_mean
+master.Master.ProcessCallTime_median
+master.Master.ProcessCallTime_min
+master.Master.ProcessCallTime_num_ops
+master.Master.QueueCallTime_25th_percentile
+master.Master.QueueCallTime_75th_percentile
+master.Master.QueueCallTime_90th_percentile
+master.Master.QueueCallTime_95th_percentile
+master.Master.QueueCallTime_98th_percentile
+master.Master.QueueCallTime_99.9th_percentile
+master.Master.QueueCallTime_99th_percentile
+master.Master.QueueCallTime_TimeRangeCount_0-1
+master.Master.QueueCallTime_TimeRangeCount_1-3
+master.Master.QueueCallTime_max
+master.Master.QueueCallTime_mean
+master.Master.QueueCallTime_median
+master.Master.QueueCallTime_min
+master.Master.QueueCallTime_num_ops
+master.Master.RequestSize_25th_percentile
+master.Master.RequestSize_75th_percentile
+master.Master.RequestSize_90th_percentile
+master.Master.RequestSize_95th_percentile
+master.Master.RequestSize_98th_percentile
+master.Master.RequestSize_99.9th_percentile
+master.Master.RequestSize_99th_percentile
+master.Master.RequestSize_SizeRangeCount_100-1000
+master.Master.RequestSize_max
+master.Master.RequestSize_mean
+master.Master.RequestSize_median
+master.Master.RequestSize_min
+master.Master.RequestSize_num_ops
+master.Master.ResponseSize_25th_percentile
+master.Master.ResponseSize_75th_percentile
+master.Master.ResponseSize_90th_percentile
+master.Master.ResponseSize_95th_percentile
+master.Master.ResponseSize_98th_percentile
+master.Master.ResponseSize_99.9th_percentile
+master.Master.ResponseSize_99th_percentile
+master.Master.ResponseSize_SizeRangeCount_0-10
+master.Master.ResponseSize_max
+master.Master.ResponseSize_mean
+master.Master.ResponseSize_median
+master.Master.ResponseSize_min
+master.Master.ResponseSize_num_ops
+master.Master.TotalCallTime_25th_percentile
+master.Master.TotalCallTime_75th_percentile
+master.Master.TotalCallTime_90th_percentile
+master.Master.TotalCallTime_95th_percentile
+master.Master.TotalCallTime_98th_percentile
+master.Master.TotalCallTime_99.9th_percentile
+master.Master.TotalCallTime_99th_percentile
+master.Master.TotalCallTime_TimeRangeCount_0-1
+master.Master.TotalCallTime_TimeRangeCount_1-3
+master.Master.TotalCallTime_max
+master.Master.TotalCallTime_mean
+master.Master.TotalCallTime_median
+master.Master.TotalCallTime_min
+master.Master.TotalCallTime_num_ops
+master.Master.authenticationFailures
+master.Master.authenticationSuccesses
+master.Master.authorizationFailures
+master.Master.authorizationSuccesses
+master.Master.exceptions
+master.Master.exceptions.FailedSanityCheckException
+master.Master.exceptions.NotServingRegionException
+master.Master.exceptions.OutOfOrderScannerNextException
+master.Master.exceptions.RegionMovedException
+master.Master.exceptions.RegionTooBusyException
+master.Master.exceptions.ScannerResetException
+master.Master.exceptions.UnknownScannerException
+master.Master.numActiveHandler
+master.Master.numCallsInGeneralQueue
+master.Master.numCallsInPriorityQueue
+master.Master.numCallsInReplicationQueue
+master.Master.numGeneralCallsDropped
+master.Master.numLifoModeSwitches
+master.Master.numOpenConnections
+master.Master.queueSize
+master.Master.receivedBytes
+master.Master.sentBytes
+master.Procedure.numMasterWALs
+master.Server.averageLoad
+master.Server.clusterRequests
+master.Server.masterActiveTime
+master.Server.masterStartTime
+master.Server.numDeadRegionServers
+master.Server.numRegionServers
 metricssystem.MetricsSystem.DroppedPubAll 
 metricssystem.MetricsSystem.NumActiveSinks 
 metricssystem.MetricsSystem.NumActiveSources 
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/SLAVE_HBASE.dat b/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/SLAVE_HBASE.dat
index 38b870f..3b8e586 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/SLAVE_HBASE.dat
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/SLAVE_HBASE.dat
@@ -25,29 +25,29 @@ ipc.IPC.QueueCallTime_num_ops
 ipc.IPC.queueSize 
 ipc.IPC.receivedBytes 
 ipc.IPC.sentBytes 
-jvm.JvmMetrics.GcCount 
-jvm.JvmMetrics.GcCountConcurrentMarkSweep 
-jvm.JvmMetrics.GcCountCopy 
-jvm.JvmMetrics.GcTimeMillis 
-jvm.JvmMetrics.GcTimeMillisConcurrentMarkSweep 
-jvm.JvmMetrics.GcTimeMillisCopy 
-jvm.JvmMetrics.LogError 
-jvm.JvmMetrics.LogFatal 
-jvm.JvmMetrics.LogInfo 
-jvm.JvmMetrics.LogWarn 
-jvm.JvmMetrics.MemHeapCommittedM 
-jvm.JvmMetrics.MemHeapMaxM 
-jvm.JvmMetrics.MemHeapUsedM 
-jvm.JvmMetrics.MemMaxM 
-jvm.JvmMetrics.MemNonHeapCommittedM 
-jvm.JvmMetrics.MemNonHeapMaxM 
-jvm.JvmMetrics.MemNonHeapUsedM 
-jvm.JvmMetrics.ThreadsBlocked 
-jvm.JvmMetrics.ThreadsNew 
-jvm.JvmMetrics.ThreadsRunnable 
-jvm.JvmMetrics.ThreadsTerminated 
-jvm.JvmMetrics.ThreadsTimedWaiting 
-jvm.JvmMetrics.ThreadsWaiting 
+jvm.RegionServer.JvmMetrics.GcCount
+jvm.RegionServer.JvmMetrics.GcCountConcurrentMarkSweep
+jvm.RegionServer.JvmMetrics.GcCountParNew
+jvm.RegionServer.JvmMetrics.GcTimeMillis
+jvm.RegionServer.JvmMetrics.GcTimeMillisConcurrentMarkSweep
+jvm.RegionServer.JvmMetrics.GcTimeMillisParNew
+jvm.RegionServer.JvmMetrics.LogError
+jvm.RegionServer.JvmMetrics.LogFatal
+jvm.RegionServer.JvmMetrics.LogInfo
+jvm.RegionServer.JvmMetrics.LogWarn
+jvm.RegionServer.JvmMetrics.MemHeapCommittedM
+jvm.RegionServer.JvmMetrics.MemHeapMaxM
+jvm.RegionServer.JvmMetrics.MemHeapUsedM
+jvm.RegionServer.JvmMetrics.MemMaxM
+jvm.RegionServer.JvmMetrics.MemNonHeapCommittedM
+jvm.RegionServer.JvmMetrics.MemNonHeapMaxM
+jvm.RegionServer.JvmMetrics.MemNonHeapUsedM
+jvm.RegionServer.JvmMetrics.ThreadsBlocked
+jvm.RegionServer.JvmMetrics.ThreadsNew
+jvm.RegionServer.JvmMetrics.ThreadsRunnable
+jvm.RegionServer.JvmMetrics.ThreadsTerminated
+jvm.RegionServer.JvmMetrics.ThreadsTimedWaiting
+jvm.RegionServer.JvmMetrics.ThreadsWaiting
 metricssystem.MetricsSystem.DroppedPubAll 
 metricssystem.MetricsSystem.NumActiveSinks 
 metricssystem.MetricsSystem.NumActiveSources 
@@ -60,119 +60,541 @@ metricssystem.MetricsSystem.Sink_timelineDropped
 metricssystem.MetricsSystem.Sink_timelineNumOps 
 metricssystem.MetricsSystem.Sink_timelineQsize 
 metricssystem.MetricsSystem.SnapshotAvgTime 
-metricssystem.MetricsSystem.SnapshotNumOps 
-regionserver.Server.Append_75th_percentile 
-regionserver.Server.Append_95th_percentile 
-regionserver.Server.Append_99th_percentile 
-regionserver.Server.Append_max 
-regionserver.Server.Append_mean 
-regionserver.Server.Append_median 
-regionserver.Server.Append_min 
-regionserver.Server.Append_num_ops 
-regionserver.Server.blockCacheCount 
-regionserver.Server.blockCacheEvictionCount 
-regionserver.Server.blockCacheExpressHitPercent 
-regionserver.Server.blockCacheFreeSize 
-regionserver.Server.blockCacheHitCount 
-regionserver.Server.blockCacheMissCount 
-regionserver.Server.blockCacheSize 
-regionserver.Server.blockCountHitPercent 
-regionserver.Server.checkMutateFailedCount 
-regionserver.Server.checkMutatePassedCount 
-regionserver.Server.compactionQueueLength 
-regionserver.Server.Delete_75th_percentile 
-regionserver.Server.Delete_95th_percentile 
-regionserver.Server.Delete_99th_percentile 
-regionserver.Server.Delete_max 
-regionserver.Server.Delete_mean 
-regionserver.Server.Delete_median 
-regionserver.Server.Delete_min 
-regionserver.Server.Delete_num_ops 
-regionserver.Server.flushQueueLength 
-regionserver.Server.Get_75th_percentile 
-regionserver.Server.Get_95th_percentile 
-regionserver.Server.Get_99th_percentile 
-regionserver.Server.Get_max 
-regionserver.Server.Get_mean 
-regionserver.Server.Get_median 
-regionserver.Server.Get_min 
-regionserver.Server.Get_num_ops 
-regionserver.Server.hlogFileCount 
-regionserver.Server.hlogFileSize 
-regionserver.Server.Increment_75th_percentile 
-regionserver.Server.Increment_95th_percentile 
-regionserver.Server.Increment_99th_percentile 
-regionserver.Server.Increment_max 
-regionserver.Server.Increment_mean 
-regionserver.Server.Increment_median 
-regionserver.Server.Increment_min 
-regionserver.Server.Increment_num_ops 
-regionserver.Server.memStoreSize 
-regionserver.Server.Mutate_75th_percentile 
-regionserver.Server.Mutate_95th_percentile 
-regionserver.Server.Mutate_99th_percentile 
-regionserver.Server.Mutate_max 
-regionserver.Server.Mutate_mean 
-regionserver.Server.Mutate_median 
-regionserver.Server.Mutate_min 
-regionserver.Server.Mutate_num_ops 
-regionserver.Server.mutationsWithoutWALCount 
-regionserver.Server.mutationsWithoutWALSize 
-regionserver.Server.percentFilesLocal 
-regionserver.Server.readRequestCount 
-regionserver.Server.regionCount 
-regionserver.Server.regionServerStartTime 
-regionserver.Server.Replay_75th_percentile 
-regionserver.Server.Replay_95th_percentile 
-regionserver.Server.Replay_99th_percentile 
-regionserver.Server.Replay_max 
-regionserver.Server.Replay_mean 
-regionserver.Server.Replay_median 
-regionserver.Server.Replay_min 
-regionserver.Server.Replay_num_ops 
-regionserver.Server.slowAppendCount 
-regionserver.Server.slowDeleteCount 
-regionserver.Server.slowGetCount 
-regionserver.Server.slowIncrementCount 
-regionserver.Server.slowPutCount 
-regionserver.Server.staticBloomSize 
-regionserver.Server.staticIndexSize 
-regionserver.Server.storeCount 
-regionserver.Server.storeFileCount 
-regionserver.Server.storeFileIndexSize 
-regionserver.Server.storeFileSize 
-regionserver.Server.totalRequestCount 
-regionserver.Server.updatesBlockedTime 
-regionserver.Server.writeRequestCount 
-regionserver.WAL.appendCount 
-regionserver.WAL.AppendSize_75th_percentile 
-regionserver.WAL.AppendSize_95th_percentile 
-regionserver.WAL.AppendSize_99th_percentile 
-regionserver.WAL.AppendSize_max 
-regionserver.WAL.AppendSize_mean 
-regionserver.WAL.AppendSize_median 
-regionserver.WAL.AppendSize_min 
-regionserver.WAL.AppendSize_num_ops 
-regionserver.WAL.AppendTime_75th_percentile 
-regionserver.WAL.AppendTime_95th_percentile 
-regionserver.WAL.AppendTime_99th_percentile 
-regionserver.WAL.AppendTime_max 
-regionserver.WAL.AppendTime_mean 
-regionserver.WAL.AppendTime_median 
-regionserver.WAL.AppendTime_min 
-regionserver.WAL.AppendTime_num_ops 
-regionserver.WAL.slowAppendCount 
-regionserver.WAL.SyncTime_75th_percentile 
-regionserver.WAL.SyncTime_95th_percentile 
-regionserver.WAL.SyncTime_99th_percentile 
-regionserver.WAL.SyncTime_max 
-regionserver.WAL.SyncTime_mean 
-regionserver.WAL.SyncTime_median 
-regionserver.WAL.SyncTime_min 
-regionserver.WAL.SyncTime_num_ops 
-ugi.UgiMetrics.GetGroupsAvgTime 
-ugi.UgiMetrics.GetGroupsNumOps 
-ugi.UgiMetrics.LoginFailureAvgTime 
-ugi.UgiMetrics.LoginFailureNumOps 
-ugi.UgiMetrics.LoginSuccessAvgTime 
-ugi.UgiMetrics.LoginSuccessNumOps
\ No newline at end of file
+metricssystem.MetricsSystem.SnapshotNumOps
+regionserver.RegionServer.ProcessCallTime_25th_percentile
+regionserver.RegionServer.ProcessCallTime_75th_percentile
+regionserver.RegionServer.ProcessCallTime_90th_percentile
+regionserver.RegionServer.ProcessCallTime_95th_percentile
+regionserver.RegionServer.ProcessCallTime_98th_percentile
+regionserver.RegionServer.ProcessCallTime_99.9th_percentile
+regionserver.RegionServer.ProcessCallTime_99th_percentile
+regionserver.RegionServer.ProcessCallTime_max
+regionserver.RegionServer.ProcessCallTime_mean
+regionserver.RegionServer.ProcessCallTime_median
+regionserver.RegionServer.ProcessCallTime_min
+regionserver.RegionServer.ProcessCallTime_num_ops
+regionserver.RegionServer.QueueCallTime_25th_percentile
+regionserver.RegionServer.QueueCallTime_75th_percentile
+regionserver.RegionServer.QueueCallTime_90th_percentile
+regionserver.RegionServer.QueueCallTime_95th_percentile
+regionserver.RegionServer.QueueCallTime_98th_percentile
+regionserver.RegionServer.QueueCallTime_99.9th_percentile
+regionserver.RegionServer.QueueCallTime_99th_percentile
+regionserver.RegionServer.QueueCallTime_max
+regionserver.RegionServer.QueueCallTime_mean
+regionserver.RegionServer.QueueCallTime_median
+regionserver.RegionServer.QueueCallTime_min
+regionserver.RegionServer.QueueCallTime_num_ops
+regionserver.RegionServer.RequestSize_25th_percentile
+regionserver.RegionServer.RequestSize_75th_percentile
+regionserver.RegionServer.RequestSize_90th_percentile
+regionserver.RegionServer.RequestSize_95th_percentile
+regionserver.RegionServer.RequestSize_98th_percentile
+regionserver.RegionServer.RequestSize_99.9th_percentile
+regionserver.RegionServer.RequestSize_99th_percentile
+regionserver.RegionServer.RequestSize_max
+regionserver.RegionServer.RequestSize_mean
+regionserver.RegionServer.RequestSize_median
+regionserver.RegionServer.RequestSize_min
+regionserver.RegionServer.RequestSize_num_ops
+regionserver.RegionServer.ResponseSize_25th_percentile
+regionserver.RegionServer.ResponseSize_75th_percentile
+regionserver.RegionServer.ResponseSize_90th_percentile
+regionserver.RegionServer.ResponseSize_95th_percentile
+regionserver.RegionServer.ResponseSize_98th_percentile
+regionserver.RegionServer.ResponseSize_99.9th_percentile
+regionserver.RegionServer.ResponseSize_99th_percentile
+regionserver.RegionServer.ResponseSize_max
+regionserver.RegionServer.ResponseSize_mean
+regionserver.RegionServer.ResponseSize_median
+regionserver.RegionServer.ResponseSize_min
+regionserver.RegionServer.ResponseSize_num_ops
+regionserver.RegionServer.TotalCallTime_25th_percentile
+regionserver.RegionServer.TotalCallTime_75th_percentile
+regionserver.RegionServer.TotalCallTime_90th_percentile
+regionserver.RegionServer.TotalCallTime_95th_percentile
+regionserver.RegionServer.TotalCallTime_98th_percentile
+regionserver.RegionServer.TotalCallTime_99.9th_percentile
+regionserver.RegionServer.TotalCallTime_99th_percentile
+regionserver.RegionServer.TotalCallTime_max
+regionserver.RegionServer.TotalCallTime_mean
+regionserver.RegionServer.TotalCallTime_median
+regionserver.RegionServer.TotalCallTime_min
+regionserver.RegionServer.TotalCallTime_num_ops
+regionserver.RegionServer.authenticationFailures
+regionserver.RegionServer.authenticationSuccesses
+regionserver.RegionServer.authorizationFailures
+regionserver.RegionServer.authorizationSuccesses
+regionserver.RegionServer.exceptions
+regionserver.RegionServer.exceptions.FailedSanityCheckException
+regionserver.RegionServer.exceptions.NotServingRegionException
+regionserver.RegionServer.exceptions.OutOfOrderScannerNextException
+regionserver.RegionServer.exceptions.RegionMovedException
+regionserver.RegionServer.exceptions.RegionTooBusyException
+regionserver.RegionServer.exceptions.ScannerResetException
+regionserver.RegionServer.exceptions.UnknownScannerException
+regionserver.RegionServer.numActiveHandler
+regionserver.RegionServer.numCallsInGeneralQueue
+regionserver.RegionServer.numCallsInPriorityQueue
+regionserver.RegionServer.numCallsInReplicationQueue
+regionserver.RegionServer.numGeneralCallsDropped
+regionserver.RegionServer.numLifoModeSwitches
+regionserver.RegionServer.numOpenConnections
+regionserver.RegionServer.queueSize
+regionserver.RegionServer.receivedBytes
+regionserver.RegionServer.sentBytes
+regionserver.Replication.sink.ageOfLastAppliedOp
+regionserver.Replication.sink.appliedBatches
+regionserver.Replication.sink.appliedHFiles
+regionserver.Replication.sink.appliedOps
+regionserver.Server.Append_25th_percentile
+regionserver.Server.Append_75th_percentile
+regionserver.Server.Append_90th_percentile
+regionserver.Server.Append_95th_percentile
+regionserver.Server.Append_98th_percentile
+regionserver.Server.Append_99.9th_percentile
+regionserver.Server.Append_99th_percentile
+regionserver.Server.Append_max
+regionserver.Server.Append_mean
+regionserver.Server.Append_median
+regionserver.Server.Append_min
+regionserver.Server.Append_num_ops
+regionserver.Server.CompactionInputFileCount_25th_percentile
+regionserver.Server.CompactionInputFileCount_75th_percentile
+regionserver.Server.CompactionInputFileCount_90th_percentile
+regionserver.Server.CompactionInputFileCount_95th_percentile
+regionserver.Server.CompactionInputFileCount_98th_percentile
+regionserver.Server.CompactionInputFileCount_99.9th_percentile
+regionserver.Server.CompactionInputFileCount_99th_percentile
+regionserver.Server.CompactionInputFileCount_max
+regionserver.Server.CompactionInputFileCount_mean
+regionserver.Server.CompactionInputFileCount_median
+regionserver.Server.CompactionInputFileCount_min
+regionserver.Server.CompactionInputFileCount_num_ops
+regionserver.Server.CompactionInputSize_25th_percentile
+regionserver.Server.CompactionInputSize_75th_percentile
+regionserver.Server.CompactionInputSize_90th_percentile
+regionserver.Server.CompactionInputSize_95th_percentile
+regionserver.Server.CompactionInputSize_98th_percentile
+regionserver.Server.CompactionInputSize_99.9th_percentile
+regionserver.Server.CompactionInputSize_99th_percentile
+regionserver.Server.CompactionInputSize_SizeRangeCount_100-1000
+regionserver.Server.CompactionInputSize_max
+regionserver.Server.CompactionInputSize_mean
+regionserver.Server.CompactionInputSize_median
+regionserver.Server.CompactionInputSize_min
+regionserver.Server.CompactionInputSize_num_ops
+regionserver.Server.CompactionOutputFileCount_25th_percentile
+regionserver.Server.CompactionOutputFileCount_75th_percentile
+regionserver.Server.CompactionOutputFileCount_90th_percentile
+regionserver.Server.CompactionOutputFileCount_95th_percentile
+regionserver.Server.CompactionOutputFileCount_98th_percentile
+regionserver.Server.CompactionOutputFileCount_99.9th_percentile
+regionserver.Server.CompactionOutputFileCount_99th_percentile
+regionserver.Server.CompactionOutputFileCount_max
+regionserver.Server.CompactionOutputFileCount_mean
+regionserver.Server.CompactionOutputFileCount_median
+regionserver.Server.CompactionOutputFileCount_min
+regionserver.Server.CompactionOutputFileCount_num_ops
+regionserver.Server.CompactionOutputSize_25th_percentile
+regionserver.Server.CompactionOutputSize_75th_percentile
+regionserver.Server.CompactionOutputSize_90th_percentile
+regionserver.Server.CompactionOutputSize_95th_percentile
+regionserver.Server.CompactionOutputSize_98th_percentile
+regionserver.Server.CompactionOutputSize_99.9th_percentile
+regionserver.Server.CompactionOutputSize_99th_percentile
+regionserver.Server.CompactionOutputSize_SizeRangeCount_100-1000
+regionserver.Server.CompactionOutputSize_max
+regionserver.Server.CompactionOutputSize_mean
+regionserver.Server.CompactionOutputSize_median
+regionserver.Server.CompactionOutputSize_min
+regionserver.Server.CompactionOutputSize_num_ops
+regionserver.Server.CompactionTime_25th_percentile
+regionserver.Server.CompactionTime_75th_percentile
+regionserver.Server.CompactionTime_90th_percentile
+regionserver.Server.CompactionTime_95th_percentile
+regionserver.Server.CompactionTime_98th_percentile
+regionserver.Server.CompactionTime_99.9th_percentile
+regionserver.Server.CompactionTime_99th_percentile
+regionserver.Server.CompactionTime_TimeRangeCount_100-300
+regionserver.Server.CompactionTime_max
+regionserver.Server.CompactionTime_mean
+regionserver.Server.CompactionTime_median
+regionserver.Server.CompactionTime_min
+regionserver.Server.CompactionTime_num_ops
+regionserver.Server.Delete_25th_percentile
+regionserver.Server.Delete_75th_percentile
+regionserver.Server.Delete_90th_percentile
+regionserver.Server.Delete_95th_percentile
+regionserver.Server.Delete_98th_percentile
+regionserver.Server.Delete_99.9th_percentile
+regionserver.Server.Delete_99th_percentile
+regionserver.Server.Delete_max
+regionserver.Server.Delete_mean
+regionserver.Server.Delete_median
+regionserver.Server.Delete_min
+regionserver.Server.Delete_num_ops
+regionserver.Server.FlushMemstoreSize_25th_percentile
+regionserver.Server.FlushMemstoreSize_75th_percentile
+regionserver.Server.FlushMemstoreSize_90th_percentile
+regionserver.Server.FlushMemstoreSize_95th_percentile
+regionserver.Server.FlushMemstoreSize_98th_percentile
+regionserver.Server.FlushMemstoreSize_99.9th_percentile
+regionserver.Server.FlushMemstoreSize_99th_percentile
+regionserver.Server.FlushMemstoreSize_SizeRangeCount_100-1000
+regionserver.Server.FlushMemstoreSize_max
+regionserver.Server.FlushMemstoreSize_mean
+regionserver.Server.FlushMemstoreSize_median
+regionserver.Server.FlushMemstoreSize_min
+regionserver.Server.FlushMemstoreSize_num_ops
+regionserver.Server.FlushOutputSize_25th_percentile
+regionserver.Server.FlushOutputSize_75th_percentile
+regionserver.Server.FlushOutputSize_90th_percentile
+regionserver.Server.FlushOutputSize_95th_percentile
+regionserver.Server.FlushOutputSize_98th_percentile
+regionserver.Server.FlushOutputSize_99.9th_percentile
+regionserver.Server.FlushOutputSize_99th_percentile
+regionserver.Server.FlushOutputSize_SizeRangeCount_100-1000
+regionserver.Server.FlushOutputSize_max
+regionserver.Server.FlushOutputSize_mean
+regionserver.Server.FlushOutputSize_median
+regionserver.Server.FlushOutputSize_min
+regionserver.Server.FlushOutputSize_num_ops
+regionserver.Server.FlushTime_25th_percentile
+regionserver.Server.FlushTime_75th_percentile
+regionserver.Server.FlushTime_90th_percentile
+regionserver.Server.FlushTime_95th_percentile
+regionserver.Server.FlushTime_98th_percentile
+regionserver.Server.FlushTime_99.9th_percentile
+regionserver.Server.FlushTime_99th_percentile
+regionserver.Server.FlushTime_max
+regionserver.Server.FlushTime_mean
+regionserver.Server.FlushTime_median
+regionserver.Server.FlushTime_min
+regionserver.Server.FlushTime_num_ops
+regionserver.Server.Get_25th_percentile
+regionserver.Server.Get_75th_percentile
+regionserver.Server.Get_90th_percentile
+regionserver.Server.Get_95th_percentile
+regionserver.Server.Get_98th_percentile
+regionserver.Server.Get_99.9th_percentile
+regionserver.Server.Get_99th_percentile
+regionserver.Server.Get_max
+regionserver.Server.Get_mean
+regionserver.Server.Get_median
+regionserver.Server.Get_min
+regionserver.Server.Get_num_ops
+regionserver.Server.Increment_25th_percentile
+regionserver.Server.Increment_75th_percentile
+regionserver.Server.Increment_90th_percentile
+regionserver.Server.Increment_95th_percentile
+regionserver.Server.Increment_98th_percentile
+regionserver.Server.Increment_99.9th_percentile
+regionserver.Server.Increment_99th_percentile
+regionserver.Server.Increment_max
+regionserver.Server.Increment_mean
+regionserver.Server.Increment_median
+regionserver.Server.Increment_min
+regionserver.Server.Increment_num_ops
+regionserver.Server.MajorCompactionInputFileCount_25th_percentile
+regionserver.Server.MajorCompactionInputFileCount_75th_percentile
+regionserver.Server.MajorCompactionInputFileCount_90th_percentile
+regionserver.Server.MajorCompactionInputFileCount_95th_percentile
+regionserver.Server.MajorCompactionInputFileCount_98th_percentile
+regionserver.Server.MajorCompactionInputFileCount_99.9th_percentile
+regionserver.Server.MajorCompactionInputFileCount_99th_percentile
+regionserver.Server.MajorCompactionInputFileCount_max
+regionserver.Server.MajorCompactionInputFileCount_mean
+regionserver.Server.MajorCompactionInputFileCount_median
+regionserver.Server.MajorCompactionInputFileCount_min
+regionserver.Server.MajorCompactionInputFileCount_num_ops
+regionserver.Server.MajorCompactionInputSize_25th_percentile
+regionserver.Server.MajorCompactionInputSize_75th_percentile
+regionserver.Server.MajorCompactionInputSize_90th_percentile
+regionserver.Server.MajorCompactionInputSize_95th_percentile
+regionserver.Server.MajorCompactionInputSize_98th_percentile
+regionserver.Server.MajorCompactionInputSize_99.9th_percentile
+regionserver.Server.MajorCompactionInputSize_99th_percentile
+regionserver.Server.MajorCompactionInputSize_max
+regionserver.Server.MajorCompactionInputSize_mean
+regionserver.Server.MajorCompactionInputSize_median
+regionserver.Server.MajorCompactionInputSize_min
+regionserver.Server.MajorCompactionInputSize_num_ops
+regionserver.Server.MajorCompactionOutputFileCount_25th_percentile
+regionserver.Server.MajorCompactionOutputFileCount_75th_percentile
+regionserver.Server.MajorCompactionOutputFileCount_90th_percentile
+regionserver.Server.MajorCompactionOutputFileCount_95th_percentile
+regionserver.Server.MajorCompactionOutputFileCount_98th_percentile
+regionserver.Server.MajorCompactionOutputFileCount_99.9th_percentile
+regionserver.Server.MajorCompactionOutputFileCount_99th_percentile
+regionserver.Server.MajorCompactionOutputFileCount_max
+regionserver.Server.MajorCompactionOutputFileCount_mean
+regionserver.Server.MajorCompactionOutputFileCount_median
+regionserver.Server.MajorCompactionOutputFileCount_min
+regionserver.Server.MajorCompactionOutputFileCount_num_ops
+regionserver.Server.MajorCompactionOutputSize_25th_percentile
+regionserver.Server.MajorCompactionOutputSize_75th_percentile
+regionserver.Server.MajorCompactionOutputSize_90th_percentile
+regionserver.Server.MajorCompactionOutputSize_95th_percentile
+regionserver.Server.MajorCompactionOutputSize_98th_percentile
+regionserver.Server.MajorCompactionOutputSize_99.9th_percentile
+regionserver.Server.MajorCompactionOutputSize_99th_percentile
+regionserver.Server.MajorCompactionOutputSize_max
+regionserver.Server.MajorCompactionOutputSize_mean
+regionserver.Server.MajorCompactionOutputSize_median
+regionserver.Server.MajorCompactionOutputSize_min
+regionserver.Server.MajorCompactionOutputSize_num_ops
+regionserver.Server.MajorCompactionTime_25th_percentile
+regionserver.Server.MajorCompactionTime_75th_percentile
+regionserver.Server.MajorCompactionTime_90th_percentile
+regionserver.Server.MajorCompactionTime_95th_percentile
+regionserver.Server.MajorCompactionTime_98th_percentile
+regionserver.Server.MajorCompactionTime_99.9th_percentile
+regionserver.Server.MajorCompactionTime_99th_percentile
+regionserver.Server.MajorCompactionTime_max
+regionserver.Server.MajorCompactionTime_mean
+regionserver.Server.MajorCompactionTime_median
+regionserver.Server.MajorCompactionTime_min
+regionserver.Server.MajorCompactionTime_num_ops
+regionserver.Server.Mutate_25th_percentile
+regionserver.Server.Mutate_75th_percentile
+regionserver.Server.Mutate_90th_percentile
+regionserver.Server.Mutate_95th_percentile
+regionserver.Server.Mutate_98th_percentile
+regionserver.Server.Mutate_99.9th_percentile
+regionserver.Server.Mutate_99th_percentile
+regionserver.Server.Mutate_max
+regionserver.Server.Mutate_mean
+regionserver.Server.Mutate_median
+regionserver.Server.Mutate_min
+regionserver.Server.Mutate_num_ops
+regionserver.Server.PauseTimeWithGc_25th_percentile
+regionserver.Server.PauseTimeWithGc_75th_percentile
+regionserver.Server.PauseTimeWithGc_90th_percentile
+regionserver.Server.PauseTimeWithGc_95th_percentile
+regionserver.Server.PauseTimeWithGc_98th_percentile
+regionserver.Server.PauseTimeWithGc_99.9th_percentile
+regionserver.Server.PauseTimeWithGc_99th_percentile
+regionserver.Server.PauseTimeWithGc_max
+regionserver.Server.PauseTimeWithGc_mean
+regionserver.Server.PauseTimeWithGc_median
+regionserver.Server.PauseTimeWithGc_min
+regionserver.Server.PauseTimeWithGc_num_ops
+regionserver.Server.PauseTimeWithoutGc_25th_percentile
+regionserver.Server.PauseTimeWithoutGc_75th_percentile
+regionserver.Server.PauseTimeWithoutGc_90th_percentile
+regionserver.Server.PauseTimeWithoutGc_95th_percentile
+regionserver.Server.PauseTimeWithoutGc_98th_percentile
+regionserver.Server.PauseTimeWithoutGc_99.9th_percentile
+regionserver.Server.PauseTimeWithoutGc_99th_percentile
+regionserver.Server.PauseTimeWithoutGc_max
+regionserver.Server.PauseTimeWithoutGc_mean
+regionserver.Server.PauseTimeWithoutGc_median
+regionserver.Server.PauseTimeWithoutGc_min
+regionserver.Server.PauseTimeWithoutGc_num_ops
+regionserver.Server.Replay_25th_percentile
+regionserver.Server.Replay_75th_percentile
+regionserver.Server.Replay_90th_percentile
+regionserver.Server.Replay_95th_percentile
+regionserver.Server.Replay_98th_percentile
+regionserver.Server.Replay_99.9th_percentile
+regionserver.Server.Replay_99th_percentile
+regionserver.Server.Replay_max
+regionserver.Server.Replay_mean
+regionserver.Server.Replay_median
+regionserver.Server.Replay_min
+regionserver.Server.Replay_num_ops
+regionserver.Server.ScanSize_25th_percentile
+regionserver.Server.ScanSize_75th_percentile
+regionserver.Server.ScanSize_90th_percentile
+regionserver.Server.ScanSize_95th_percentile
+regionserver.Server.ScanSize_98th_percentile
+regionserver.Server.ScanSize_99.9th_percentile
+regionserver.Server.ScanSize_99th_percentile
+regionserver.Server.ScanSize_max
+regionserver.Server.ScanSize_mean
+regionserver.Server.ScanSize_median
+regionserver.Server.ScanSize_min
+regionserver.Server.ScanSize_num_ops
+regionserver.Server.ScanTime_25th_percentile
+regionserver.Server.ScanTime_75th_percentile
+regionserver.Server.ScanTime_90th_percentile
+regionserver.Server.ScanTime_95th_percentile
+regionserver.Server.ScanTime_98th_percentile
+regionserver.Server.ScanTime_99.9th_percentile
+regionserver.Server.ScanTime_99th_percentile
+regionserver.Server.ScanTime_max
+regionserver.Server.ScanTime_mean
+regionserver.Server.ScanTime_median
+regionserver.Server.ScanTime_min
+regionserver.Server.ScanTime_num_ops
+regionserver.Server.SplitTime_25th_percentile
+regionserver.Server.SplitTime_75th_percentile
+regionserver.Server.SplitTime_90th_percentile
+regionserver.Server.SplitTime_95th_percentile
+regionserver.Server.SplitTime_98th_percentile
+regionserver.Server.SplitTime_99.9th_percentile
+regionserver.Server.SplitTime_99th_percentile
+regionserver.Server.SplitTime_max
+regionserver.Server.SplitTime_mean
+regionserver.Server.SplitTime_median
+regionserver.Server.SplitTime_min
+regionserver.Server.SplitTime_num_ops
+regionserver.Server.averageRegionSize
+regionserver.Server.avgStoreFileAge
+regionserver.Server.blockCacheBloomChunkHitCount
+regionserver.Server.blockCacheBloomChunkMissCount
+regionserver.Server.blockCacheCount
+regionserver.Server.blockCacheCountHitPercent
+regionserver.Server.blockCacheDataHitCount
+regionserver.Server.blockCacheDataMissCount
+regionserver.Server.blockCacheDeleteFamilyBloomHitCount
+regionserver.Server.blockCacheDeleteFamilyBloomMissCount
+regionserver.Server.blockCacheEvictionCount
+regionserver.Server.blockCacheEvictionCountPrimary
+regionserver.Server.blockCacheExpressHitPercent
+regionserver.Server.blockCacheFileInfoHitCount
+regionserver.Server.blockCacheFileInfoMissCount
+regionserver.Server.blockCacheFreeSize
+regionserver.Server.blockCacheGeneralBloomMetaHitCount
+regionserver.Server.blockCacheGeneralBloomMetaMissCount
+regionserver.Server.blockCacheHitCount
+regionserver.Server.blockCacheHitCountPrimary
+regionserver.Server.blockCacheIntermediateIndexHitCount
+regionserver.Server.blockCacheIntermediateIndexMissCount
+regionserver.Server.blockCacheLeafIndexHitCount
+regionserver.Server.blockCacheLeafIndexMissCount
+regionserver.Server.blockCacheMetaHitCount
+regionserver.Server.blockCacheMetaMissCount
+regionserver.Server.blockCacheMissCount
+regionserver.Server.blockCacheMissCountPrimary
+regionserver.Server.blockCacheRootIndexHitCount
+regionserver.Server.blockCacheRootIndexMissCount
+regionserver.Server.blockCacheSize
+regionserver.Server.blockCacheTrailerHitCount
+regionserver.Server.blockCacheTrailerMissCount
+regionserver.Server.blockedRequestCount
+regionserver.Server.cellsCountCompactedFromMob
+regionserver.Server.cellsCountCompactedToMob
+regionserver.Server.cellsSizeCompactedFromMob
+regionserver.Server.cellsSizeCompactedToMob
+regionserver.Server.checkMutateFailedCount
+regionserver.Server.checkMutatePassedCount
+regionserver.Server.compactedCellsCount
+regionserver.Server.compactedCellsSize
+regionserver.Server.compactedInputBytes
+regionserver.Server.compactedOutputBytes
+regionserver.Server.compactionQueueLength
+regionserver.Server.flushQueueLength
+regionserver.Server.flushedCellsCount
+regionserver.Server.flushedCellsSize
+regionserver.Server.flushedMemstoreBytes
+regionserver.Server.flushedOutputBytes
+regionserver.Server.hlogFileCount
+regionserver.Server.hlogFileSize
+regionserver.Server.largeCompactionQueueLength
+regionserver.Server.majorCompactedCellsCount
+regionserver.Server.majorCompactedCellsSize
+regionserver.Server.majorCompactedInputBytes
+regionserver.Server.majorCompactedOutputBytes
+regionserver.Server.maxStoreFileAge
+regionserver.Server.memStoreSize
+regionserver.Server.minStoreFileAge
+regionserver.Server.mobFileCacheAccessCount
+regionserver.Server.mobFileCacheCount
+regionserver.Server.mobFileCacheEvictedCount
+regionserver.Server.mobFileCacheHitPercent
+regionserver.Server.mobFileCacheMissCount
+regionserver.Server.mobFlushCount
+regionserver.Server.mobFlushedCellsCount
+regionserver.Server.mobFlushedCellsSize
+regionserver.Server.mobScanCellsCount
+regionserver.Server.mobScanCellsSize
+regionserver.Server.mutationsWithoutWALCount
+regionserver.Server.mutationsWithoutWALSize
+regionserver.Server.numReferenceFiles
+regionserver.Server.pauseInfoThresholdExceeded
+regionserver.Server.pauseWarnThresholdExceeded
+regionserver.Server.percentFilesLocal
+regionserver.Server.percentFilesLocalSecondaryRegions
+regionserver.Server.readRequestCount
+regionserver.Server.regionCount
+regionserver.Server.regionServerStartTime
+regionserver.Server.rpcGetRequestCount
+regionserver.Server.rpcMultiRequestCount
+regionserver.Server.rpcMutateRequestCount
+regionserver.Server.rpcScanRequestCount
+regionserver.Server.slowAppendCount
+regionserver.Server.slowDeleteCount
+regionserver.Server.slowGetCount
+regionserver.Server.slowIncrementCount
+regionserver.Server.slowPutCount
+regionserver.Server.smallCompactionQueueLength
+regionserver.Server.splitQueueLength
+regionserver.Server.splitRequestCount
+regionserver.Server.splitSuccessCount
+regionserver.Server.staticBloomSize
+regionserver.Server.staticIndexSize
+regionserver.Server.storeCount
+regionserver.Server.storeFileCount
+regionserver.Server.storeFileIndexSize
+regionserver.Server.storeFileSize
+regionserver.Server.totalRequestCount
+regionserver.Server.updatesBlockedTime
+regionserver.Server.writeRequestCount
+regionserver.WAL.AppendSize_25th_percentile
+regionserver.WAL.AppendSize_75th_percentile
+regionserver.WAL.AppendSize_90th_percentile
+regionserver.WAL.AppendSize_95th_percentile
+regionserver.WAL.AppendSize_98th_percentile
+regionserver.WAL.AppendSize_99.9th_percentile
+regionserver.WAL.AppendSize_99th_percentile
+regionserver.WAL.AppendSize_SizeRangeCount_100-1000
+regionserver.WAL.AppendSize_max
+regionserver.WAL.AppendSize_mean
+regionserver.WAL.AppendSize_median
+regionserver.WAL.AppendSize_min
+regionserver.WAL.AppendSize_num_ops
+regionserver.WAL.AppendTime_25th_percentile
+regionserver.WAL.AppendTime_75th_percentile
+regionserver.WAL.AppendTime_90th_percentile
+regionserver.WAL.AppendTime_95th_percentile
+regionserver.WAL.AppendTime_98th_percentile
+regionserver.WAL.AppendTime_99.9th_percentile
+regionserver.WAL.AppendTime_99th_percentile
+regionserver.WAL.AppendTime_TimeRangeCount_0-1
+regionserver.WAL.AppendTime_max
+regionserver.WAL.AppendTime_mean
+regionserver.WAL.AppendTime_median
+regionserver.WAL.AppendTime_min
+regionserver.WAL.AppendTime_num_ops
+regionserver.WAL.SyncTime_25th_percentile
+regionserver.WAL.SyncTime_75th_percentile
+regionserver.WAL.SyncTime_90th_percentile
+regionserver.WAL.SyncTime_95th_percentile
+regionserver.WAL.SyncTime_98th_percentile
+regionserver.WAL.SyncTime_99.9th_percentile
+regionserver.WAL.SyncTime_99th_percentile
+regionserver.WAL.SyncTime_TimeRangeCount_0-1
+regionserver.WAL.SyncTime_TimeRangeCount_1-3
+regionserver.WAL.SyncTime_TimeRangeCount_10-30
+regionserver.WAL.SyncTime_TimeRangeCount_3-10
+regionserver.WAL.SyncTime_TimeRangeCount_30-100
+regionserver.WAL.SyncTime_max
+regionserver.WAL.SyncTime_mean
+regionserver.WAL.SyncTime_median
+regionserver.WAL.SyncTime_min
+regionserver.WAL.SyncTime_num_ops
+regionserver.WAL.appendCount
+regionserver.WAL.lowReplicaRollRequest
+regionserver.WAL.rollRequest
+regionserver.WAL.slowAppendCount
+regionserver.WAL.writtenBytes
+ugi.UgiMetrics.GetGroupsAvgTime
+ugi.UgiMetrics.GetGroupsNumOps
+ugi.UgiMetrics.LoginFailureAvgTime
+ugi.UgiMetrics.LoginFailureNumOps
+ugi.UgiMetrics.LoginSuccessAvgTime
+ugi.UgiMetrics.LoginSuccessNumOps
+ugi.UgiMetrics.RenewalFailures
+ugi.UgiMetrics.RenewalFailuresTotal
\ No newline at end of file
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/ITPhoenixHBaseAccessor.java b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/ITPhoenixHBaseAccessor.java
index f6d69f6..c25d414 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/ITPhoenixHBaseAccessor.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/ITPhoenixHBaseAccessor.java
@@ -111,7 +111,7 @@ public class ITPhoenixHBaseAccessor extends AbstractMiniHBaseClusterTest {
   public void testGetMetricRecordsMinutes() throws IOException, SQLException {
     // GIVEN
     TimelineMetricAggregator aggregatorMinute =
-      TimelineMetricAggregatorFactory.createTimelineMetricAggregatorMinute(hdb, new Configuration(), null);
+      TimelineMetricAggregatorFactory.createTimelineMetricAggregatorMinute(hdb, new Configuration(), null, null);
 
     long startTime = System.currentTimeMillis();
     long ctime = startTime;
@@ -149,7 +149,7 @@ public class ITPhoenixHBaseAccessor extends AbstractMiniHBaseClusterTest {
   public void testGetMetricRecordsHours() throws IOException, SQLException {
     // GIVEN
     TimelineMetricAggregator aggregator =
-      TimelineMetricAggregatorFactory.createTimelineMetricAggregatorHourly(hdb, new Configuration(), null);
+      TimelineMetricAggregatorFactory.createTimelineMetricAggregatorHourly(hdb, new Configuration(), null, null);
 
     MetricHostAggregate expectedAggregate =
       createMetricHostAggregate(2.0, 0.0, 20, 15.0);
@@ -283,7 +283,7 @@ public class ITPhoenixHBaseAccessor extends AbstractMiniHBaseClusterTest {
   public void testGetClusterMetricRecordsHours() throws Exception {
     // GIVEN
     TimelineMetricAggregator agg =
-      TimelineMetricAggregatorFactory.createTimelineClusterAggregatorHourly(hdb, new Configuration(), null);
+      TimelineMetricAggregatorFactory.createTimelineClusterAggregatorHourly(hdb, new Configuration(), null, null);
 
     long startTime = System.currentTimeMillis();
     long ctime = startTime;
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/MetricTestHelper.java b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/MetricTestHelper.java
index 7eeb9c4..7dfe1fc 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/MetricTestHelper.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/MetricTestHelper.java
@@ -109,7 +109,7 @@ public class MetricTestHelper {
   public static TimelineClusterMetric createEmptyTimelineClusterMetric(
       String name, long startTime) {
     TimelineClusterMetric metric = new TimelineClusterMetric(name,
-        "test_app", "instance_id", startTime, null);
+        "test_app", "instance_id", startTime);
 
     return metric;
   }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/PhoenixHBaseAccessorTest.java b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/PhoenixHBaseAccessorTest.java
index bf9246d..7be3c0d 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/PhoenixHBaseAccessorTest.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/PhoenixHBaseAccessorTest.java
@@ -29,6 +29,7 @@ import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric;
 import org.apache.hadoop.metrics2.sink.timeline.TimelineMetrics;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.aggregators.TimelineClusterMetric;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.aggregators.Function;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery.TimelineMetricMetadataManager;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.query.Condition;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.query.DefaultCondition;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.query.PhoenixConnectionProvider;
@@ -55,6 +56,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
+import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.expect;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
@@ -256,7 +258,7 @@ public class PhoenixHBaseAccessorTest {
 
     TimelineClusterMetric clusterMetric =
         new TimelineClusterMetric("metricName", "appId", "instanceId",
-            System.currentTimeMillis(), "type");
+            System.currentTimeMillis());
     TimelineMetric timelineMetric = new TimelineMetric();
     timelineMetric.setMetricName("Metric1");
     timelineMetric.setType("type1");
@@ -268,6 +270,12 @@ public class PhoenixHBaseAccessorTest {
     clusterTimeAggregateMap.put(clusterMetric, new MetricHostAggregate());
     hostAggregateMap.put(timelineMetric, new MetricHostAggregate());
 
+    TimelineMetricMetadataManager metricMetadataManagerMock = EasyMock.createMock(TimelineMetricMetadataManager.class);
+    expect(metricMetadataManagerMock.getUuid(anyObject(TimelineClusterMetric.class))).andReturn(new byte[16]).times(2);
+    expect(metricMetadataManagerMock.getUuid(anyObject(TimelineMetric.class))).andReturn(new byte[20]).once();
+    replay(metricMetadataManagerMock);
+
+    accessor.setMetadataInstance(metricMetadataManagerMock);
     accessor.saveClusterAggregateRecords(clusterAggregateMap);
     accessor.saveHostAggregateRecords(hostAggregateMap,
         PhoenixTransactSQL.METRICS_AGGREGATE_MINUTE_TABLE_NAME);
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TestPhoenixTransactSQL.java b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TestPhoenixTransactSQL.java
index e988a61..dd73a8a 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TestPhoenixTransactSQL.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TestPhoenixTransactSQL.java
@@ -26,6 +26,7 @@ import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.query.TopNCondition;
 import org.easymock.Capture;
 import org.junit.Assert;
+import org.junit.Ignore;
 import org.junit.Test;
 import java.sql.Connection;
 import java.sql.ParameterMetaData;
@@ -46,13 +47,12 @@ import org.easymock.EasyMock;
 public class TestPhoenixTransactSQL {
   @Test
   public void testConditionClause() throws Exception {
-    Condition condition = new DefaultCondition(
+    Condition condition = new DefaultCondition(Arrays.asList(new byte[8], new byte[8]),
       new ArrayList<>(Arrays.asList("cpu_user", "mem_free")), Collections.singletonList("h1"),
       "a1", "i1", 1407959718L, 1407959918L, null, null, false);
 
     String preparedClause = condition.getConditionClause().toString();
-    String expectedClause = "(METRIC_NAME IN (?, ?)) AND HOSTNAME = ? AND " +
-      "APP_ID = ? AND INSTANCE_ID = ? AND SERVER_TIME >= ? AND SERVER_TIME < ?";
+    String expectedClause = "(UUID IN (?, ?)) AND SERVER_TIME >= ? AND SERVER_TIME < ?";
 
     Assert.assertNotNull(preparedClause);
     Assert.assertEquals(expectedClause, preparedClause);
@@ -60,21 +60,21 @@ public class TestPhoenixTransactSQL {
 
   @Test
   public void testSplitByMetricNamesCondition() throws Exception {
-    Condition c = new DefaultCondition(
+    Condition c = new DefaultCondition(Arrays.asList(new byte[8], new byte[8]),
       Arrays.asList("cpu_user", "mem_free"), Collections.singletonList("h1"),
       "a1", "i1", 1407959718L, 1407959918L, null, null, false);
 
     SplitByMetricNamesCondition condition = new SplitByMetricNamesCondition(c);
-    condition.setCurrentMetric(c.getMetricNames().get(0));
+    condition.setCurrentUuid(new byte[8]);
 
     String preparedClause = condition.getConditionClause().toString();
-    String expectedClause = "METRIC_NAME = ? AND HOSTNAME = ? AND " +
-      "APP_ID = ? AND INSTANCE_ID = ? AND SERVER_TIME >= ? AND SERVER_TIME < ?";
+    String expectedClause = "UUID = ? AND SERVER_TIME >= ? AND SERVER_TIME < ?";
 
     Assert.assertNotNull(preparedClause);
     Assert.assertEquals(expectedClause, preparedClause);
   }
 
+  @Ignore
   @Test
   public void testLikeConditionClause() throws Exception {
     Condition condition = new DefaultCondition(
@@ -363,7 +363,7 @@ public class TestPhoenixTransactSQL {
 
   @Test
   public void testPrepareGetLatestMetricSqlStmtMultipleHostNames() throws SQLException {
-    Condition condition = new DefaultCondition(
+    Condition condition = new DefaultCondition(Arrays.asList(new byte[16], new byte[16], new byte[16], new byte[16]),
       new ArrayList<>(Arrays.asList("cpu_user", "mem_free")), Arrays.asList("h1", "h2"),
       "a1", "i1", null, null, null, null, false);
     Connection connection = createNiceMock(Connection.class);
@@ -376,7 +376,7 @@ public class TestPhoenixTransactSQL {
       .andReturn(parameterMetaData).once();
     // 6 = 1 instance_id + 1 appd_id + 2 hostnames + 2 metric names
     expect(parameterMetaData.getParameterCount())
-      .andReturn(6).once();
+      .andReturn(4).once();
 
     replay(connection, preparedStatement, parameterMetaData);
     PhoenixTransactSQL.prepareGetLatestMetricSqlStmt(connection, condition);
@@ -389,7 +389,7 @@ public class TestPhoenixTransactSQL {
   @Test
   public void testPrepareGetLatestMetricSqlStmtSortMergeJoinAlgorithm()
     throws SQLException {
-    Condition condition = new DefaultCondition(
+    Condition condition = new DefaultCondition(Arrays.asList(new byte[16], new byte[16]),
       new ArrayList<>(Arrays.asList("cpu_user", "mem_free")), Arrays.asList("h1"),
       "a1", "i1", null, null, null, null, false);
     Connection connection = createNiceMock(Connection.class);
@@ -401,7 +401,7 @@ public class TestPhoenixTransactSQL {
     expect(preparedStatement.getParameterMetaData())
       .andReturn(parameterMetaData).anyTimes();
     expect(parameterMetaData.getParameterCount())
-      .andReturn(6).anyTimes();
+      .andReturn(2).anyTimes();
 
     replay(connection, preparedStatement, parameterMetaData);
     PhoenixTransactSQL.setSortMergeJoinEnabled(true);
@@ -558,22 +558,19 @@ public class TestPhoenixTransactSQL {
 
   @Test
   public void testTopNHostsConditionClause() throws Exception {
-    List<String> hosts = Arrays.asList("h1", "h2", "h3", "h4");
+    List<String> hosts = Arrays.asList("h1", "h2");
+    List<byte[]> uuids = Arrays.asList(new byte[16], new byte[16]);
 
-    Condition condition = new TopNCondition(
-      new ArrayList<>(Collections.singletonList("cpu_user")), hosts,
+    Condition condition = new TopNCondition(uuids, new ArrayList<>(Collections.singletonList("cpu_user")), hosts,
       "a1", "i1", 1407959718L, 1407959918L, null, null, false, 2, null, false);
 
     String conditionClause = condition.getConditionClause().toString();
-    String expectedClause = "(METRIC_NAME IN (?)) AND HOSTNAME IN (" +
-      "SELECT " + PhoenixTransactSQL.getNaiveTimeRangeHint(condition.getStartTime(),120000l) +
-      " HOSTNAME FROM METRIC_RECORD WHERE " +
-          "(METRIC_NAME IN (?)) AND " +
-          "HOSTNAME IN (? ,? ,? ,?) AND " +
-          "APP_ID = ? AND INSTANCE_ID = ? AND " +
+    String expectedClause = " UUID IN (" +
+      "SELECT " + PhoenixTransactSQL.getNaiveTimeRangeHint(condition.getStartTime(),120000l) + " " +
+      "UUID FROM METRIC_RECORD WHERE " +
+          "(UUID IN (?, ?)) AND " +
           "SERVER_TIME >= ? AND SERVER_TIME < ? " +
-          "GROUP BY METRIC_NAME, HOSTNAME, APP_ID ORDER BY MAX(METRIC_MAX) DESC LIMIT 2) " +
-      "AND APP_ID = ? AND INSTANCE_ID = ? AND SERVER_TIME >= ? AND SERVER_TIME < ?";
+          "GROUP BY UUID ORDER BY MAX(METRIC_MAX) DESC LIMIT 2) AND SERVER_TIME >= ? AND SERVER_TIME < ?";
 
     Assert.assertEquals(expectedClause, conditionClause);
   }
@@ -581,21 +578,18 @@ public class TestPhoenixTransactSQL {
   @Test
   public void testTopNMetricsConditionClause() throws Exception {
     List<String> metricNames = new ArrayList<>(Arrays.asList("m1", "m2", "m3"));
+    List<byte[]> uuids = Arrays.asList(new byte[16], new byte[16], new byte[16]);
 
-    Condition condition = new TopNCondition(
-      metricNames, Collections.singletonList("h1"),
+    Condition condition = new TopNCondition(uuids, metricNames, Collections.singletonList("h1"),
       "a1", "i1", 1407959718L, 1407959918L, null, null, false, 2, null, false);
 
     String conditionClause = condition.getConditionClause().toString();
-    String expectedClause = " METRIC_NAME IN (" +
+    String expectedClause = " UUID IN (" +
       "SELECT " + PhoenixTransactSQL.getNaiveTimeRangeHint(condition.getStartTime(),120000l) +
-      " METRIC_NAME FROM METRIC_RECORD WHERE " +
-      "(METRIC_NAME IN (?, ?, ?)) AND " +
-      "HOSTNAME = ? AND " +
-      "APP_ID = ? AND INSTANCE_ID = ? AND " +
+      " UUID FROM METRIC_RECORD WHERE " +
+      "(UUID IN (?, ?, ?)) AND " +
       "SERVER_TIME >= ? AND SERVER_TIME < ? " +
-      "GROUP BY METRIC_NAME, APP_ID ORDER BY MAX(METRIC_MAX) DESC LIMIT 2) " +
-      "AND HOSTNAME = ? AND APP_ID = ? AND INSTANCE_ID = ? AND SERVER_TIME >= ? AND SERVER_TIME < ?";
+      "GROUP BY UUID ORDER BY MAX(METRIC_MAX) DESC LIMIT 2) AND SERVER_TIME >= ? AND SERVER_TIME < ?";
 
     Assert.assertEquals(expectedClause, conditionClause);
   }
@@ -605,57 +599,12 @@ public class TestPhoenixTransactSQL {
     List<String> metricNames = new ArrayList<>(Arrays.asList("m1", "m2"));
 
     List<String> hosts = Arrays.asList("h1", "h2");
+    List<byte[]> uuids = Arrays.asList(new byte[16], new byte[16], new byte[16], new byte[16]);
 
-    Condition condition = new TopNCondition(
-      metricNames, hosts,
+    Condition condition = new TopNCondition(uuids, metricNames, hosts,
       "a1", "i1", 1407959718L, 1407959918L, null, null, false, 2, null, false);
 
     Assert.assertEquals(condition.getConditionClause(), null);
   }
 
-  @Test
-  public void testHostsRegexpConditionClause() {
-    Condition condition = new TopNCondition(
-      new ArrayList<>(Arrays.asList("m1")), Arrays.asList("%.ambari", "host1.apache"),
-            "a1", "i1", 1407959718L, 1407959918L, null, null, false, 2, null, false);
-
-    String conditionClause = condition.getConditionClause().toString();
-    String expectedClause = "(METRIC_NAME IN (?)) AND HOSTNAME IN (SELECT " +
-      PhoenixTransactSQL.getNaiveTimeRangeHint(condition.getStartTime(),120000l) +
-      " HOSTNAME FROM METRIC_RECORD WHERE (METRIC_NAME IN (?)) " +
-      "AND (HOSTNAME LIKE ? OR HOSTNAME LIKE ?) AND APP_ID = ? AND INSTANCE_ID = ? AND SERVER_TIME >= ? AND SERVER_TIME < ? GROUP BY " +
-      "METRIC_NAME, HOSTNAME, APP_ID ORDER BY MAX(METRIC_MAX) DESC LIMIT 2) AND APP_ID = ? AND INSTANCE_ID = ? AND " +
-      "SERVER_TIME >= ? AND SERVER_TIME < ?";
-    Assert.assertEquals(expectedClause, conditionClause);
-
-    condition = new TopNCondition(
-      new ArrayList<>(Arrays.asList("m1")), Arrays.asList("%.ambari"),
-            "a1", "i1", 1407959718L, 1407959918L, null, null, false, 2, null, false);
-
-    conditionClause = condition.getConditionClause().toString();
-    expectedClause = "(METRIC_NAME IN (?)) AND HOSTNAME IN (SELECT " +
-      PhoenixTransactSQL.getNaiveTimeRangeHint(condition.getStartTime(),120000l) +
-      " HOSTNAME FROM METRIC_RECORD WHERE (METRIC_NAME IN (?)) " +
-      "AND (HOSTNAME LIKE ?) AND APP_ID = ? AND INSTANCE_ID = ? AND SERVER_TIME >= ? AND SERVER_TIME < ? GROUP BY " +
-      "METRIC_NAME, HOSTNAME, APP_ID ORDER BY MAX(METRIC_MAX) DESC LIMIT 2) AND APP_ID = ? AND INSTANCE_ID = ? AND " +
-      "SERVER_TIME >= ? AND SERVER_TIME < ?";
-
-    Assert.assertEquals(expectedClause, conditionClause);
-
-    condition = new TopNCondition(
-      new ArrayList<>(Arrays.asList("m1", "m2", "m3")), Arrays.asList("h1.ambari"),
-            "a1", "i1", 1407959718L, 1407959918L, null, null, false, 2, null, false);
-
-    conditionClause = condition.getConditionClause().toString();
-    expectedClause = " METRIC_NAME IN (" +
-            "SELECT " + PhoenixTransactSQL.getNaiveTimeRangeHint(condition.getStartTime(),120000l) +
-            " METRIC_NAME FROM METRIC_RECORD WHERE " +
-            "(METRIC_NAME IN (?, ?, ?)) AND " +
-            "HOSTNAME = ? AND " +
-            "APP_ID = ? AND INSTANCE_ID = ? AND " +
-            "SERVER_TIME >= ? AND SERVER_TIME < ? " +
-            "GROUP BY METRIC_NAME, APP_ID ORDER BY MAX(METRIC_MAX) DESC LIMIT 2) " +
-            "AND HOSTNAME = ? AND APP_ID = ? AND INSTANCE_ID = ? AND SERVER_TIME >= ? AND SERVER_TIME < ?";
-    Assert.assertEquals(expectedClause, conditionClause);
-  }
 }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TestTimelineMetricStore.java b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TestTimelineMetricStore.java
index 8abcd83..07e0daa 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TestTimelineMetricStore.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TestTimelineMetricStore.java
@@ -25,6 +25,8 @@ import org.apache.hadoop.metrics2.sink.timeline.TimelineMetricMetadata;
 import org.apache.hadoop.metrics2.sink.timeline.TimelineMetrics;
 import org.apache.hadoop.metrics2.sink.timeline.TopNConfig;
 import org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery.TimelineMetricMetadataKey;
+
 import java.io.IOException;
 import java.sql.SQLException;
 import java.util.ArrayList;
@@ -111,5 +113,10 @@ public class TestTimelineMetricStore implements TimelineMetricStore {
   public List<String> getLiveInstances() {
     return Collections.emptyList();
   }
-  
+
+  @Override
+  public Map<String, TimelineMetricMetadataKey> getUuids() throws SQLException, IOException {
+    return null;
+  }
+
 }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TimelineMetricsAggregatorMemorySink.java b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TimelineMetricsAggregatorMemorySink.java
index 53f6f6c..51cde4a 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TimelineMetricsAggregatorMemorySink.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TimelineMetricsAggregatorMemorySink.java
@@ -92,7 +92,7 @@ public class TimelineMetricsAggregatorMemorySink
       TimelineClusterMetric clusterMetricClone =
           new TimelineClusterMetric(clusterMetric.getMetricName(),
               clusterMetric.getAppId(), clusterMetric.getInstanceId(),
-              clusterMetric.getTimestamp(), clusterMetric.getType());
+              clusterMetric.getTimestamp());
       MetricHostAggregate hostAggregate = entry.getValue();
       MetricHostAggregate hostAggregateClone = new MetricHostAggregate(
           hostAggregate.getSum(), (int) hostAggregate.getNumberOfSamples(),
@@ -116,7 +116,7 @@ public class TimelineMetricsAggregatorMemorySink
       TimelineClusterMetric clusterMetricClone =
           new TimelineClusterMetric(clusterMetric.getMetricName(),
               clusterMetric.getAppId(), clusterMetric.getInstanceId(),
-              clusterMetric.getTimestamp(), clusterMetric.getType());
+              clusterMetric.getTimestamp());
       MetricClusterAggregate clusterAggregate = entry.getValue();
       MetricClusterAggregate clusterAggregateClone = new MetricClusterAggregate(
           clusterAggregate.getSum(), (int) clusterAggregate.getNumberOfHosts(),
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/DownSamplerTest.java b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/DownSamplerTest.java
index d02d2a8..7fb8e78 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/DownSamplerTest.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/DownSamplerTest.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline
 
 import junit.framework.Assert;
 import org.apache.hadoop.conf.Configuration;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import java.util.List;
@@ -57,6 +58,7 @@ public class DownSamplerTest {
     Assert.assertTrue(downSamplers.get(0) instanceof TopNDownSampler);
   }
 
+  @Ignore
   @Test
   public void testPrepareTopNDownSamplingStatement() throws Exception {
     Configuration configuration = new Configuration();
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/ITClusterAggregator.java b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/ITClusterAggregator.java
index 86c9b40..e66e65d 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/ITClusterAggregator.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/ITClusterAggregator.java
@@ -94,7 +94,6 @@ public class ITClusterAggregator extends AbstractMiniHBaseClusterTest {
     Condition condition = new DefaultCondition(null, null, null, null, startTime,
       endTime, null, null, true);
     condition.setStatement(String.format(GET_CLUSTER_AGGREGATE_SQL,
-      PhoenixTransactSQL.getNaiveTimeRangeHint(startTime, NATIVE_TIME_RANGE_DELTA),
       METRICS_CLUSTER_AGGREGATE_TABLE_NAME));
 
     PreparedStatement pstmt = PhoenixTransactSQL.prepareGetMetricsSqlStmt(conn, condition);
@@ -169,7 +168,6 @@ public class ITClusterAggregator extends AbstractMiniHBaseClusterTest {
     Condition condition = new DefaultCondition(null, null, null, null, startTime,
       endTime, null, null, true);
     condition.setStatement(String.format(GET_CLUSTER_AGGREGATE_SQL,
-      PhoenixTransactSQL.getNaiveTimeRangeHint(startTime, NATIVE_TIME_RANGE_DELTA),
       METRICS_CLUSTER_AGGREGATE_TABLE_NAME));
 
     PreparedStatement pstmt = PhoenixTransactSQL.prepareGetMetricsSqlStmt(conn, condition);
@@ -229,7 +227,6 @@ public class ITClusterAggregator extends AbstractMiniHBaseClusterTest {
     Condition condition = new DefaultCondition(null, null, null, null, startTime,
       endTime, null, null, true);
     condition.setStatement(String.format(GET_CLUSTER_AGGREGATE_SQL,
-      PhoenixTransactSQL.getNaiveTimeRangeHint(startTime, NATIVE_TIME_RANGE_DELTA),
       METRICS_CLUSTER_AGGREGATE_TABLE_NAME));
 
     PreparedStatement pstmt = PhoenixTransactSQL.prepareGetMetricsSqlStmt(conn, condition);
@@ -263,7 +260,7 @@ public class ITClusterAggregator extends AbstractMiniHBaseClusterTest {
   public void testAggregateDailyClusterMetrics() throws Exception {
     // GIVEN
     TimelineMetricAggregator agg =
-      TimelineMetricAggregatorFactory.createTimelineClusterAggregatorDaily(hdb, getConfigurationForTest(false), null);
+      TimelineMetricAggregatorFactory.createTimelineClusterAggregatorDaily(hdb, getConfigurationForTest(false), null, null);
 
     // this time can be virtualized! or made independent from real clock
     long startTime = System.currentTimeMillis();
@@ -308,7 +305,7 @@ public class ITClusterAggregator extends AbstractMiniHBaseClusterTest {
   public void testShouldAggregateClusterOnMinuteProperly() throws Exception {
 
     TimelineMetricAggregator agg =
-      TimelineMetricAggregatorFactory.createTimelineClusterAggregatorMinute(hdb, getConfigurationForTest(false), null);
+      TimelineMetricAggregatorFactory.createTimelineClusterAggregatorMinute(hdb, getConfigurationForTest(false), null, null);
 
     long startTime = System.currentTimeMillis();
     long ctime = startTime;
@@ -375,7 +372,7 @@ public class ITClusterAggregator extends AbstractMiniHBaseClusterTest {
   public void testShouldAggregateClusterOnHourProperly() throws Exception {
     // GIVEN
     TimelineMetricAggregator agg =
-      TimelineMetricAggregatorFactory.createTimelineClusterAggregatorHourly(hdb, getConfigurationForTest(false), null);
+      TimelineMetricAggregatorFactory.createTimelineClusterAggregatorHourly(hdb, getConfigurationForTest(false), null, null);
 
     // this time can be virtualized! or made independent from real clock
     long startTime = System.currentTimeMillis();
@@ -419,7 +416,7 @@ public class ITClusterAggregator extends AbstractMiniHBaseClusterTest {
   public void testShouldAggregateDifferentMetricsOnHourProperly() throws Exception {
     // GIVEN
     TimelineMetricAggregator agg =
-      TimelineMetricAggregatorFactory.createTimelineClusterAggregatorHourly(hdb, getConfigurationForTest(false), null);
+      TimelineMetricAggregatorFactory.createTimelineClusterAggregatorHourly(hdb, getConfigurationForTest(false), null, null);
 
     long startTime = System.currentTimeMillis();
     long ctime = startTime;
@@ -507,7 +504,6 @@ public class ITClusterAggregator extends AbstractMiniHBaseClusterTest {
       new ArrayList<String>() {{ add("cpu_user"); }}, null, "app1", null,
       startTime, endTime, null, null, true);
     condition.setStatement(String.format(GET_CLUSTER_AGGREGATE_SQL,
-      PhoenixTransactSQL.getNaiveTimeRangeHint(startTime, NATIVE_TIME_RANGE_DELTA),
       METRICS_CLUSTER_AGGREGATE_TABLE_NAME));
 
     PreparedStatement pstmt = PhoenixTransactSQL.prepareGetMetricsSqlStmt(conn, condition);
@@ -583,7 +579,6 @@ public class ITClusterAggregator extends AbstractMiniHBaseClusterTest {
     Condition condition = new DefaultCondition(null, null, null, null, startTime,
       endTime, null, null, true);
     condition.setStatement(String.format(GET_CLUSTER_AGGREGATE_SQL,
-      PhoenixTransactSQL.getNaiveTimeRangeHint(startTime, NATIVE_TIME_RANGE_DELTA),
       METRICS_CLUSTER_AGGREGATE_TABLE_NAME));
 
     PreparedStatement pstmt = PhoenixTransactSQL.prepareGetMetricsSqlStmt(conn, condition);
@@ -611,7 +606,7 @@ public class ITClusterAggregator extends AbstractMiniHBaseClusterTest {
   public void testAggregationUsingGroupByQuery() throws Exception {
     // GIVEN
     TimelineMetricAggregator agg =
-      TimelineMetricAggregatorFactory.createTimelineClusterAggregatorHourly(hdb, getConfigurationForTest(true), null);
+      TimelineMetricAggregatorFactory.createTimelineClusterAggregatorHourly(hdb, getConfigurationForTest(true), null, null);
 
     long startTime = System.currentTimeMillis();
     long ctime = startTime;
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/ITMetricAggregator.java b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/ITMetricAggregator.java
index 75b3f91..14ac4d7 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/ITMetricAggregator.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/ITMetricAggregator.java
@@ -85,7 +85,7 @@ public class ITMetricAggregator extends AbstractMiniHBaseClusterTest {
     // GIVEN
     TimelineMetricAggregator aggregatorMinute =
       TimelineMetricAggregatorFactory.createTimelineMetricAggregatorMinute(hdb,
-        getConfigurationForTest(false), null);
+        getConfigurationForTest(false), null, null);
     TimelineMetricReadHelper readHelper = new TimelineMetricReadHelper(false);
 
     long startTime = System.currentTimeMillis();
@@ -146,7 +146,7 @@ public class ITMetricAggregator extends AbstractMiniHBaseClusterTest {
     // GIVEN
     TimelineMetricAggregator aggregator =
       TimelineMetricAggregatorFactory.createTimelineMetricAggregatorHourly(hdb,
-        getConfigurationForTest(false), null);
+        getConfigurationForTest(false), null, null);
     TimelineMetricReadHelper readHelper = new TimelineMetricReadHelper(false);
     long startTime = System.currentTimeMillis();
 
@@ -209,7 +209,7 @@ public class ITMetricAggregator extends AbstractMiniHBaseClusterTest {
     // GIVEN
     TimelineMetricAggregator aggregator =
       TimelineMetricAggregatorFactory.createTimelineMetricAggregatorDaily(hdb,
-        getConfigurationForTest(false), null);
+        getConfigurationForTest(false), null, null);
     TimelineMetricReadHelper readHelper = new TimelineMetricReadHelper(false);
     long startTime = System.currentTimeMillis();
 
@@ -271,7 +271,7 @@ public class ITMetricAggregator extends AbstractMiniHBaseClusterTest {
     // GIVEN
     TimelineMetricAggregator aggregatorMinute =
       TimelineMetricAggregatorFactory.createTimelineMetricAggregatorMinute(hdb,
-        getConfigurationForTest(true), null);
+        getConfigurationForTest(true), null, null);
     TimelineMetricReadHelper readHelper = new TimelineMetricReadHelper(false);
 
     long startTime = System.currentTimeMillis();
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricClusterAggregatorSecondTest.java b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricClusterAggregatorSecondTest.java
index 6541b2c..937dd80 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricClusterAggregatorSecondTest.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricClusterAggregatorSecondTest.java
@@ -19,9 +19,11 @@ package org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline
 
 
 import static org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.availability.AggregationTaskRunner.AGGREGATOR_NAME.METRIC_AGGREGATE_SECOND;
+import static org.easymock.EasyMock.anyBoolean;
 import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.createNiceMock;
 import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
 import static org.easymock.EasyMock.replay;
 
 import java.sql.ResultSet;
@@ -51,6 +53,8 @@ public class TimelineMetricClusterAggregatorSecondTest {
 
     Configuration configuration = new Configuration();
     TimelineMetricMetadataManager metricMetadataManagerMock = createNiceMock(TimelineMetricMetadataManager.class);
+    expect(metricMetadataManagerMock.getUuid(anyObject(TimelineClusterMetric.class))).andReturn(new byte[16]).once();
+    replay(metricMetadataManagerMock);
 
     TimelineMetricClusterAggregatorSecond secondAggregator = new TimelineMetricClusterAggregatorSecond(
       METRIC_AGGREGATE_SECOND, metricMetadataManagerMock, null,
@@ -84,7 +88,7 @@ public class TimelineMetricClusterAggregatorSecondTest {
     Map<TimelineClusterMetric, Double> timelineClusterMetricMap = secondAggregator.sliceFromTimelineMetric(counterMetric, timeSlices);
 
     TimelineClusterMetric timelineClusterMetric = new TimelineClusterMetric(counterMetric.getMetricName(), counterMetric.getAppId(),
-      counterMetric.getInstanceId(), 0l, null);
+      counterMetric.getInstanceId(), 0l);
 
     timelineClusterMetric.setTimestamp(roundedStartTime + 2*sliceInterval);
     Assert.assertTrue(timelineClusterMetricMap.containsKey(timelineClusterMetric));
@@ -103,7 +107,7 @@ public class TimelineMetricClusterAggregatorSecondTest {
     timelineClusterMetricMap = secondAggregator.sliceFromTimelineMetric(metric, timeSlices);
 
     timelineClusterMetric = new TimelineClusterMetric(metric.getMetricName(), metric.getAppId(),
-      metric.getInstanceId(), 0l, null);
+      metric.getInstanceId(), 0l);
 
     timelineClusterMetric.setTimestamp(roundedStartTime + 2*sliceInterval);
     Assert.assertTrue(timelineClusterMetricMap.containsKey(timelineClusterMetric));
@@ -168,7 +172,7 @@ public class TimelineMetricClusterAggregatorSecondTest {
 
     Assert.assertEquals(aggregateClusterMetrics.size(), 4);
     TimelineClusterMetric timelineClusterMetric = new TimelineClusterMetric(timelineMetric.getMetricName(),
-      timelineMetric.getAppId(), timelineMetric.getInstanceId(), startTime + 30*seconds, timelineMetric.getType());
+      timelineMetric.getAppId(), timelineMetric.getInstanceId(), startTime + 30*seconds);
 
     Assert.assertTrue(aggregateClusterMetrics.containsKey(timelineClusterMetric));
     Assert.assertEquals(aggregateClusterMetrics.get(timelineClusterMetric).getSum(), 1.0);
@@ -330,6 +334,29 @@ public class TimelineMetricClusterAggregatorSecondTest {
     TimelineMetricMetadataManager metricMetadataManagerMock = createNiceMock(TimelineMetricMetadataManager.class);
 
     expect(metricMetadataManagerMock.getMetadataCacheValue((TimelineMetricMetadataKey) anyObject())).andReturn(null).anyTimes();
+
+    /*
+    m1-h1-a1
+    m2-h1-a1
+    m2-h1-a2
+    m2-h2-a1
+    m2-h2-a2
+    m2-h3-a2
+
+    So live_hosts : a1 = 2
+       live_hosts : a2 = 3
+     */
+
+    TimelineMetric metric1  = new TimelineMetric("m1", "h1", "a1", null);
+    TimelineMetric metric2  = new TimelineMetric("m2", "h1", "a1", null);
+    TimelineMetric metric3  = new TimelineMetric("m2", "h1", "a2", null);
+    TimelineMetric metric4  = new TimelineMetric("m2", "h2", "a1", null);
+    TimelineMetric metric5  = new TimelineMetric("m2", "h2", "a2", null);
+    TimelineMetric metric6  = new TimelineMetric("m2", "h3", "a2", null);
+
+    expect(metricMetadataManagerMock.getMetricFromUuid((byte[]) anyObject())).
+      andReturn(metric1).andReturn(metric2).andReturn(metric3).
+      andReturn(metric4).andReturn(metric5).andReturn(metric6);
     replay(metricMetadataManagerMock);
 
     TimelineMetricClusterAggregatorSecond secondAggregator = new TimelineMetricClusterAggregatorSecond(
@@ -344,40 +371,16 @@ public class TimelineMetricClusterAggregatorSecondTest {
     ResultSet rs = createNiceMock(ResultSet.class);
 
     TreeMap<Long, Double> metricValues = new TreeMap<>();
-    metricValues.put(startTime + 15*seconds, 1.0);
-    metricValues.put(startTime + 45*seconds, 2.0);
-    metricValues.put(startTime + 75*seconds, 3.0);
-    metricValues.put(startTime + 105*seconds, 4.0);
+    metricValues.put(startTime + 15 * seconds, 1.0);
+    metricValues.put(startTime + 45 * seconds, 2.0);
+    metricValues.put(startTime + 75 * seconds, 3.0);
+    metricValues.put(startTime + 105 * seconds, 4.0);
 
     expect(rs.next()).andReturn(true).times(6);
     expect(rs.next()).andReturn(false);
 
-    /*
-    m1-h1-a1
-    m2-h1-a1
-    m2-h1-a2
-    m2-h2-a1
-    m2-h2-a2
-    m2-h3-a2
-
-    So live_hosts : a1 = 2
-       live_hosts : a2 = 3
-     */
-    expect(rs.getString("METRIC_NAME")).andReturn("m1").times(1);
-    expect(rs.getString("METRIC_NAME")).andReturn("m2").times(5);
-
-    expect(rs.getString("HOSTNAME")).andReturn("h1").times(3);
-    expect(rs.getString("HOSTNAME")).andReturn("h2").times(2);
-    expect(rs.getString("HOSTNAME")).andReturn("h3").times(1);
-
-    expect(rs.getString("APP_ID")).andReturn("a1").times(2);
-    expect(rs.getString("APP_ID")).andReturn("a2").times(1);
-    expect(rs.getString("APP_ID")).andReturn("a1").times(1);
-    expect(rs.getString("APP_ID")).andReturn("a2").times(2);
-
     expect(rs.getLong("SERVER_TIME")).andReturn(now - 150000).times(6);
     expect(rs.getLong("START_TIME")).andReturn(now - 150000).times(6);
-    expect(rs.getString("UNITS")).andReturn(null).times(6);
 
     ObjectMapper mapper = new ObjectMapper();
     expect(rs.getString("METRICS")).andReturn(mapper.writeValueAsString(metricValues)).times(6);
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TestMetadataManager.java b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TestMetadataManager.java
index 3adf770..ca1fc20 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TestMetadataManager.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TestMetadataManager.java
@@ -17,6 +17,7 @@
  */
 package org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.discovery;
 
+import static org.easymock.EasyMock.createNiceMock;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
 
@@ -27,7 +28,7 @@ import org.apache.hadoop.metrics2.sink.timeline.TimelineMetricMetadata;
 import org.apache.hadoop.metrics2.sink.timeline.TimelineMetrics;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.AbstractMiniHBaseClusterTest;
 import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.TimelineMetricConfiguration;
-import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.TimelineMetricsFilter;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.aggregators.TimelineClusterMetric;
 import org.easymock.EasyMock;
 import org.junit.Before;
 import org.junit.Test;
@@ -35,6 +36,10 @@ import org.junit.Test;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
@@ -44,8 +49,7 @@ public class TestMetadataManager extends AbstractMiniHBaseClusterTest {
 
   @Before
   public void insertDummyRecords() throws IOException, SQLException, URISyntaxException {
-    // Initialize new manager
-    metadataManager = new TimelineMetricMetadataManager(new Configuration(), hdb);
+
     final long now = System.currentTimeMillis();
 
     TimelineMetrics timelineMetrics = new TimelineMetrics();
@@ -77,29 +81,13 @@ public class TestMetadataManager extends AbstractMiniHBaseClusterTest {
     }});
     timelineMetrics.getMetrics().add(metric2);
 
+    Configuration metricsConf = createNiceMock(Configuration.class);
+    expect(metricsConf.get("timeline.metrics.service.operation.mode")).andReturn("distributed").anyTimes();
+    replay(metricsConf);
 
-    //Test whitelisting
-    TimelineMetric metric3 = new TimelineMetric();
-    metric3.setMetricName("dummy_metric3");
-    metric3.setHostName("dummy_host3");
-    metric3.setTimestamp(now);
-    metric3.setStartTime(now - 1000);
-    metric3.setAppId("dummy_app3");
-    metric3.setType("Integer");
-    metric3.setMetricValues(new TreeMap<Long, Double>() {{
-      put(now - 100, 1.0);
-      put(now - 200, 2.0);
-      put(now - 300, 3.0);
-    }});
-    timelineMetrics.getMetrics().add(metric3);
-
-    Configuration metricsConf = new Configuration();
-    TimelineMetricConfiguration configuration = EasyMock.createNiceMock(TimelineMetricConfiguration.class);
-    expect(configuration.getMetricsConf()).andReturn(metricsConf).once();
-    replay(configuration);
-    TimelineMetricsFilter.initializeMetricFilter(configuration);
-    TimelineMetricsFilter.addToWhitelist("dummy_metric1");
-    TimelineMetricsFilter.addToWhitelist("dummy_metric2");
+    // Initialize new manager
+    metadataManager = new TimelineMetricMetadataManager(metricsConf, hdb);
+    hdb.setMetadataInstance(metadataManager);
 
     hdb.insertMetricRecordsWithMetadata(metadataManager, timelineMetrics, true);
   }
@@ -109,20 +97,16 @@ public class TestMetadataManager extends AbstractMiniHBaseClusterTest {
     Map<TimelineMetricMetadataKey, TimelineMetricMetadata> cachedData = metadataManager.getMetadataCache();
 
     Assert.assertNotNull(cachedData);
-    Assert.assertEquals(3, cachedData.size());
-    TimelineMetricMetadataKey key1 = new TimelineMetricMetadataKey("dummy_metric1", "dummy_app1");
-    TimelineMetricMetadataKey key2 = new TimelineMetricMetadataKey("dummy_metric2", "dummy_app2");
-    TimelineMetricMetadataKey key3 = new TimelineMetricMetadataKey("dummy_metric3", "dummy_app3");
+    Assert.assertEquals(2, cachedData.size());
+    TimelineMetricMetadataKey key1 = new TimelineMetricMetadataKey("dummy_metric1", "dummy_app1", null);
+    TimelineMetricMetadataKey key2 = new TimelineMetricMetadataKey("dummy_metric2", "dummy_app2", "instance2");
     TimelineMetricMetadata value1 = new TimelineMetricMetadata("dummy_metric1",
-      "dummy_app1", "Integer", null, 1L, true, false);
+      "dummy_app1", null, null, "Integer", 1L, true, true);
     TimelineMetricMetadata value2 = new TimelineMetricMetadata("dummy_metric2",
-      "dummy_app2", "Integer", null, 1L, true, false);
-    TimelineMetricMetadata value3 = new TimelineMetricMetadata("dummy_metric3",
-      "dummy_app3", "Integer", null, 1L, true, true);
+      "dummy_app2", "instance2", null, "Integer", 1L, true, true);
 
     Assert.assertEquals(value1, cachedData.get(key1));
     Assert.assertEquals(value2, cachedData.get(key2));
-    Assert.assertEquals(value3, cachedData.get(key3));
 
     TimelineMetricMetadataSync syncRunnable = new TimelineMetricMetadataSync(metadataManager);
     syncRunnable.run();
@@ -131,26 +115,125 @@ public class TestMetadataManager extends AbstractMiniHBaseClusterTest {
       hdb.getTimelineMetricMetadata();
 
     Assert.assertNotNull(savedData);
-    Assert.assertEquals(3, savedData.size());
+    Assert.assertEquals(2, savedData.size());
     Assert.assertEquals(value1, savedData.get(key1));
     Assert.assertEquals(value2, savedData.get(key2));
-    Assert.assertEquals(value3, savedData.get(key3));
 
-    Map<String, Set<String>> cachedHostData = metadataManager.getHostedAppsCache();
-    Map<String, Set<String>> savedHostData = metadataManager.getHostedAppsFromStore();
+    Map<String, TimelineMetricHostMetadata> cachedHostData = metadataManager.getHostedAppsCache();
+    Map<String, TimelineMetricHostMetadata> savedHostData = metadataManager.getHostedAppsFromStore();
     Assert.assertEquals(cachedData.size(), savedData.size());
-    Assert.assertEquals("dummy_app1", cachedHostData.get("dummy_host1").iterator().next());
-    Assert.assertEquals("dummy_app2", cachedHostData.get("dummy_host2").iterator().next());
-    Assert.assertEquals("dummy_app3", cachedHostData.get("dummy_host3").iterator().next());
-    Assert.assertEquals("dummy_app1", savedHostData.get("dummy_host1").iterator().next());
-    Assert.assertEquals("dummy_app2", savedHostData.get("dummy_host2").iterator().next());
-    Assert.assertEquals("dummy_app3", cachedHostData.get("dummy_host3").iterator().next());
-
+    Assert.assertEquals("dummy_app1", cachedHostData.get("dummy_host1").getHostedApps().iterator().next());
+    Assert.assertEquals("dummy_app2", cachedHostData.get("dummy_host2").getHostedApps().iterator().next());
+    Assert.assertEquals("dummy_app1", savedHostData.get("dummy_host1").getHostedApps().iterator().next());
+    Assert.assertEquals("dummy_app2", savedHostData.get("dummy_host2").getHostedApps().iterator().next());
 
     Map<String, Set<String>> cachedHostInstanceData = metadataManager.getHostedInstanceCache();
     Map<String, Set<String>> savedHostInstanceData = metadataManager.getHostedInstancesFromStore();
     Assert.assertEquals(cachedHostInstanceData.size(), savedHostInstanceData.size());
     Assert.assertEquals("dummy_host2", cachedHostInstanceData.get("instance2").iterator().next());
+  }
 
+  @Test
+  public void testGenerateUuidFromMetric() throws SQLException {
+
+    TimelineMetric timelineMetric = new TimelineMetric();
+    timelineMetric.setMetricName("regionserver.Server.blockCacheExpressHitPercent");
+    timelineMetric.setAppId("hbase");
+    timelineMetric.setHostName("avijayan-ams-2.openstacklocal");
+    timelineMetric.setInstanceId("test1");
+
+    byte[] uuid = metadataManager.getUuid(timelineMetric);
+    Assert.assertNotNull(uuid);
+    Assert.assertEquals(uuid.length, 20);
+
+    byte[] uuidWithoutHost = metadataManager.getUuid(new TimelineClusterMetric(timelineMetric.getMetricName(), timelineMetric.getAppId(), timelineMetric.getInstanceId(), -1));
+    Assert.assertNotNull(uuidWithoutHost);
+    Assert.assertEquals(uuidWithoutHost.length, 16);
+
+    TimelineMetric metric2 = metadataManager.getMetricFromUuid(uuid);
+    Assert.assertEquals(metric2, timelineMetric);
+    TimelineMetric metric3 = metadataManager.getMetricFromUuid(uuidWithoutHost);
+    Assert.assertEquals(metric3.getMetricName(), timelineMetric.getMetricName());
+    Assert.assertEquals(metric3.getAppId(), timelineMetric.getAppId());
+    Assert.assertEquals(metric3.getInstanceId(), timelineMetric.getInstanceId());
+    Assert.assertEquals(metric3.getHostName(), null);
+
+    String metricName1 = metadataManager.getMetricNameFromUuid(uuid);
+    Assert.assertEquals(metricName1, "regionserver.Server.blockCacheExpressHitPercent");
+    String metricName2 = metadataManager.getMetricNameFromUuid(uuidWithoutHost);
+    Assert.assertEquals(metricName2, "regionserver.Server.blockCacheExpressHitPercent");
   }
+
+  @Test
+  public void testWildcardSanitization() throws IOException, SQLException, URISyntaxException {
+    // Initialize new manager
+    metadataManager = new TimelineMetricMetadataManager(new Configuration(), hdb);
+    final long now = System.currentTimeMillis();
+
+    TimelineMetrics timelineMetrics = new TimelineMetrics();
+
+    TimelineMetric metric1 = new TimelineMetric();
+    metric1.setMetricName("dummy_m1");
+    metric1.setHostName("dummy_host1");
+    metric1.setTimestamp(now);
+    metric1.setStartTime(now - 1000);
+    metric1.setAppId("dummy_app1");
+    metric1.setType("Integer");
+    metric1.setMetricValues(new TreeMap<Long, Double>() {{
+      put(now - 100, 1.0);
+      put(now - 200, 2.0);
+      put(now - 300, 3.0);
+    }});
+    timelineMetrics.getMetrics().add(metric1);
+
+    TimelineMetric metric2 = new TimelineMetric();
+    metric2.setMetricName("dummy_m2");
+    metric2.setHostName("dummy_host2");
+    metric2.setTimestamp(now);
+    metric2.setStartTime(now - 1000);
+    metric2.setAppId("dummy_app2");
+    metric2.setType("Integer");
+    metric2.setMetricValues(new TreeMap<Long, Double>() {{
+      put(now - 100, 1.0);
+      put(now - 200, 2.0);
+      put(now - 300, 3.0);
+    }});
+    timelineMetrics.getMetrics().add(metric2);
+
+    TimelineMetric metric3 = new TimelineMetric();
+    metric3.setMetricName("gummy_3");
+    metric3.setHostName("dummy_3h");
+    metric3.setTimestamp(now);
+    metric3.setStartTime(now - 1000);
+    metric3.setAppId("dummy_app3");
+    metric3.setType("Integer");
+    metric3.setMetricValues(new TreeMap<Long, Double>() {{
+      put(now - 100, 1.0);
+      put(now - 200, 2.0);
+      put(now - 300, 3.0);
+    }});
+    timelineMetrics.getMetrics().add(metric3);
+
+    Configuration metricsConf = new Configuration();
+    TimelineMetricConfiguration configuration = EasyMock.createNiceMock(TimelineMetricConfiguration.class);
+    expect(configuration.getMetricsConf()).andReturn(metricsConf).once();
+    replay(configuration);
+
+    hdb.insertMetricRecordsWithMetadata(metadataManager, timelineMetrics, true);
+
+    List<byte[]> uuids = metadataManager.getUuids(Collections.singletonList("dummy_m%"),
+      Collections.singletonList("dummy_host2"), "dummy_app1", null);
+    Assert.assertTrue(uuids.size() == 2);
+
+    uuids = metadataManager.getUuids(Collections.singletonList("dummy_m%"),
+      Collections.singletonList("dummy_host%"), "dummy_app2", null);
+    Assert.assertTrue(uuids.size() == 4);
+
+    Collection<String> metrics = Arrays.asList("dummy_m%", "dummy_3", "dummy_m2");
+    List<String> hosts = Arrays.asList("dummy_host%", "dummy_3h");
+    uuids = metadataManager.getUuids(metrics, hosts, "dummy_app2", null);
+    Assert.assertTrue(uuids.size() == 9);
+  }
+
+
 }
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TestMetadataSync.java b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TestMetadataSync.java
index a524b13..8d486e1 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TestMetadataSync.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/discovery/TestMetadataSync.java
@@ -41,19 +41,19 @@ public class TestMetadataSync {
     PhoenixHBaseAccessor hBaseAccessor = createNiceMock(PhoenixHBaseAccessor.class);
 
     final TimelineMetricMetadata testMetadata1 = new TimelineMetricMetadata(
-      "m1", "a1", "", GAUGE.name(), System.currentTimeMillis(), true, false);
+      "m1", "a1", null, "", GAUGE.name(), System.currentTimeMillis(), true, false);
     final TimelineMetricMetadata testMetadata2 = new TimelineMetricMetadata(
-      "m2", "a2", "", GAUGE.name(), System.currentTimeMillis(), true, false);
+      "m2", "a2", null, "", GAUGE.name(), System.currentTimeMillis(), true, false);
 
     Map<TimelineMetricMetadataKey, TimelineMetricMetadata> metadata =
       new HashMap<TimelineMetricMetadataKey, TimelineMetricMetadata>() {{
-        put(new TimelineMetricMetadataKey("m1", "a1"), testMetadata1);
-        put(new TimelineMetricMetadataKey("m2", "a2"), testMetadata2);
+        put(new TimelineMetricMetadataKey("m1", "a1", null), testMetadata1);
+        put(new TimelineMetricMetadataKey("m2", "a2", null), testMetadata2);
       }};
 
-    Map<String, Set<String>> hostedApps = new HashMap<String, Set<String>>() {{
-      put("h1", new HashSet<>(Arrays.asList("a1")));
-      put("h2", new HashSet<>(Arrays.asList("a1", "a2")));
+    Map<String, TimelineMetricHostMetadata> hostedApps = new HashMap<String, TimelineMetricHostMetadata>() {{
+      put("h1", new TimelineMetricHostMetadata(new HashSet<>(Arrays.asList("a1"))));
+      put("h2", new TimelineMetricHostMetadata((new HashSet<>(Arrays.asList("a1", "a2")))));
     }};
 
     Map<String, Set<String>> hostedInstances = new HashMap<String, Set<String>>() {{
@@ -61,14 +61,14 @@ public class TestMetadataSync {
       put("i2", new HashSet<>(Arrays.asList("h1", "h2")));
     }};
 
-    expect(configuration.get("timeline.metrics.service.operation.mode", "")).andReturn("distributed");
+    expect(configuration.get("timeline.metrics.service.operation.mode")).andReturn("distributed");
     expect(hBaseAccessor.getTimelineMetricMetadata()).andReturn(metadata);
     expect(hBaseAccessor.getHostedAppsMetadata()).andReturn(hostedApps);
     expect(hBaseAccessor.getInstanceHostsMetdata()).andReturn(hostedInstances);
 
     replay(configuration, hBaseAccessor);
 
-    TimelineMetricMetadataManager metadataManager = new TimelineMetricMetadataManager(new Configuration(), hBaseAccessor);
+    TimelineMetricMetadataManager metadataManager = new TimelineMetricMetadataManager(configuration, hBaseAccessor);
 
     metadataManager.metricMetadataSync = new TimelineMetricMetadataSync(metadataManager);
 
@@ -78,13 +78,13 @@ public class TestMetadataSync {
 
     metadata = metadataManager.getMetadataCache();
     Assert.assertEquals(2, metadata.size());
-    Assert.assertTrue(metadata.containsKey(new TimelineMetricMetadataKey("m1", "a1")));
-    Assert.assertTrue(metadata.containsKey(new TimelineMetricMetadataKey("m2", "a2")));
+    Assert.assertTrue(metadata.containsKey(new TimelineMetricMetadataKey("m1", "a1", null)));
+    Assert.assertTrue(metadata.containsKey(new TimelineMetricMetadataKey("m2", "a2", null)));
 
     hostedApps = metadataManager.getHostedAppsCache();
     Assert.assertEquals(2, hostedApps.size());
-    Assert.assertEquals(1, hostedApps.get("h1").size());
-    Assert.assertEquals(2, hostedApps.get("h2").size());
+    Assert.assertEquals(1, hostedApps.get("h1").getHostedApps().size());
+    Assert.assertEquals(2, hostedApps.get("h2").getHostedApps().size());
 
     hostedInstances = metadataManager.getHostedInstanceCache();
     Assert.assertEquals(2, hostedInstances.size());
@@ -99,11 +99,11 @@ public class TestMetadataSync {
     PhoenixHBaseAccessor hBaseAccessor = createNiceMock(PhoenixHBaseAccessor.class);
 
     TimelineMetricMetadata metadata1 = new TimelineMetricMetadata(
-      "xxx.abc.yyy", "a1", "", GAUGE.name(), System.currentTimeMillis(), true, false);
+      "xxx.abc.yyy", "a1", null, "", GAUGE.name(), System.currentTimeMillis(), true, false);
     TimelineMetricMetadata metadata2 = new TimelineMetricMetadata(
-      "xxx.cdef.yyy", "a2", "", GAUGE.name(), System.currentTimeMillis(), true, false);
+      "xxx.cdef.yyy", "a2", null, "", GAUGE.name(), System.currentTimeMillis(), true, false);
     TimelineMetricMetadata metadata3 = new TimelineMetricMetadata(
-      "xxx.pqr.zzz", "a3", "", GAUGE.name(), System.currentTimeMillis(), true, false);
+      "xxx.pqr.zzz", "a3", null, "", GAUGE.name(), System.currentTimeMillis(), true, false);
 
     expect(configuration.get(TIMELINE_METRIC_METADATA_FILTERS)).andReturn("abc,cde");
 
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/uuid/TimelineMetricUuidManagerTest.java b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/uuid/TimelineMetricUuidManagerTest.java
new file mode 100644
index 0000000..d1b3f01
--- /dev/null
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/uuid/TimelineMetricUuidManagerTest.java
@@ -0,0 +1,184 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.uuid;
+
+import static org.easymock.EasyMock.anyString;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.PhoenixHBaseAccessor;
+import org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.timeline.aggregators.TimelineClusterMetric;
+import org.easymock.EasyMock;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class TimelineMetricUuidManagerTest {
+
+
+  private List<String> apps = Arrays.asList("namenode",
+    "datanode", "master_hbase", "slave_hbase", "kafka_broker", "nimbus", "ams-hbase",
+    "accumulo", "nodemanager", "resourcemanager", "ambari_server", "HOST", "timeline_metric_store_watcher",
+    "jobhistoryserver", "hiveserver2", "hivemetastore", "applicationhistoryserver", "amssmoketestfake");
+
+  private Map<String, Set<String>> metricSet  = new HashMap<>(populateMetricWhitelistFromFile());
+
+  @Test
+  public void testHashBasedUuidForMetricName() throws SQLException {
+
+    MetricUuidGenStrategy strategy = new HashBasedUuidGenStrategy();
+    Map<String, TimelineClusterMetric> uuids = new HashMap<>();
+    for (String app : metricSet.keySet()) {
+      Set<String> metrics = metricSet.get(app);
+      for (String metric : metrics) {
+        TimelineClusterMetric timelineClusterMetric = new TimelineClusterMetric(metric, app, null, -1l);
+        byte[] uuid = strategy.computeUuid(timelineClusterMetric, 16);
+        Assert.assertNotNull(uuid);
+        Assert.assertTrue(uuid.length == 16);
+        String uuidStr = new String(uuid);
+        Assert.assertFalse(uuids.containsKey(uuidStr) && !uuids.containsValue(timelineClusterMetric));
+        if (uuids.containsKey(uuidStr) ) {
+          if (!uuids.containsValue(timelineClusterMetric)) {
+            System.out.println("COLLISION : " + timelineClusterMetric.toString() + " = " + uuids.get(uuidStr));
+          }
+        }
+        uuids.put(uuidStr, timelineClusterMetric);
+      }
+    }
+  }
+
+  @Test
+  public void testHaseBasedUuidForAppIds() throws SQLException {
+
+    MetricUuidGenStrategy strategy = new HashBasedUuidGenStrategy();
+    Map<String, TimelineClusterMetric> uuids = new HashMap<>();
+    for (String app : metricSet.keySet()) {
+      TimelineClusterMetric timelineClusterMetric = new TimelineClusterMetric("TestMetric", app, null, -1l);
+      byte[] uuid = strategy.computeUuid(timelineClusterMetric, 16);
+      String uuidStr = new String(uuid);
+      if (uuids.containsKey(uuidStr) ) {
+        if (!uuids.containsValue(timelineClusterMetric)) {
+          System.out.println("COLLISION : " + timelineClusterMetric.toString() + " = " + uuids.get(uuidStr));
+        }
+      }
+      uuids.put(uuidStr, timelineClusterMetric);
+    }
+  }
+
+  @Test
+  public void testHashBasedUuidForHostnames() throws SQLException {
+
+    MetricUuidGenStrategy strategy = new HashBasedUuidGenStrategy();
+    Map<String, String> uuids = new HashMap<>();
+
+    List<String> hosts = new ArrayList<>();
+    String hostPrefix = "TestHost.";
+    String hostSuffix = ".ambari.apache.org";
+
+    for (int i=0; i<=2000; i++) {
+      hosts.add(hostPrefix + i + hostSuffix);
+    }
+
+    for (String host : hosts) {
+      byte[] uuid = strategy.computeUuid(host, 4);
+      Assert.assertNotNull(uuid);
+      Assert.assertTrue(uuid.length == 4);
+      String uuidStr = new String(uuid);
+      Assert.assertFalse(uuids.containsKey(uuidStr));
+      uuids.put(uuidStr, host);
+    }
+  }
+
+
+  @Test
+  public void testRandomUuidForWhitelistedMetrics() throws SQLException {
+
+    MetricUuidGenStrategy strategy = new RandomUuidGenStrategy();
+    Map<String, String> uuids = new HashMap<>();
+    for (String app : metricSet.keySet()) {
+      Set<String> metrics = metricSet.get(app);
+      for (String metric : metrics) {
+        byte[] uuid = strategy.computeUuid(new TimelineClusterMetric(metric, app, null, -1l), 16);
+        Assert.assertNotNull(uuid);
+        Assert.assertTrue(uuid.length == 16);
+        String uuidStr = new String(uuid);
+        Assert.assertFalse(uuids.containsKey(uuidStr) && !uuids.containsValue(metric));
+        uuids.put(uuidStr, metric);
+      }
+    }
+  }
+
+  public Map<String, Set<String>> populateMetricWhitelistFromFile() {
+
+
+    Map<String, Set<String>> metricSet = new HashMap<String, Set<String>>();
+    FileInputStream fstream = null;
+    BufferedReader br = null;
+    String strLine;
+    for (String appId : apps) {
+      URL fileUrl = ClassLoader.getSystemResource("metrics_def/" + appId.toUpperCase() + ".dat");
+
+      Set<String> metricsForApp = new HashSet<>();
+      try {
+        fstream = new FileInputStream(fileUrl.getPath());
+        br = new BufferedReader(new InputStreamReader(fstream));
+        while ((strLine = br.readLine()) != null)   {
+          strLine = strLine.trim();
+          metricsForApp.add(strLine);
+        }
+      } catch (Exception ioEx) {
+        System.out.println("Metrics for AppId " + appId + " not found.");
+      } finally {
+        if (br != null) {
+          try {
+            br.close();
+          } catch (IOException e) {
+          }
+        }
+
+        if (fstream != null) {
+          try {
+            fstream.close();
+          } catch (IOException e) {
+          }
+        }
+      }
+      metricsForApp.add("live_hosts");
+      metricSet.put(appId.contains("hbase") ? "hbase" : appId, metricsForApp);
+      System.out.println("Found " + metricsForApp.size() + " metrics for appId = " + appId);
+    }
+    return metricSet;
+  }
+}
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/test/resources/test_data/full_whitelist.dat b/ambari-metrics/ambari-metrics-timelineservice/src/test/resources/test_data/full_whitelist.dat
new file mode 100644
index 0000000..0e22ffb
--- /dev/null
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/test/resources/test_data/full_whitelist.dat
@@ -0,0 +1,1615 @@
+AMBARI_METRICS.SmokeTest.FakeMetric
+TimelineMetricStoreWatcher.FakeMetric
+boottime
+bytes_in
+bytes_out
+cpu_idle
+cpu_intr
+cpu_nice
+cpu_num
+cpu_sintr
+cpu_steal
+cpu_system
+cpu_user
+cpu_wio
+disk_free
+disk_num
+disk_percent
+disk_total
+disk_used
+load_fifteen
+load_five
+load_one
+mem_buffered
+mem_cached
+mem_free
+mem_shared
+mem_total
+mem_used
+pkts_in
+pkts_out
+proc_run
+proc_total
+read_bps
+read_bytes
+read_count
+read_time
+sdisk_vda1_read_bytes
+sdisk_vda1_read_count
+sdisk_vda1_read_time
+sdisk_vda1_write_bytes
+sdisk_vda1_write_count
+sdisk_vda1_write_time
+sdisk_vdb_read_bytes
+sdisk_vdb_read_count
+sdisk_vdb_read_time
+sdisk_vdb_write_bytes
+sdisk_vdb_write_count
+sdisk_vdb_write_time
+swap_free
+swap_in
+swap_out
+swap_total
+swap_used
+write_bps
+write_bytes
+write_count
+write_time
+regionserver.WAL.SyncTime_min
+regionserver.WAL.SyncTime_num_ops
+regionserver.WAL.appendCount
+regionserver.WAL.slowAppendCount
+jvm.JvmMetrics.GcTimeMillis
+jvm.JvmMetrics.GcTimeMillisConcurrentMarkSweep
+jvm.JvmMetrics.GcTimeMillisParNew
+ugi.UgiMetrics.GetGroupsAvgTime
+ugi.UgiMetrics.GetGroupsNumOps
+ugi.UgiMetrics.LoginFailureNumOps
+ugi.UgiMetrics.LoginSuccessAvgTime
+ugi.UgiMetrics.LoginSuccessNumOps
+ugi.UgiMetrics.LoginFailureAvgTime
+jvm.JvmMetrics.LogError
+jvm.JvmMetrics.LogFatal
+jvm.JvmMetrics.LogInfo
+jvm.JvmMetrics.LogWarn
+jvm.JvmMetrics.MemHeapCommittedM
+jvm.JvmMetrics.MemHeapMaxM
+jvm.JvmMetrics.MemHeapUsedM
+jvm.JvmMetrics.MemMaxM
+jvm.JvmMetrics.MemNonHeapCommittedM
+jvm.JvmMetrics.MemNonHeapMaxM
+jvm.JvmMetrics.MemNonHeapUsedM
+jvm.JvmMetrics.ThreadsBlocked
+jvm.JvmMetrics.ThreadsNew
+jvm.JvmMetrics.ThreadsRunnable
+jvm.JvmMetrics.ThreadsTerminated
+jvm.JvmMetrics.ThreadsTimedWaiting
+master.AssignmentManger.Assign_75th_percentile
+master.AssignmentManger.Assign_95th_percentile
+master.AssignmentManger.Assign_99th_percentile
+master.AssignmentManger.Assign_max
+master.AssignmentManger.Assign_mean
+master.AssignmentManger.Assign_median
+master.AssignmentManger.Assign_min
+jvm.JvmMetrics.ThreadsWaiting
+master.AssignmentManger.Assign_num_ops
+master.AssignmentManger.BulkAssign_75th_percentile
+master.AssignmentManger.BulkAssign_95th_percentile
+master.AssignmentManger.BulkAssign_99th_percentile
+master.AssignmentManger.BulkAssign_max
+master.AssignmentManger.BulkAssign_mean
+master.AssignmentManger.BulkAssign_median
+master.AssignmentManger.BulkAssign_min
+master.AssignmentManger.BulkAssign_num_ops
+master.AssignmentManger.ritCount
+master.AssignmentManger.ritCountOverThreshold
+master.AssignmentManger.ritOldestAge
+master.Balancer.BalancerCluster_75th_percentile
+master.Balancer.BalancerCluster_95th_percentile
+master.Balancer.BalancerCluster_99th_percentile
+master.Balancer.BalancerCluster_max
+master.Balancer.BalancerCluster_mean
+master.Balancer.BalancerCluster_median
+master.Balancer.BalancerCluster_min
+master.Balancer.BalancerCluster_num_ops
+master.Balancer.miscInvocationCount
+master.FileSystem.HlogSplitSize_75th_percentile
+master.FileSystem.HlogSplitSize_95th_percentile
+master.FileSystem.HlogSplitSize_99th_percentile
+master.FileSystem.HlogSplitSize_max
+master.FileSystem.HlogSplitSize_mean
+master.FileSystem.HlogSplitSize_median
+master.FileSystem.HlogSplitSize_min
+master.FileSystem.HlogSplitSize_num_ops
+master.FileSystem.HlogSplitTime_75th_percentile
+master.FileSystem.HlogSplitTime_95th_percentile
+master.FileSystem.HlogSplitTime_99th_percentile
+master.FileSystem.HlogSplitTime_max
+master.FileSystem.HlogSplitTime_mean
+master.FileSystem.HlogSplitTime_median
+master.FileSystem.HlogSplitTime_min
+master.FileSystem.HlogSplitTime_num_ops
+master.FileSystem.MetaHlogSplitSize_75th_percentile
+master.FileSystem.MetaHlogSplitSize_95th_percentile
+master.FileSystem.MetaHlogSplitSize_99th_percentile
+master.FileSystem.MetaHlogSplitSize_max
+master.FileSystem.MetaHlogSplitSize_mean
+master.FileSystem.MetaHlogSplitSize_median
+master.FileSystem.MetaHlogSplitSize_min
+master.FileSystem.MetaHlogSplitSize_num_ops
+master.FileSystem.MetaHlogSplitTime_75th_percentile
+master.FileSystem.MetaHlogSplitTime_95th_percentile
+master.FileSystem.MetaHlogSplitTime_99th_percentile
+master.FileSystem.MetaHlogSplitTime_max
+master.FileSystem.MetaHlogSplitTime_mean
+master.FileSystem.MetaHlogSplitTime_median
+master.FileSystem.MetaHlogSplitTime_min
+master.FileSystem.MetaHlogSplitTime_num_ops
+master.Server.averageLoad
+master.Server.clusterRequests
+master.Server.masterActiveTime
+master.Server.masterStartTime
+master.Server.numDeadRegionServers
+master.Server.numRegionServers
+metricssystem.MetricsSystem.DroppedPubAll
+metricssystem.MetricsSystem.NumActiveSinks
+ipc.IPC.ProcessCallTime_75th_percentile
+ipc.IPC.ProcessCallTime_95th_percentile
+metricssystem.MetricsSystem.NumActiveSources
+metricssystem.MetricsSystem.NumAllSinks
+ipc.IPC.ProcessCallTime_99th_percentile
+metricssystem.MetricsSystem.NumAllSources
+metricssystem.MetricsSystem.PublishAvgTime
+metricssystem.MetricsSystem.PublishNumOps
+ipc.IPC.ProcessCallTime_max
+ipc.IPC.ProcessCallTime_mean
+metricssystem.MetricsSystem.Sink_timelineAvgTime
+ipc.IPC.ProcessCallTime_median
+metricssystem.MetricsSystem.Sink_timelineDropped
+metricssystem.MetricsSystem.Sink_timelineNumOps
+ipc.IPC.ProcessCallTime_num_ops
+metricssystem.MetricsSystem.Sink_timelineQsize
+metricssystem.MetricsSystem.SnapshotAvgTime
+ipc.IPC.QueueCallTime_95th_percentile
+metricssystem.MetricsSystem.SnapshotNumOps
+ipc.IPC.ProcessCallTime_min
+ipc.IPC.QueueCallTime_75th_percentile
+ipc.IPC.QueueCallTime_99th_percentile
+ipc.IPC.QueueCallTime_max
+ipc.IPC.QueueCallTime_mean
+ipc.IPC.QueueCallTime_median
+ipc.IPC.QueueCallTime_min
+regionserver.Server.Append_75th_percentile
+regionserver.Server.Append_95th_percentile
+ipc.IPC.QueueCallTime_num_ops
+ipc.IPC.authenticationFailures
+regionserver.Server.Append_99th_percentile
+regionserver.Server.Append_max
+ipc.IPC.authenticationSuccesses
+regionserver.Server.Append_mean
+regionserver.Server.Append_median
+regionserver.Server.Append_min
+regionserver.Server.Append_num_ops
+regionserver.Server.Delete_75th_percentile
+regionserver.Server.Delete_95th_percentile
+ipc.IPC.authorizationFailures
+regionserver.Server.Delete_99th_percentile
+regionserver.Server.Delete_max
+regionserver.Server.Delete_mean
+regionserver.Server.Delete_median
+regionserver.Server.Delete_min
+regionserver.Server.Delete_num_ops
+ipc.IPC.authorizationSuccesses
+ipc.IPC.numActiveHandler
+ipc.IPC.numCallsInGeneralQueue
+regionserver.Server.Get_75th_percentile
+regionserver.Server.Get_95th_percentile
+regionserver.Server.Get_99th_percentile
+regionserver.Server.Get_max
+regionserver.Server.Get_mean
+regionserver.Server.Get_median
+ipc.IPC.numCallsInPriorityQueue
+regionserver.Server.Get_min
+regionserver.Server.Get_num_ops
+regionserver.Server.Increment_75th_percentile
+regionserver.Server.Increment_95th_percentile
+regionserver.Server.Increment_99th_percentile
+regionserver.Server.Increment_max
+regionserver.Server.Increment_mean
+regionserver.Server.Increment_median
+ipc.IPC.numCallsInReplicationQueue
+ipc.IPC.numOpenConnections
+regionserver.Server.Increment_min
+regionserver.Server.Increment_num_ops
+ipc.IPC.queueSize
+regionserver.Server.Mutate_75th_percentile
+regionserver.Server.Mutate_95th_percentile
+regionserver.Server.Mutate_99th_percentile
+regionserver.Server.Mutate_max
+regionserver.Server.Mutate_mean
+regionserver.Server.Mutate_median
+ipc.IPC.receivedBytes
+regionserver.Server.Mutate_min
+regionserver.Server.Mutate_num_ops
+regionserver.Server.Replay_75th_percentile
+regionserver.Server.Replay_95th_percentile
+regionserver.Server.Replay_99th_percentile
+regionserver.Server.Replay_max
+regionserver.Server.Replay_mean
+regionserver.Server.Replay_median
+ipc.IPC.sentBytes
+jvm.JvmMetrics.GcCount
+regionserver.Server.Replay_min
+regionserver.Server.Replay_num_ops
+regionserver.Server.blockCacheCount
+regionserver.Server.blockCacheEvictionCount
+regionserver.Server.blockCacheExpressHitPercent
+regionserver.Server.blockCacheFreeSize
+regionserver.Server.blockCacheHitCount
+regionserver.Server.blockCacheMissCount
+regionserver.Server.blockCacheSize
+regionserver.Server.blockCountHitPercent
+regionserver.Server.checkMutateFailedCount
+regionserver.Server.checkMutatePassedCount
+regionserver.Server.compactionQueueLength
+regionserver.Server.flushQueueLength
+jvm.JvmMetrics.GcCountConcurrentMarkSweep
+regionserver.Server.hlogFileCount
+regionserver.Server.hlogFileSize
+regionserver.Server.memStoreSize
+regionserver.Server.mutationsWithoutWALCount
+regionserver.Server.mutationsWithoutWALSize
+regionserver.Server.percentFilesLocal
+regionserver.Server.readRequestCount
+regionserver.Server.regionCount
+regionserver.Server.regionServerStartTime
+regionserver.Server.slowAppendCount
+regionserver.Server.slowDeleteCount
+regionserver.Server.slowGetCount
+regionserver.Server.slowIncrementCount
+regionserver.Server.slowPutCount
+regionserver.Server.staticBloomSize
+regionserver.Server.staticIndexSize
+regionserver.Server.storeCount
+regionserver.Server.storeFileCount
+regionserver.Server.storeFileIndexSize
+regionserver.Server.storeFileSize
+regionserver.Server.totalRequestCount
+regionserver.Server.updatesBlockedTime
+regionserver.Server.writeRequestCount
+regionserver.WAL.AppendSize_75th_percentile
+regionserver.WAL.AppendSize_95th_percentile
+regionserver.WAL.AppendSize_99th_percentile
+regionserver.WAL.AppendSize_max
+regionserver.WAL.AppendSize_mean
+regionserver.WAL.AppendSize_median
+regionserver.WAL.SyncTime_median
+jvm.JvmMetrics.GcCountParNew
+regionserver.WAL.AppendSize_min
+regionserver.WAL.AppendSize_num_ops
+regionserver.WAL.SyncTime_max
+regionserver.WAL.AppendTime_75th_percentile
+regionserver.WAL.AppendTime_95th_percentile
+regionserver.WAL.AppendTime_99th_percentile
+regionserver.WAL.AppendTime_max
+regionserver.WAL.SyncTime_95th_percentile
+regionserver.WAL.AppendTime_mean
+regionserver.WAL.AppendTime_median
+regionserver.WAL.AppendTime_min
+regionserver.WAL.AppendTime_num_ops
+regionserver.WAL.SyncTime_75th_percentile
+regionserver.WAL.SyncTime_99th_percentile
+regionserver.WAL.SyncTime_mean
+BatchCompleteCount
+BatchEmptyCount
+BatchUnderflowCount
+ChannelCapacity
+ChannelFillPercentage
+ChannelSize
+ConnectionClosedCount
+ConnectionCreatedCount
+ConnectionFailedCount
+EventDrainAttemptCount
+EventDrainSuccessCount
+EventPutAttemptCount
+EventPutSuccessCount
+EventTakeSuccessCount
+EventTakeAttemptCount
+StartTime
+StopTime
+regionserver.WAL.SyncTime_min
+regionserver.WAL.SyncTime_num_ops
+regionserver.WAL.appendCount
+regionserver.WAL.slowAppendCount
+jvm.JvmMetrics.GcTimeMillis
+jvm.JvmMetrics.GcTimeMillisConcurrentMarkSweep
+jvm.JvmMetrics.GcTimeMillisParNew
+ugi.UgiMetrics.GetGroupsAvgTime
+ugi.UgiMetrics.GetGroupsNumOps
+ugi.UgiMetrics.LoginFailureNumOps
+ugi.UgiMetrics.LoginSuccessAvgTime
+ugi.UgiMetrics.LoginSuccessNumOps
+ugi.UgiMetrics.LoginFailureAvgTime
+jvm.JvmMetrics.LogError
+jvm.JvmMetrics.LogFatal
+jvm.JvmMetrics.LogInfo
+jvm.JvmMetrics.LogWarn
+jvm.JvmMetrics.MemHeapCommittedM
+jvm.JvmMetrics.MemHeapMaxM
+jvm.JvmMetrics.MemHeapUsedM
+jvm.JvmMetrics.MemMaxM
+jvm.JvmMetrics.MemNonHeapCommittedM
+jvm.JvmMetrics.MemNonHeapMaxM
+jvm.JvmMetrics.MemNonHeapUsedM
+jvm.JvmMetrics.ThreadsBlocked
+jvm.JvmMetrics.ThreadsNew
+jvm.JvmMetrics.ThreadsRunnable
+jvm.JvmMetrics.ThreadsTerminated
+jvm.JvmMetrics.ThreadsTimedWaiting
+master.AssignmentManger.Assign_75th_percentile
+master.AssignmentManger.Assign_95th_percentile
+master.AssignmentManger.Assign_99th_percentile
+master.AssignmentManger.Assign_max
+master.AssignmentManger.Assign_mean
+master.AssignmentManger.Assign_median
+master.AssignmentManger.Assign_min
+jvm.JvmMetrics.ThreadsWaiting
+master.AssignmentManger.Assign_num_ops
+master.AssignmentManger.BulkAssign_75th_percentile
+master.AssignmentManger.BulkAssign_95th_percentile
+master.AssignmentManger.BulkAssign_99th_percentile
+master.AssignmentManger.BulkAssign_max
+master.AssignmentManger.BulkAssign_mean
+master.AssignmentManger.BulkAssign_median
+master.AssignmentManger.BulkAssign_min
+master.AssignmentManger.BulkAssign_num_ops
+master.AssignmentManger.ritCount
+master.AssignmentManger.ritCountOverThreshold
+master.AssignmentManger.ritOldestAge
+master.Balancer.BalancerCluster_75th_percentile
+master.Balancer.BalancerCluster_95th_percentile
+master.Balancer.BalancerCluster_99th_percentile
+master.Balancer.BalancerCluster_max
+master.Balancer.BalancerCluster_mean
+master.Balancer.BalancerCluster_median
+master.Balancer.BalancerCluster_min
+master.Balancer.BalancerCluster_num_ops
+master.Balancer.miscInvocationCount
+master.FileSystem.HlogSplitSize_75th_percentile
+master.FileSystem.HlogSplitSize_95th_percentile
+master.FileSystem.HlogSplitSize_99th_percentile
+master.FileSystem.HlogSplitSize_max
+master.FileSystem.HlogSplitSize_mean
+master.FileSystem.HlogSplitSize_median
+master.FileSystem.HlogSplitSize_min
+master.FileSystem.HlogSplitSize_num_ops
+master.FileSystem.HlogSplitTime_75th_percentile
+master.FileSystem.HlogSplitTime_95th_percentile
+master.FileSystem.HlogSplitTime_99th_percentile
+master.FileSystem.HlogSplitTime_max
+master.FileSystem.HlogSplitTime_mean
+master.FileSystem.HlogSplitTime_median
+master.FileSystem.HlogSplitTime_min
+master.FileSystem.HlogSplitTime_num_ops
+master.FileSystem.MetaHlogSplitSize_75th_percentile
+master.FileSystem.MetaHlogSplitSize_95th_percentile
+master.FileSystem.MetaHlogSplitSize_99th_percentile
+master.FileSystem.MetaHlogSplitSize_max
+master.FileSystem.MetaHlogSplitSize_mean
+master.FileSystem.MetaHlogSplitSize_median
+master.FileSystem.MetaHlogSplitSize_min
+master.FileSystem.MetaHlogSplitSize_num_ops
+master.FileSystem.MetaHlogSplitTime_75th_percentile
+master.FileSystem.MetaHlogSplitTime_95th_percentile
+master.FileSystem.MetaHlogSplitTime_99th_percentile
+master.FileSystem.MetaHlogSplitTime_max
+master.FileSystem.MetaHlogSplitTime_mean
+master.FileSystem.MetaHlogSplitTime_median
+master.FileSystem.MetaHlogSplitTime_min
+master.FileSystem.MetaHlogSplitTime_num_ops
+master.Server.averageLoad
+master.Server.clusterRequests
+master.Server.masterActiveTime
+master.Server.masterStartTime
+master.Server.numDeadRegionServers
+master.Server.numRegionServers
+metricssystem.MetricsSystem.DroppedPubAll
+metricssystem.MetricsSystem.NumActiveSinks
+ipc.IPC.ProcessCallTime_75th_percentile
+ipc.IPC.ProcessCallTime_95th_percentile
+metricssystem.MetricsSystem.NumActiveSources
+metricssystem.MetricsSystem.NumAllSinks
+ipc.IPC.ProcessCallTime_99th_percentile
+metricssystem.MetricsSystem.NumAllSources
+metricssystem.MetricsSystem.PublishAvgTime
+metricssystem.MetricsSystem.PublishNumOps
+ipc.IPC.ProcessCallTime_max
+ipc.IPC.ProcessCallTime_mean
+metricssystem.MetricsSystem.Sink_timelineAvgTime
+ipc.IPC.ProcessCallTime_median
+metricssystem.MetricsSystem.Sink_timelineDropped
+metricssystem.MetricsSystem.Sink_timelineNumOps
+ipc.IPC.ProcessCallTime_num_ops
+metricssystem.MetricsSystem.Sink_timelineQsize
+metricssystem.MetricsSystem.SnapshotAvgTime
+ipc.IPC.QueueCallTime_95th_percentile
+metricssystem.MetricsSystem.SnapshotNumOps
+ipc.IPC.ProcessCallTime_min
+ipc.IPC.QueueCallTime_75th_percentile
+ipc.IPC.QueueCallTime_99th_percentile
+ipc.IPC.QueueCallTime_max
+ipc.IPC.QueueCallTime_mean
+ipc.IPC.QueueCallTime_median
+ipc.IPC.QueueCallTime_min
+regionserver.Server.Append_75th_percentile
+regionserver.Server.Append_95th_percentile
+ipc.IPC.QueueCallTime_num_ops
+ipc.IPC.authenticationFailures
+regionserver.Server.Append_99th_percentile
+regionserver.Server.Append_max
+ipc.IPC.authenticationSuccesses
+regionserver.Server.Append_mean
+regionserver.Server.Append_median
+regionserver.Server.Append_min
+regionserver.Server.Append_num_ops
+regionserver.Server.Delete_75th_percentile
+regionserver.Server.Delete_95th_percentile
+ipc.IPC.authorizationFailures
+regionserver.Server.Delete_99th_percentile
+regionserver.Server.Delete_max
+regionserver.Server.Delete_mean
+regionserver.Server.Delete_median
+regionserver.Server.Delete_min
+regionserver.Server.Delete_num_ops
+ipc.IPC.authorizationSuccesses
+ipc.IPC.numActiveHandler
+ipc.IPC.numCallsInGeneralQueue
+regionserver.Server.Get_75th_percentile
+regionserver.Server.Get_95th_percentile
+regionserver.Server.Get_99th_percentile
+regionserver.Server.Get_max
+regionserver.Server.Get_mean
+regionserver.Server.Get_median
+ipc.IPC.numCallsInPriorityQueue
+regionserver.Server.Get_min
+regionserver.Server.Get_num_ops
+regionserver.Server.Increment_75th_percentile
+regionserver.Server.Increment_95th_percentile
+regionserver.Server.Increment_99th_percentile
+regionserver.Server.Increment_max
+regionserver.Server.Increment_mean
+regionserver.Server.Increment_median
+ipc.IPC.numCallsInReplicationQueue
+ipc.IPC.numOpenConnections
+regionserver.Server.Increment_min
+regionserver.Server.Increment_num_ops
+ipc.IPC.queueSize
+regionserver.Server.Mutate_75th_percentile
+regionserver.Server.Mutate_95th_percentile
+regionserver.Server.Mutate_99th_percentile
+regionserver.Server.Mutate_max
+regionserver.Server.Mutate_mean
+regionserver.Server.Mutate_median
+ipc.IPC.receivedBytes
+regionserver.Server.Mutate_min
+regionserver.Server.Mutate_num_ops
+regionserver.Server.Replay_75th_percentile
+regionserver.Server.Replay_95th_percentile
+regionserver.Server.Replay_99th_percentile
+regionserver.Server.Replay_max
+regionserver.Server.Replay_mean
+regionserver.Server.Replay_median
+ipc.IPC.sentBytes
+jvm.JvmMetrics.GcCount
+regionserver.Server.Replay_min
+regionserver.Server.Replay_num_ops
+regionserver.Server.blockCacheCount
+regionserver.Server.blockCacheEvictionCount
+regionserver.Server.blockCacheExpressHitPercent
+regionserver.Server.blockCacheFreeSize
+regionserver.Server.blockCacheHitCount
+regionserver.Server.blockCacheMissCount
+regionserver.Server.blockCacheSize
+regionserver.Server.blockCountHitPercent
+regionserver.Server.checkMutateFailedCount
+regionserver.Server.checkMutatePassedCount
+regionserver.Server.compactionQueueLength
+regionserver.Server.flushQueueLength
+jvm.JvmMetrics.GcCountConcurrentMarkSweep
+regionserver.Server.hlogFileCount
+regionserver.Server.hlogFileSize
+regionserver.Server.memStoreSize
+regionserver.Server.mutationsWithoutWALCount
+regionserver.Server.mutationsWithoutWALSize
+regionserver.Server.percentFilesLocal
+regionserver.Server.readRequestCount
+regionserver.Server.regionCount
+regionserver.Server.regionServerStartTime
+regionserver.Server.slowAppendCount
+regionserver.Server.slowDeleteCount
+regionserver.Server.slowGetCount
+regionserver.Server.slowIncrementCount
+regionserver.Server.slowPutCount
+regionserver.Server.staticBloomSize
+regionserver.Server.staticIndexSize
+regionserver.Server.storeCount
+regionserver.Server.storeFileCount
+regionserver.Server.storeFileIndexSize
+regionserver.Server.storeFileSize
+regionserver.Server.totalRequestCount
+regionserver.Server.updatesBlockedTime
+regionserver.Server.writeRequestCount
+regionserver.WAL.AppendSize_75th_percentile
+regionserver.WAL.AppendSize_95th_percentile
+regionserver.WAL.AppendSize_99th_percentile
+regionserver.WAL.AppendSize_max
+regionserver.WAL.AppendSize_mean
+regionserver.WAL.AppendSize_median
+regionserver.WAL.SyncTime_median
+jvm.JvmMetrics.GcCountParNew
+regionserver.WAL.AppendSize_min
+regionserver.WAL.AppendSize_num_ops
+regionserver.WAL.SyncTime_max
+regionserver.WAL.AppendTime_75th_percentile
+regionserver.WAL.AppendTime_95th_percentile
+regionserver.WAL.AppendTime_99th_percentile
+regionserver.WAL.AppendTime_max
+regionserver.WAL.SyncTime_95th_percentile
+regionserver.WAL.AppendTime_mean
+regionserver.WAL.AppendTime_median
+regionserver.WAL.AppendTime_min
+regionserver.WAL.AppendTime_num_ops
+regionserver.WAL.SyncTime_75th_percentile
+regionserver.WAL.SyncTime_99th_percentile
+regionserver.WAL.SyncTime_mean
+regionserver.WAL.SyncTime_median
+regionserver.WAL.SyncTime_min
+regionserver.WAL.SyncTime_num_ops
+regionserver.WAL.appendCount
+regionserver.Server.majorCompactedCellsSize
+regionserver.WAL.rollRequest
+regionserver.WAL.AppendTime_99th_percentile
+regionserver.WAL.slowAppendCount
+regionserver.WAL.AppendTime_num_ops
+regionserver.WAL.SyncTime_95th_percentile
+regionserver.Server.Mutate_median
+regionserver.WAL.AppendTime_75th_percentile
+regionserver.WAL.AppendSize_num_ops
+regionserver.Server.Mutate_max
+regionserver.WAL.AppendSize_min
+regionserver.WAL.AppendTime_min
+regionserver.WAL.SyncTime_99th_percentile
+regionserver.Server.Mutate_95th_percentile
+regionserver.WAL.AppendSize_mean
+regionserver.WAL.SyncTime_mean
+regionserver.WAL.AppendSize_99th_percentile
+jvm.JvmMetrics.GcTimeMillis
+regionserver.WAL.AppendSize_75th_percentile
+jvm.JvmMetrics.GcTimeMillisConcurrentMarkSweep
+regionserver.WAL.SyncTime_max
+regionserver.Server.Increment_median
+regionserver.Server.updatesBlockedTime
+regionserver.Server.Increment_max
+ugi.UgiMetrics.GetGroupsAvgTime
+regionserver.WAL.lowReplicaRollRequest
+ugi.UgiMetrics.GetGroupsNumOps
+regionserver.Server.storeFileSize
+regionserver.Server.Increment_95th_percentile
+jvm.JvmMetrics.GcTimeMillisParNew
+ugi.UgiMetrics.LoginFailureAvgTime
+ugi.UgiMetrics.LoginFailureNumOps
+regionserver.Server.storeFileCount
+ugi.UgiMetrics.LoginSuccessNumOps
+regionserver.Server.staticIndexSize
+jvm.JvmMetrics.LogError
+regionserver.Server.splitQueueLength
+regionserver.Server.Get_median
+regionserver.Server.slowPutCount
+regionserver.Server.Get_max
+jvm.JvmMetrics.LogFatal
+regionserver.Server.slowGetCount
+jvm.JvmMetrics.LogInfo
+regionserver.Server.slowAppendCount
+regionserver.Server.Get_95th_percentile
+jvm.JvmMetrics.LogWarn
+regionserver.Server.regionCount
+regionserver.Server.FlushTime_num_ops
+regionserver.Server.FlushTime_min
+regionserver.Server.readRequestCount
+jvm.JvmMetrics.MemHeapCommittedM
+regionserver.Server.percentFilesLocalSecondaryRegions
+regionserver.Server.percentFilesLocal
+regionserver.Server.FlushTime_max
+regionserver.Server.FlushTime_99th_percentile
+regionserver.Server.FlushTime_95th_percentile
+regionserver.Server.Delete_num_ops
+jvm.JvmMetrics.MemHeapMaxM
+regionserver.Server.mutationsWithoutWALCount
+jvm.JvmMetrics.MemHeapUsedM
+regionserver.Server.Delete_median
+regionserver.Server.ScanNext_max
+regionserver.Server.ScanNext_99th_percentile
+regionserver.Server.majorCompactedCellsCount
+regionserver.Server.hlogFileSize
+regionserver.Server.flushedCellsCount
+jvm.JvmMetrics.MemMaxM
+regionserver.Server.hlogFileCount
+regionserver.Server.Delete_95th_percentile
+jvm.JvmMetrics.MemNonHeapCommittedM
+jvm.JvmMetrics.MemNonHeapMaxM
+jvm.JvmMetrics.MemNonHeapUsedM
+regionserver.Server.Append_num_ops
+regionserver.Server.flushQueueLength
+jvm.JvmMetrics.ThreadsBlocked
+regionserver.Server.Append_median
+jvm.JvmMetrics.ThreadsNew
+regionserver.Server.checkMutatePassedCount
+regionserver.Server.compactedCellsSize
+jvm.JvmMetrics.ThreadsRunnable
+jvm.JvmMetrics.ThreadsTerminated
+jvm.JvmMetrics.ThreadsTimedWaiting
+master.AssignmentManger.Assign_75th_percentile
+master.AssignmentManger.Assign_95th_percentile
+master.AssignmentManger.Assign_99th_percentile
+master.AssignmentManger.Assign_max
+regionserver.Server.Append_95th_percentile
+master.AssignmentManger.Assign_mean
+master.AssignmentManger.Assign_median
+regionserver.Replication.sink.appliedOps
+regionserver.Replication.sink.appliedBatches
+regionserver.Replication.sink.ageOfLastAppliedOp
+regionserver.WAL.SyncTime_75th_percentile
+regionserver.RegionServer.receivedBytes
+regionserver.RegionServer.queueSize
+regionserver.RegionServer.numOpenConnections
+regionserver.RegionServer.numCallsInPriorityQueue
+regionserver.Server.Replay_num_ops
+master.AssignmentManger.Assign_min
+master.AssignmentManger.Assign_num_ops
+regionserver.Server.checkMutateFailedCount
+regionserver.RegionServer.exceptions.RegionTooBusyException
+regionserver.RegionServer.exceptions.RegionMovedException
+regionserver.RegionServer.exceptions.OutOfOrderScannerNextException
+master.AssignmentManger.BulkAssign_75th_percentile
+master.AssignmentManger.BulkAssign_95th_percentile
+regionserver.RegionServer.exceptions.FailedSanityCheckException
+regionserver.RegionServer.exceptions
+regionserver.RegionServer.authorizationSuccesses
+regionserver.RegionServer.authenticationSuccesses
+regionserver.RegionServer.authenticationFailures
+regionserver.RegionServer.TotalCallTime_num_ops
+master.AssignmentManger.BulkAssign_99th_percentile
+jvm.JvmMetrics.ThreadsWaiting
+regionserver.RegionServer.TotalCallTime_median
+regionserver.RegionServer.TotalCallTime_mean
+master.AssignmentManger.BulkAssign_max
+regionserver.RegionServer.TotalCallTime_95th_percentile
+regionserver.RegionServer.TotalCallTime_75th_percentile
+regionserver.RegionServer.QueueCallTime_num_ops
+master.AssignmentManger.BulkAssign_mean
+master.AssignmentManger.BulkAssign_median
+regionserver.RegionServer.QueueCallTime_median
+regionserver.RegionServer.QueueCallTime_mean
+regionserver.RegionServer.QueueCallTime_max
+regionserver.RegionServer.QueueCallTime_95th_percentile
+regionserver.RegionServer.QueueCallTime_75th_percentile
+regionserver.RegionServer.ProcessCallTime_num_ops
+regionserver.RegionServer.ProcessCallTime_median
+regionserver.RegionServer.ProcessCallTime_mean
+regionserver.Server.ScanNext_num_ops
+master.AssignmentManger.BulkAssign_num_ops
+master.AssignmentManger.BulkAssign_min
+regionserver.RegionServer.ProcessCallTime_95th_percentile
+master.AssignmentManger.ritCount
+master.AssignmentManger.ritCountOverThreshold
+master.AssignmentManger.ritOldestAge
+master.Balancer.BalancerCluster_75th_percentile
+master.Balancer.BalancerCluster_95th_percentile
+master.Balancer.BalancerCluster_99th_percentile
+ugi.UgiMetrics.LoginSuccessAvgTime
+master.Balancer.BalancerCluster_max
+master.Balancer.BalancerCluster_mean
+master.Balancer.BalancerCluster_median
+master.Balancer.BalancerCluster_min
+regionserver.Server.ScanNext_median
+master.Balancer.BalancerCluster_num_ops
+master.Balancer.miscInvocationCount
+master.FileSystem.HlogSplitSize_75th_percentile
+master.FileSystem.HlogSplitSize_95th_percentile
+master.FileSystem.HlogSplitSize_max
+master.FileSystem.HlogSplitSize_99th_percentile
+master.FileSystem.HlogSplitSize_mean
+master.FileSystem.HlogSplitSize_median
+master.FileSystem.HlogSplitSize_min
+master.FileSystem.HlogSplitSize_num_ops
+master.FileSystem.HlogSplitTime_75th_percentile
+master.FileSystem.HlogSplitTime_95th_percentile
+regionserver.Server.SplitTime_median
+master.FileSystem.HlogSplitTime_max
+master.FileSystem.HlogSplitTime_99th_percentile
+master.FileSystem.HlogSplitTime_mean
+master.FileSystem.HlogSplitTime_median
+master.FileSystem.HlogSplitTime_min
+master.FileSystem.HlogSplitTime_num_ops
+master.FileSystem.MetaHlogSplitSize_75th_percentile
+master.FileSystem.MetaHlogSplitSize_95th_percentile
+master.FileSystem.MetaHlogSplitSize_max
+master.FileSystem.MetaHlogSplitSize_99th_percentile
+master.FileSystem.MetaHlogSplitSize_mean
+master.FileSystem.MetaHlogSplitSize_median
+master.FileSystem.MetaHlogSplitSize_min
+master.FileSystem.MetaHlogSplitSize_num_ops
+master.FileSystem.MetaHlogSplitTime_75th_percentile
+master.FileSystem.MetaHlogSplitTime_95th_percentile
+master.FileSystem.MetaHlogSplitTime_max
+master.FileSystem.MetaHlogSplitTime_99th_percentile
+master.FileSystem.MetaHlogSplitTime_mean
+master.FileSystem.MetaHlogSplitTime_median
+master.FileSystem.MetaHlogSplitTime_min
+master.FileSystem.MetaHlogSplitTime_num_ops
+master.Master.ProcessCallTime_75th_percentile
+master.Master.ProcessCallTime_95th_percentile
+master.Master.ProcessCallTime_99th_percentile
+master.Master.ProcessCallTime_max
+master.Master.ProcessCallTime_mean
+master.Master.ProcessCallTime_median
+master.Master.ProcessCallTime_min
+master.Master.ProcessCallTime_num_ops
+master.Master.QueueCallTime_75th_percentile
+master.Master.QueueCallTime_95th_percentile
+master.Master.QueueCallTime_99th_percentile
+master.Master.QueueCallTime_max
+master.Master.QueueCallTime_mean
+regionserver.Server.blockCacheCountHitPercent
+master.Master.QueueCallTime_median
+master.Master.QueueCallTime_min
+master.Master.QueueCallTime_num_ops
+master.Master.TotalCallTime_75th_percentile
+master.Master.TotalCallTime_95th_percentile
+master.Master.TotalCallTime_99th_percentile
+master.Master.TotalCallTime_max
+master.Master.TotalCallTime_mean
+master.Master.TotalCallTime_median
+master.Master.TotalCallTime_min
+master.Master.TotalCallTime_num_ops
+master.Master.authenticationFailures
+master.Master.authenticationSuccesses
+master.Master.authorizationFailures
+master.Master.authorizationSuccesses
+master.Master.exceptions
+master.Master.exceptions.FailedSanityCheckException
+master.Master.exceptions.NotServingRegionException
+master.Master.exceptions.OutOfOrderScannerNextException
+master.Master.exceptions.RegionMovedException
+master.Master.exceptions.RegionTooBusyException
+master.Master.exceptions.UnknownScannerException
+master.Master.numActiveHandler
+master.Master.numCallsInGeneralQueue
+master.Master.numCallsInPriorityQueue
+master.Master.numCallsInReplicationQueue
+regionserver.Server.blockCacheSize
+master.Master.numOpenConnections
+master.Master.queueSize
+master.Master.receivedBytes
+master.Master.sentBytes
+master.Server.averageLoad
+master.Server.clusterRequests
+master.Server.masterActiveTime
+master.Server.numDeadRegionServers
+master.Server.masterStartTime
+master.Server.numRegionServers
+metricssystem.MetricsSystem.DroppedPubAll
+regionserver.Server.SplitTime_min
+regionserver.Server.blockCacheHitCount
+metricssystem.MetricsSystem.NumActiveSinks
+metricssystem.MetricsSystem.NumActiveSources
+metricssystem.MetricsSystem.NumAllSinks
+metricssystem.MetricsSystem.NumAllSources
+regionserver.Server.blockCacheExpressHitPercent
+metricssystem.MetricsSystem.PublishAvgTime
+metricssystem.MetricsSystem.PublishNumOps
+metricssystem.MetricsSystem.Sink_timelineAvgTime
+regionserver.Server.SplitTime_num_ops
+metricssystem.MetricsSystem.Sink_timelineDropped
+metricssystem.MetricsSystem.Sink_timelineNumOps
+regionserver.Server.SplitTime_max
+regionserver.Server.ScanNext_min
+metricssystem.MetricsSystem.Sink_timelineQsize
+metricssystem.MetricsSystem.SnapshotAvgTime
+metricssystem.MetricsSystem.SnapshotNumOps
+regionserver.Server.SplitTime_95th_percentile
+regionserver.Server.SplitTime_99th_percentile
+regionserver.RegionServer.ProcessCallTime_75th_percentile
+regionserver.RegionServer.ProcessCallTime_99th_percentile
+regionserver.RegionServer.ProcessCallTime_max
+regionserver.RegionServer.ProcessCallTime_min
+regionserver.RegionServer.QueueCallTime_99th_percentile
+regionserver.RegionServer.QueueCallTime_min
+regionserver.RegionServer.TotalCallTime_99th_percentile
+regionserver.RegionServer.TotalCallTime_max
+regionserver.RegionServer.TotalCallTime_min
+regionserver.RegionServer.authorizationFailures
+regionserver.RegionServer.exceptions.NotServingRegionException
+regionserver.RegionServer.exceptions.UnknownScannerException
+regionserver.RegionServer.numActiveHandler
+regionserver.RegionServer.numCallsInGeneralQueue
+regionserver.Server.ScanNext_95th_percentile
+regionserver.RegionServer.numCallsInReplicationQueue
+regionserver.RegionServer.sentBytes
+regionserver.Server.Append_75th_percentile
+regionserver.Server.Append_99th_percentile
+regionserver.Server.Append_max
+regionserver.Server.Append_mean
+regionserver.Server.Append_min
+regionserver.Server.Delete_75th_percentile
+regionserver.Server.Delete_99th_percentile
+regionserver.Server.Delete_max
+regionserver.Server.Delete_mean
+regionserver.Server.Delete_min
+regionserver.Server.FlushTime_75th_percentile
+regionserver.Server.FlushTime_mean
+regionserver.Server.FlushTime_median
+regionserver.Server.Get_75th_percentile
+regionserver.Server.Get_99th_percentile
+regionserver.Server.Get_mean
+regionserver.Server.Get_min
+regionserver.Server.Get_num_ops
+regionserver.Server.Increment_75th_percentile
+regionserver.Server.Increment_99th_percentile
+regionserver.Server.Increment_mean
+regionserver.Server.Increment_min
+regionserver.Server.Increment_num_ops
+regionserver.Server.Mutate_75th_percentile
+regionserver.Server.Mutate_99th_percentile
+regionserver.Server.Mutate_mean
+regionserver.Server.Mutate_min
+regionserver.Server.Mutate_num_ops
+regionserver.Server.Replay_75th_percentile
+regionserver.Server.Replay_99th_percentile
+regionserver.Server.Replay_mean
+regionserver.Server.Replay_min
+regionserver.Server.ScanNext_75th_percentile
+regionserver.Server.ScanNext_mean
+regionserver.Server.SplitTime_75th_percentile
+jvm.JvmMetrics.GcCount
+regionserver.Server.SplitTime_mean
+regionserver.Server.Replay_max
+regionserver.Server.blockCacheCount
+regionserver.Server.blockCacheEvictionCount
+regionserver.Server.blockCacheFreeSize
+regionserver.Server.blockCacheMissCount
+regionserver.Server.Replay_median
+regionserver.Server.blockedRequestCount
+regionserver.Server.compactedCellsCount
+regionserver.Server.compactionQueueLength
+regionserver.Server.flushedCellsSize
+regionserver.Server.memStoreSize
+regionserver.Server.mutationsWithoutWALSize
+jvm.JvmMetrics.GcCountConcurrentMarkSweep
+regionserver.Server.regionServerStartTime
+regionserver.Server.slowDeleteCount
+regionserver.Server.slowIncrementCount
+regionserver.Server.splitRequestCount
+regionserver.Server.splitSuccessCount
+regionserver.Server.staticBloomSize
+regionserver.Server.storeCount
+regionserver.Server.storeFileIndexSize
+regionserver.Server.totalRequestCount
+regionserver.Server.writeRequestCount
+regionserver.WAL.AppendSize_95th_percentile
+regionserver.WAL.AppendSize_max
+regionserver.WAL.AppendSize_median
+regionserver.Server.Replay_95th_percentile
+regionserver.WAL.AppendTime_95th_percentile
+regionserver.WAL.AppendTime_median
+regionserver.WAL.AppendTime_max
+jvm.JvmMetrics.GcCountParNew
+regionserver.WAL.AppendTime_mean
+FSDatasetState.org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.CacheCapacity
+FSDatasetState.org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.CacheUsed
+FSDatasetState.org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.Capacity
+FSDatasetState.org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.DfsUsed
+FSDatasetState.org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.EstimatedCapacityLostTotal
+FSDatasetState.org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.LastVolumeFailureDate
+FSDatasetState.org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.NumBlocksCached
+FSDatasetState.org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.NumBlocksFailedToCache
+FSDatasetState.org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.NumBlocksFailedToUnCache
+FSDatasetState.org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.NumFailedVolumes
+FSDatasetState.org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.Remaining
+default.StartupProgress.ElapsedTime
+default.StartupProgress.LoadingEditsCount
+default.StartupProgress.LoadingEditsElapsedTime
+default.StartupProgress.LoadingEditsPercentComplete
+default.StartupProgress.LoadingEditsTotal
+default.StartupProgress.LoadingFsImageCount
+default.StartupProgress.LoadingFsImageElapsedTime
+default.StartupProgress.LoadingFsImagePercentComplete
+default.StartupProgress.LoadingFsImageTotal
+default.StartupProgress.PercentComplete
+default.StartupProgress.SafeModeCount
+default.StartupProgress.SafeModeElapsedTime
+default.StartupProgress.SafeModePercentComplete
+default.StartupProgress.SafeModeTotal
+default.StartupProgress.SavingCheckpointCount
+default.StartupProgress.SavingCheckpointElapsedTime
+default.StartupProgress.SavingCheckpointPercentComplete
+default.StartupProgress.SavingCheckpointTotal
+dfs.FSNamesystem.BlockCapacity
+dfs.FSNamesystem.BlocksTotal
+dfs.FSNamesystem.CapacityRemaining
+dfs.FSNamesystem.CapacityRemainingGB
+dfs.FSNamesystem.CapacityTotal
+dfs.FSNamesystem.CapacityTotalGB
+dfs.FSNamesystem.CapacityUsed
+dfs.FSNamesystem.CapacityUsedGB
+dfs.FSNamesystem.CapacityUsedNonDFS
+dfs.FSNamesystem.CorruptBlocks
+dfs.FSNamesystem.ExcessBlocks
+dfs.FSNamesystem.ExpiredHeartbeats
+dfs.FSNamesystem.FilesTotal
+dfs.FSNamesystem.LastCheckpointTime
+dfs.FSNamesystem.LastWrittenTransactionId
+dfs.FSNamesystem.LockQueueLength
+dfs.FSNamesystem.MillisSinceLastLoadedEdits
+dfs.FSNamesystem.MissingBlocks
+dfs.FSNamesystem.MissingReplOneBlocks
+dfs.FSNamesystem.NumActiveClients
+dfs.FSNamesystem.NumFilesUnderConstruction
+dfs.FSNamesystem.NumTimedOutPendingReplications
+dfs.FSNamesystem.PendingDataNodeMessageCount
+dfs.FSNamesystem.PendingDeletionBlocks
+dfs.FSNamesystem.PendingReplicationBlocks
+dfs.FSNamesystem.PostponedMisreplicatedBlocks
+dfs.FSNamesystem.ScheduledReplicationBlocks
+dfs.FSNamesystem.Snapshots
+dfs.FSNamesystem.SnapshottableDirectories
+dfs.FSNamesystem.StaleDataNodes
+dfs.FSNamesystem.TotalFiles
+dfs.FSNamesystem.TotalLoad
+dfs.FSNamesystem.TotalSyncCount
+dfs.FSNamesystem.TransactionsSinceLastCheckpoint
+dfs.FSNamesystem.TransactionsSinceLastLogRoll
+dfs.FSNamesystem.UnderReplicatedBlocks
+dfs.FsVolume.DataFileIoRateAvgTime
+dfs.FsVolume.DataFileIoRateNumOps
+dfs.FsVolume.FileIoErrorRateAvgTime
+dfs.FsVolume.FileIoErrorRateNumOps
+dfs.FsVolume.FlushIoRateAvgTime
+dfs.FsVolume.FlushIoRateNumOps
+dfs.FsVolume.MetadataOperationRateAvgTime
+dfs.FsVolume.MetadataOperationRateNumOps
+dfs.FsVolume.ReadIoRateAvgTime
+dfs.FsVolume.ReadIoRateNumOps
+dfs.FsVolume.SyncIoRateAvgTime
+dfs.FsVolume.SyncIoRateNumOps
+dfs.FsVolume.TotalDataFileIos
+dfs.FsVolume.TotalFileIoErrors
+dfs.FsVolume.TotalMetadataOperations
+dfs.FsVolume.WriteIoRateAvgTime
+dfs.FsVolume.WriteIoRateNumOps
+dfs.datanode.BlockChecksumOpAvgTime
+dfs.datanode.BlockChecksumOpNumOps
+dfs.datanode.BlockReportsAvgTime
+dfs.datanode.BlockReportsNumOps
+dfs.datanode.BlockVerificationFailures
+dfs.datanode.BlocksCached
+dfs.datanode.BlocksGetLocalPathInfo
+dfs.datanode.BlocksRead
+dfs.datanode.BlocksRemoved
+dfs.datanode.BlocksReplicated
+dfs.datanode.BlocksUncached
+dfs.datanode.BlocksVerified
+dfs.datanode.BlocksWritten
+dfs.datanode.BytesRead
+dfs.datanode.BytesWritten
+dfs.datanode.CacheReportsAvgTime
+dfs.datanode.CacheReportsNumOps
+dfs.datanode.CopyBlockOpAvgTime
+dfs.datanode.CopyBlockOpNumOps
+dfs.datanode.DataNodeActiveXceiversCount
+dfs.datanode.DatanodeNetworkErrors
+dfs.datanode.FlushNanosAvgTime
+dfs.datanode.FlushNanosNumOps
+dfs.datanode.FsyncCount
+dfs.datanode.FsyncNanosAvgTime
+dfs.datanode.FsyncNanosNumOps
+dfs.datanode.HeartbeatsAvgTime
+dfs.datanode.HeartbeatsNumOps
+dfs.datanode.HeartbeatsTotalAvgTime
+dfs.datanode.HeartbeatsTotalNumOps
+dfs.datanode.IncrementalBlockReportsAvgTime
+dfs.datanode.IncrementalBlockReportsNumOps
+dfs.datanode.LifelinesAvgTime
+dfs.datanode.LifelinesNumOps
+dfs.datanode.PacketAckRoundTripTimeNanosAvgTime
+dfs.datanode.PacketAckRoundTripTimeNanosNumOps
+dfs.datanode.RamDiskBlocksDeletedBeforeLazyPersisted
+dfs.datanode.RamDiskBlocksEvicted
+dfs.datanode.RamDiskBlocksEvictedWithoutRead
+dfs.datanode.RamDiskBlocksEvictionWindowMsAvgTime
+dfs.datanode.RamDiskBlocksEvictionWindowMsNumOps
+dfs.datanode.RamDiskBlocksLazyPersistWindowMsAvgTime
+dfs.datanode.RamDiskBlocksLazyPersistWindowMsNumOps
+dfs.datanode.RamDiskBlocksLazyPersisted
+dfs.datanode.RamDiskBlocksReadHits
+dfs.datanode.RamDiskBlocksWrite
+dfs.datanode.RamDiskBlocksWriteFallback
+dfs.datanode.RamDiskBytesLazyPersisted
+dfs.datanode.RamDiskBytesWrite
+dfs.datanode.ReadBlockOpAvgTime
+dfs.datanode.ReadBlockOpNumOps
+dfs.datanode.ReadsFromLocalClient
+dfs.datanode.ReadsFromRemoteClient
+dfs.datanode.RemoteBytesRead
+dfs.datanode.RemoteBytesWritten
+dfs.datanode.ReplaceBlockOpAvgTime
+dfs.datanode.ReplaceBlockOpNumOps
+dfs.datanode.SendDataPacketBlockedOnNetworkNanosAvgTime
+dfs.datanode.SendDataPacketBlockedOnNetworkNanosNumOps
+dfs.datanode.SendDataPacketTransferNanosAvgTime
+dfs.datanode.SendDataPacketTransferNanosNumOps
+dfs.datanode.TotalReadTime
+dfs.datanode.TotalWriteTime
+dfs.datanode.VolumeFailures
+dfs.datanode.WriteBlockOpAvgTime
+dfs.datanode.WriteBlockOpNumOps
+dfs.datanode.WritesFromLocalClient
+dfs.datanode.WritesFromRemoteClient
+dfs.namenode.AddBlockOps
+dfs.namenode.AllowSnapshotOps
+dfs.namenode.BlockOpsBatched
+dfs.namenode.BlockOpsQueued
+dfs.namenode.BlockReceivedAndDeletedOps
+dfs.namenode.BlockReportAvgTime
+dfs.namenode.BlockReportNumOps
+dfs.namenode.CacheReportAvgTime
+dfs.namenode.CacheReportNumOps
+dfs.namenode.CreateFileOps
+dfs.namenode.CreateSnapshotOps
+dfs.namenode.CreateSymlinkOps
+dfs.namenode.DeleteFileOps
+dfs.namenode.DeleteSnapshotOps
+dfs.namenode.DisallowSnapshotOps
+dfs.namenode.FileInfoOps
+dfs.namenode.FilesAppended
+dfs.namenode.FilesCreated
+dfs.namenode.FilesDeleted
+dfs.namenode.FilesInGetListingOps
+dfs.namenode.FilesRenamed
+dfs.namenode.FilesTruncated
+dfs.namenode.FsImageLoadTime
+dfs.namenode.GetAdditionalDatanodeOps
+dfs.namenode.GetBlockLocations
+dfs.namenode.GetEditAvgTime
+dfs.namenode.GetEditNumOps
+dfs.namenode.GetImageAvgTime
+dfs.namenode.GetImageNumOps
+dfs.namenode.GetLinkTargetOps
+dfs.namenode.GetListingOps
+dfs.namenode.ListSnapshottableDirOps
+dfs.namenode.PutImageAvgTime
+dfs.namenode.PutImageNumOps
+dfs.namenode.RenameSnapshotOps
+dfs.namenode.SafeModeTime
+dfs.namenode.SnapshotDiffReportOps
+dfs.namenode.StorageBlockReportOps
+dfs.namenode.SyncsAvgTime
+dfs.namenode.SyncsNumOps
+dfs.namenode.TotalFileOps
+dfs.namenode.TransactionsAvgTime
+dfs.namenode.TransactionsBatchedInSync
+dfs.namenode.TransactionsNumOps
+jvm.JvmMetrics.GcCount
+jvm.JvmMetrics.GcCountConcurrentMarkSweep
+jvm.JvmMetrics.GcCountParNew
+jvm.JvmMetrics.GcNumInfoThresholdExceeded
+jvm.JvmMetrics.GcNumWarnThresholdExceeded
+jvm.JvmMetrics.GcTimeMillis
+jvm.JvmMetrics.GcTimeMillisConcurrentMarkSweep
+jvm.JvmMetrics.GcTimeMillisParNew
+jvm.JvmMetrics.GcTotalExtraSleepTime
+jvm.JvmMetrics.LogError
+jvm.JvmMetrics.LogFatal
+jvm.JvmMetrics.LogInfo
+jvm.JvmMetrics.LogWarn
+jvm.JvmMetrics.MemHeapCommittedM
+jvm.JvmMetrics.MemHeapMaxM
+jvm.JvmMetrics.MemHeapUsedM
+jvm.JvmMetrics.MemMaxM
+jvm.JvmMetrics.MemNonHeapCommittedM
+jvm.JvmMetrics.MemNonHeapMaxM
+jvm.JvmMetrics.MemNonHeapUsedM
+jvm.JvmMetrics.ThreadsBlocked
+jvm.JvmMetrics.ThreadsNew
+jvm.JvmMetrics.ThreadsRunnable
+jvm.JvmMetrics.ThreadsTerminated
+jvm.JvmMetrics.ThreadsTimedWaiting
+jvm.JvmMetrics.ThreadsWaiting
+metricssystem.MetricsSystem.DroppedPubAll
+metricssystem.MetricsSystem.NumActiveSinks
+metricssystem.MetricsSystem.NumActiveSources
+metricssystem.MetricsSystem.NumAllSinks
+metricssystem.MetricsSystem.NumAllSources
+metricssystem.MetricsSystem.PublishAvgTime
+metricssystem.MetricsSystem.PublishNumOps
+metricssystem.MetricsSystem.Sink_timelineAvgTime
+metricssystem.MetricsSystem.Sink_timelineDropped
+metricssystem.MetricsSystem.Sink_timelineNumOps
+metricssystem.MetricsSystem.Sink_timelineQsize
+metricssystem.MetricsSystem.SnapshotAvgTime
+metricssystem.MetricsSystem.SnapshotNumOps
+rpc.RetryCache.NameNodeRetryCache.CacheCleared
+rpc.RetryCache.NameNodeRetryCache.CacheHit
+rpc.RetryCache.NameNodeRetryCache.CacheUpdated
+rpc.rpc.CallQueueLength
+rpc.rpc.NumOpenConnections
+rpc.rpc.ReceivedBytes
+rpc.rpc.RpcAuthenticationFailures
+rpc.rpc.RpcAuthenticationSuccesses
+rpc.rpc.RpcAuthorizationFailures
+rpc.rpc.RpcAuthorizationSuccesses
+rpc.rpc.RpcClientBackoff
+rpc.rpc.RpcProcessingTimeAvgTime
+rpc.rpc.RpcProcessingTimeNumOps
+rpc.rpc.RpcQueueTimeAvgTime
+rpc.rpc.RpcQueueTimeNumOps
+rpc.rpc.RpcSlowCalls
+rpc.rpc.SentBytes
+rpc.rpc.client.CallQueueLength
+rpc.rpc.client.NumOpenConnections
+rpc.rpc.client.ReceivedBytes
+rpc.rpc.client.RpcAuthenticationFailures
+rpc.rpc.client.RpcAuthenticationSuccesses
+rpc.rpc.client.RpcAuthorizationFailures
+rpc.rpc.client.RpcAuthorizationSuccesses
+rpc.rpc.client.RpcClientBackoff
+rpc.rpc.client.RpcProcessingTimeAvgTime
+rpc.rpc.client.RpcProcessingTimeNumOps
+rpc.rpc.client.RpcQueueTimeAvgTime
+rpc.rpc.client.RpcQueueTimeNumOps
+rpc.rpc.client.RpcSlowCalls
+rpc.rpc.client.SentBytes
+rpcdetailed.rpcdetailed.InitReplicaRecoveryAvgTime
+rpcdetailed.rpcdetailed.InitReplicaRecoveryNumOps
+rpcdetailed.rpcdetailed.UpdateReplicaUnderRecoveryAvgTime
+rpcdetailed.rpcdetailed.UpdateReplicaUnderRecoveryNumOps
+rpcdetailed.rpcdetailed.client.AddBlockAvgTime
+rpcdetailed.rpcdetailed.client.AddBlockNumOps
+rpcdetailed.rpcdetailed.client.BlockReceivedAndDeletedAvgTime
+rpcdetailed.rpcdetailed.client.BlockReceivedAndDeletedNumOps
+rpcdetailed.rpcdetailed.client.BlockReportAvgTime
+rpcdetailed.rpcdetailed.client.BlockReportNumOps
+rpcdetailed.rpcdetailed.client.CheckAccessAvgTime
+rpcdetailed.rpcdetailed.client.CheckAccessNumOps
+rpcdetailed.rpcdetailed.client.CommitBlockSynchronizationAvgTime
+rpcdetailed.rpcdetailed.client.CommitBlockSynchronizationNumOps
+rpcdetailed.rpcdetailed.client.CompleteAvgTime
+rpcdetailed.rpcdetailed.client.CompleteNumOps
+rpcdetailed.rpcdetailed.client.CreateAvgTime
+rpcdetailed.rpcdetailed.client.CreateNumOps
+rpcdetailed.rpcdetailed.client.DeleteAvgTime
+rpcdetailed.rpcdetailed.client.DeleteNumOps
+rpcdetailed.rpcdetailed.client.FsyncAvgTime
+rpcdetailed.rpcdetailed.client.FsyncNumOps
+rpcdetailed.rpcdetailed.client.GetBlockLocationsAvgTime
+rpcdetailed.rpcdetailed.client.GetBlockLocationsNumOps
+rpcdetailed.rpcdetailed.client.GetEditLogManifestAvgTime
+rpcdetailed.rpcdetailed.client.GetEditLogManifestNumOps
+rpcdetailed.rpcdetailed.client.GetFileInfoAvgTime
+rpcdetailed.rpcdetailed.client.GetFileInfoNumOps
+rpcdetailed.rpcdetailed.client.GetListingAvgTime
+rpcdetailed.rpcdetailed.client.GetListingNumOps
+rpcdetailed.rpcdetailed.client.GetServerDefaultsAvgTime
+rpcdetailed.rpcdetailed.client.GetServerDefaultsNumOps
+rpcdetailed.rpcdetailed.client.GetTransactionIdAvgTime
+rpcdetailed.rpcdetailed.client.GetTransactionIdNumOps
+rpcdetailed.rpcdetailed.client.IsRollingUpgradeAvgTime
+rpcdetailed.rpcdetailed.client.IsRollingUpgradeNumOps
+rpcdetailed.rpcdetailed.client.ListEncryptionZonesAvgTime
+rpcdetailed.rpcdetailed.client.ListEncryptionZonesNumOps
+rpcdetailed.rpcdetailed.client.MkdirsAvgTime
+rpcdetailed.rpcdetailed.client.MkdirsNumOps
+rpcdetailed.rpcdetailed.client.PathIsNotEmptyDirectoryExceptionAvgTime
+rpcdetailed.rpcdetailed.client.PathIsNotEmptyDirectoryExceptionNumOps
+rpcdetailed.rpcdetailed.client.RecoverLeaseAvgTime
+rpcdetailed.rpcdetailed.client.RecoverLeaseNumOps
+rpcdetailed.rpcdetailed.client.RegisterDatanodeAvgTime
+rpcdetailed.rpcdetailed.client.RegisterDatanodeNumOps
+rpcdetailed.rpcdetailed.client.Rename2AvgTime
+rpcdetailed.rpcdetailed.client.Rename2NumOps
+rpcdetailed.rpcdetailed.client.RenameAvgTime
+rpcdetailed.rpcdetailed.client.RenameNumOps
+rpcdetailed.rpcdetailed.client.RenewLeaseAvgTime
+rpcdetailed.rpcdetailed.client.RenewLeaseNumOps
+rpcdetailed.rpcdetailed.client.RetriableExceptionAvgTime
+rpcdetailed.rpcdetailed.client.RetriableExceptionNumOps
+rpcdetailed.rpcdetailed.client.RollEditLogAvgTime
+rpcdetailed.rpcdetailed.client.RollEditLogNumOps
+rpcdetailed.rpcdetailed.client.SafeModeExceptionAvgTime
+rpcdetailed.rpcdetailed.client.SafeModeExceptionNumOps
+rpcdetailed.rpcdetailed.client.SendHeartbeatAvgTime
+rpcdetailed.rpcdetailed.client.SendHeartbeatNumOps
+rpcdetailed.rpcdetailed.client.SetPermissionAvgTime
+rpcdetailed.rpcdetailed.client.SetPermissionNumOps
+rpcdetailed.rpcdetailed.client.SetReplicationAvgTime
+rpcdetailed.rpcdetailed.client.SetReplicationNumOps
+rpcdetailed.rpcdetailed.client.SetSafeModeAvgTime
+rpcdetailed.rpcdetailed.client.SetSafeModeNumOps
+rpcdetailed.rpcdetailed.client.SetTimesAvgTime
+rpcdetailed.rpcdetailed.client.SetTimesNumOps
+rpcdetailed.rpcdetailed.client.VersionRequestAvgTime
+rpcdetailed.rpcdetailed.client.VersionRequestNumOps
+ugi.UgiMetrics.GetGroupsAvgTime
+ugi.UgiMetrics.GetGroupsNumOps
+ugi.UgiMetrics.LoginFailureAvgTime
+ugi.UgiMetrics.LoginFailureNumOps
+ugi.UgiMetrics.LoginSuccessAvgTime
+ugi.UgiMetrics.LoginSuccessNumOps
+ugi.UgiMetrics.RenewalFailures
+ugi.UgiMetrics.RenewalFailuresTotal
+default.General.active_calls_api_create_table
+default.General.active_calls_api_drop_table
+default.General.active_calls_api_get_all_databases
+default.General.active_calls_api_get_database
+default.General.active_calls_api_get_functions
+default.General.active_calls_api_get_table
+default.General.active_calls_api_get_tables
+default.General.api_create_table_15min_rate
+default.General.api_create_table_1min_rate
+default.General.api_create_table_5min_rate
+default.General.api_create_table_75thpercentile
+default.General.api_create_table_95thpercentile
+default.General.api_create_table_98thpercentile
+default.General.api_create_table_999thpercentile
+default.General.api_create_table_99thpercentile
+default.General.api_create_table_count
+default.General.api_create_table_max
+default.General.api_create_table_mean
+default.General.api_create_table_mean_rate
+default.General.api_create_table_median
+default.General.api_create_table_min
+default.General.api_create_table_stddev
+default.General.api_drop_table_15min_rate
+default.General.api_drop_table_1min_rate
+default.General.api_drop_table_5min_rate
+default.General.api_drop_table_75thpercentile
+default.General.api_drop_table_95thpercentile
+default.General.api_drop_table_98thpercentile
+default.General.api_drop_table_999thpercentile
+default.General.api_drop_table_99thpercentile
+default.General.api_drop_table_count
+default.General.api_drop_table_max
+default.General.api_drop_table_mean
+default.General.api_drop_table_mean_rate
+default.General.api_drop_table_median
+default.General.api_drop_table_min
+default.General.api_drop_table_stddev
+default.General.api_get_all_databases_15min_rate
+default.General.api_get_all_databases_1min_rate
+default.General.api_get_all_databases_5min_rate
+default.General.api_get_all_databases_75thpercentile
+default.General.api_get_all_databases_95thpercentile
+default.General.api_get_all_databases_98thpercentile
+default.General.api_get_all_databases_999thpercentile
+default.General.api_get_all_databases_99thpercentile
+default.General.api_get_all_databases_count
+default.General.api_get_all_databases_max
+default.General.api_get_all_databases_mean
+default.General.api_get_all_databases_mean_rate
+default.General.api_get_all_databases_median
+default.General.api_get_all_databases_min
+default.General.api_get_all_databases_stddev
+default.General.api_get_database_15min_rate
+default.General.api_get_database_1min_rate
+default.General.api_get_database_5min_rate
+default.General.api_get_database_75thpercentile
+default.General.api_get_database_95thpercentile
+default.General.api_get_database_98thpercentile
+default.General.api_get_database_999thpercentile
+default.General.api_get_database_99thpercentile
+default.General.api_get_database_count
+default.General.api_get_database_max
+default.General.api_get_database_mean
+default.General.api_get_database_mean_rate
+default.General.api_get_database_median
+default.General.api_get_database_min
+default.General.api_get_database_stddev
+default.General.api_get_functions_15min_rate
+default.General.api_get_functions_1min_rate
+default.General.api_get_functions_5min_rate
+default.General.api_get_functions_75thpercentile
+default.General.api_get_functions_95thpercentile
+default.General.api_get_functions_98thpercentile
+default.General.api_get_functions_999thpercentile
+default.General.api_get_functions_99thpercentile
+default.General.api_get_functions_count
+default.General.api_get_functions_max
+default.General.api_get_functions_mean
+default.General.api_get_functions_mean_rate
+default.General.api_get_functions_median
+default.General.api_get_functions_min
+default.General.api_get_functions_stddev
+default.General.api_get_table_15min_rate
+default.General.api_get_table_1min_rate
+default.General.api_get_table_5min_rate
+default.General.api_get_table_75thpercentile
+default.General.api_get_table_95thpercentile
+default.General.api_get_table_98thpercentile
+default.General.api_get_table_999thpercentile
+default.General.api_get_table_99thpercentile
+default.General.api_get_table_count
+default.General.api_get_table_max
+default.General.api_get_table_mean
+default.General.api_get_table_mean_rate
+default.General.api_get_table_median
+default.General.api_get_table_min
+default.General.api_get_table_stddev
+default.General.api_get_tables_15min_rate
+default.General.api_get_tables_1min_rate
+default.General.api_get_tables_5min_rate
+default.General.api_get_tables_75thpercentile
+default.General.api_get_tables_95thpercentile
+default.General.api_get_tables_98thpercentile
+default.General.api_get_tables_999thpercentile
+default.General.api_get_tables_99thpercentile
+default.General.api_get_tables_count
+default.General.api_get_tables_max
+default.General.api_get_tables_mean
+default.General.api_get_tables_mean_rate
+default.General.api_get_tables_median
+default.General.api_get_tables_min
+default.General.api_get_tables_stddev
+default.General.buffers.direct.capacity
+default.General.buffers.direct.count
+default.General.buffers.direct.used
+default.General.buffers.mapped.capacity
+default.General.buffers.mapped.count
+default.General.buffers.mapped.used
+default.General.classLoading.loaded
+default.General.classLoading.unloaded
+default.General.create_total_count_tables
+default.General.delete_total_count_tables
+default.General.gc.PS-MarkSweep.count
+default.General.gc.PS-MarkSweep.time
+default.General.gc.PS-Scavenge.count
+default.General.gc.PS-Scavenge.time
+default.General.init_total_count_dbs
+default.General.init_total_count_partitions
+default.General.init_total_count_tables
+default.General.jvm.pause.extraSleepTime
+default.General.memory.heap.committed
+default.General.memory.heap.init
+default.General.memory.heap.max
+default.General.memory.heap.usage
+default.General.memory.heap.used
+default.General.memory.non-heap.committed
+default.General.memory.non-heap.init
+default.General.memory.non-heap.max
+default.General.memory.non-heap.usage
+default.General.memory.non-heap.used
+default.General.memory.pools.Code-Cache.usage
+default.General.memory.pools.Compressed-Class-Space.usage
+default.General.memory.pools.Metaspace.usage
+default.General.memory.pools.PS-Eden-Space.usage
+default.General.memory.pools.PS-Old-Gen.usage
+default.General.memory.pools.PS-Survivor-Space.usage
+default.General.memory.total.committed
+default.General.memory.total.init
+default.General.memory.total.max
+default.General.memory.total.used
+default.General.open_connections
+default.General.threads.blocked.count
+default.General.threads.count
+default.General.threads.daemon.count
+default.General.threads.deadlock.count
+default.General.threads.new.count
+default.General.threads.runnable.count
+default.General.threads.terminated.count
+default.General.threads.timed_waiting.count
+default.General.threads.waiting.count
+metricssystem.MetricsSystem.DroppedPubAll
+metricssystem.MetricsSystem.NumActiveSinks
+metricssystem.MetricsSystem.NumActiveSources
+metricssystem.MetricsSystem.NumAllSinks
+metricssystem.MetricsSystem.NumAllSources
+metricssystem.MetricsSystem.PublishAvgTime
+metricssystem.MetricsSystem.PublishNumOps
+metricssystem.MetricsSystem.Sink_timelineAvgTime
+metricssystem.MetricsSystem.Sink_timelineDropped
+metricssystem.MetricsSystem.Sink_timelineNumOps
+metricssystem.MetricsSystem.Sink_timelineQsize
+metricssystem.MetricsSystem.SnapshotAvgTime
+metricssystem.MetricsSystem.SnapshotNumOps
+ugi.UgiMetrics.GetGroupsAvgTime
+ugi.UgiMetrics.GetGroupsNumOps
+ugi.UgiMetrics.LoginFailureAvgTime
+ugi.UgiMetrics.LoginFailureNumOps
+ugi.UgiMetrics.LoginSuccessAvgTime
+ugi.UgiMetrics.LoginSuccessNumOps
+ugi.UgiMetrics.RenewalFailures
+ugi.UgiMetrics.RenewalFailuresTotal
+Supervisors
+Total Tasks
+Total Slots
+Used Slots
+Topologies
+Total Executors
+Free Slots
+jvm.JvmMetrics.GcCount
+jvm.JvmMetrics.GcCountPS
+jvm.JvmMetrics.GcTimeMillis
+jvm.JvmMetrics.GcTimeMillisPS
+jvm.JvmMetrics.LogError
+jvm.JvmMetrics.LogFatal
+jvm.JvmMetrics.LogInfo
+jvm.JvmMetrics.LogWarn
+jvm.JvmMetrics.MemHeapCommittedM
+jvm.JvmMetrics.MemHeapMaxM
+jvm.JvmMetrics.MemHeapUsedM
+jvm.JvmMetrics.MemMaxM
+jvm.JvmMetrics.MemNonHeapCommittedM
+jvm.JvmMetrics.MemNonHeapMaxM
+jvm.JvmMetrics.MemNonHeapUsedM
+jvm.JvmMetrics.ThreadsBlocked
+jvm.JvmMetrics.ThreadsNew
+jvm.JvmMetrics.ThreadsRunnable
+jvm.JvmMetrics.ThreadsTerminated
+jvm.JvmMetrics.ThreadsTimedWaiting
+jvm.JvmMetrics.ThreadsWaiting
+mapred.ShuffleMetrics.ShuffleConnections
+mapred.ShuffleMetrics.ShuffleOutputBytes
+mapred.ShuffleMetrics.ShuffleOutputsFailed
+mapred.ShuffleMetrics.ShuffleOutputsOK
+metricssystem.MetricsSystem.DroppedPubAll
+metricssystem.MetricsSystem.NumActiveSinks
+metricssystem.MetricsSystem.NumActiveSources
+metricssystem.MetricsSystem.NumAllSinks
+metricssystem.MetricsSystem.NumAllSources
+metricssystem.MetricsSystem.PublishAvgTime
+metricssystem.MetricsSystem.PublishNumOps
+metricssystem.MetricsSystem.Sink_timelineAvgTime
+metricssystem.MetricsSystem.Sink_timelineDropped
+metricssystem.MetricsSystem.Sink_timelineNumOps
+metricssystem.MetricsSystem.Sink_timelineQsize
+metricssystem.MetricsSystem.SnapshotAvgTime
+metricssystem.MetricsSystem.SnapshotNumOps
+rpc.rpc.CallQueueLength
+rpc.rpc.NumOpenConnections
+rpc.rpc.ReceivedBytes
+rpc.rpc.RpcAuthenticationFailures
+rpc.rpc.RpcAuthenticationSuccesses
+rpc.rpc.RpcAuthorizationFailures
+rpc.rpc.RpcAuthorizationSuccesses
+rpc.rpc.RpcClientBackoff
+rpc.rpc.RpcProcessingTimeAvgTime
+rpc.rpc.RpcProcessingTimeNumOps
+rpc.rpc.RpcQueueTimeAvgTime
+rpc.rpc.RpcQueueTimeNumOps
+rpc.rpc.RpcSlowCalls
+rpc.rpc.SentBytes
+rpcdetailed.rpcdetailed.AllocateAvgTime
+rpcdetailed.rpcdetailed.AllocateNumOps
+rpcdetailed.rpcdetailed.FinishApplicationMasterAvgTime
+rpcdetailed.rpcdetailed.FinishApplicationMasterNumOps
+rpcdetailed.rpcdetailed.GetApplicationReportAvgTime
+rpcdetailed.rpcdetailed.GetApplicationReportNumOps
+rpcdetailed.rpcdetailed.GetClusterMetricsAvgTime
+rpcdetailed.rpcdetailed.GetClusterMetricsNumOps
+rpcdetailed.rpcdetailed.GetClusterNodesAvgTime
+rpcdetailed.rpcdetailed.GetClusterNodesNumOps
+rpcdetailed.rpcdetailed.GetContainerStatusesAvgTime
+rpcdetailed.rpcdetailed.GetContainerStatusesNumOps
+rpcdetailed.rpcdetailed.GetNewApplicationAvgTime
+rpcdetailed.rpcdetailed.GetNewApplicationNumOps
+rpcdetailed.rpcdetailed.GetQueueInfoAvgTime
+rpcdetailed.rpcdetailed.GetQueueInfoNumOps
+rpcdetailed.rpcdetailed.GetQueueUserAclsAvgTime
+rpcdetailed.rpcdetailed.GetQueueUserAclsNumOps
+rpcdetailed.rpcdetailed.HeartbeatAvgTime
+rpcdetailed.rpcdetailed.HeartbeatNumOps
+rpcdetailed.rpcdetailed.NodeHeartbeatAvgTime
+rpcdetailed.rpcdetailed.NodeHeartbeatNumOps
+rpcdetailed.rpcdetailed.RegisterApplicationMasterAvgTime
+rpcdetailed.rpcdetailed.RegisterApplicationMasterNumOps
+rpcdetailed.rpcdetailed.RegisterNodeManagerAvgTime
+rpcdetailed.rpcdetailed.RegisterNodeManagerNumOps
+rpcdetailed.rpcdetailed.StartContainersAvgTime
+rpcdetailed.rpcdetailed.StartContainersNumOps
+rpcdetailed.rpcdetailed.StopContainersAvgTime
+rpcdetailed.rpcdetailed.StopContainersNumOps
+rpcdetailed.rpcdetailed.SubmitApplicationAvgTime
+rpcdetailed.rpcdetailed.SubmitApplicationNumOps
+ugi.UgiMetrics.GetGroupsAvgTime
+ugi.UgiMetrics.GetGroupsNumOps
+ugi.UgiMetrics.LoginFailureAvgTime
+ugi.UgiMetrics.LoginFailureNumOps
+ugi.UgiMetrics.LoginSuccessAvgTime
+ugi.UgiMetrics.LoginSuccessNumOps
+yarn.ClusterMetrics.AMLaunchDelayAvgTime
+yarn.ClusterMetrics.AMLaunchDelayNumOps
+yarn.ClusterMetrics.AMRegisterDelayAvgTime
+yarn.ClusterMetrics.AMRegisterDelayNumOps
+yarn.ClusterMetrics.NumActiveNMs
+yarn.ClusterMetrics.NumDecommissionedNMs
+yarn.ClusterMetrics.NumLostNMs
+yarn.ClusterMetrics.NumRebootedNMs
+yarn.ClusterMetrics.NumUnhealthyNMs
+yarn.NodeManagerMetrics.AllocatedContainers
+yarn.NodeManagerMetrics.AllocatedGB
+yarn.NodeManagerMetrics.AllocatedVCores
+yarn.NodeManagerMetrics.AvailableGB
+yarn.NodeManagerMetrics.AvailableVCores
+yarn.NodeManagerMetrics.BadLocalDirs
+yarn.NodeManagerMetrics.BadLogDirs
+yarn.NodeManagerMetrics.ContainerLaunchDurationAvgTime
+yarn.NodeManagerMetrics.ContainerLaunchDurationNumOps
+yarn.NodeManagerMetrics.ContainersCompleted
+yarn.NodeManagerMetrics.ContainersFailed
+yarn.NodeManagerMetrics.ContainersIniting
+yarn.NodeManagerMetrics.ContainersKilled
+yarn.NodeManagerMetrics.ContainersLaunched
+yarn.NodeManagerMetrics.ContainersRunning
+yarn.NodeManagerMetrics.GoodLocalDirsDiskUtilizationPerc
+yarn.NodeManagerMetrics.GoodLogDirsDiskUtilizationPerc
+yarn.QueueMetrics.Queue=root.AMResourceLimitMB
+yarn.QueueMetrics.Queue=root.AMResourceLimitVCores
+yarn.QueueMetrics.Queue=root.ActiveApplications
+yarn.QueueMetrics.Queue=root.ActiveUsers
+yarn.QueueMetrics.Queue=root.AggregateContainersAllocated
+yarn.QueueMetrics.Queue=root.AggregateContainersReleased
+yarn.QueueMetrics.Queue=root.AllocatedContainers
+yarn.QueueMetrics.Queue=root.AllocatedMB
+yarn.QueueMetrics.Queue=root.AllocatedVCores
+yarn.QueueMetrics.Queue=root.AppAttemptFirstContainerAllocationDelayAvgTime
+yarn.QueueMetrics.Queue=root.AppAttemptFirstContainerAllocationDelayNumOps
+yarn.QueueMetrics.Queue=root.AppsCompleted
+yarn.QueueMetrics.Queue=root.AppsFailed
+yarn.QueueMetrics.Queue=root.AppsKilled
+yarn.QueueMetrics.Queue=root.AppsPending
+yarn.QueueMetrics.Queue=root.AppsRunning
+yarn.QueueMetrics.Queue=root.AppsSubmitted
+yarn.QueueMetrics.Queue=root.AvailableMB
+yarn.QueueMetrics.Queue=root.AvailableVCores
+yarn.QueueMetrics.Queue=root.PendingContainers
+yarn.QueueMetrics.Queue=root.PendingMB
+yarn.QueueMetrics.Queue=root.PendingVCores
+yarn.QueueMetrics.Queue=root.ReservedContainers
+yarn.QueueMetrics.Queue=root.ReservedMB
+yarn.QueueMetrics.Queue=root.ReservedVCores
+yarn.QueueMetrics.Queue=root.UsedAMResourceMB
+yarn.QueueMetrics.Queue=root.UsedAMResourceVCores
+yarn.QueueMetrics.Queue=root.default.AMResourceLimitMB
+yarn.QueueMetrics.Queue=root.default.AMResourceLimitVCores
+yarn.QueueMetrics.Queue=root.default.ActiveApplications
+yarn.QueueMetrics.Queue=root.default.ActiveUsers
+yarn.QueueMetrics.Queue=root.default.AggregateContainersAllocated
+yarn.QueueMetrics.Queue=root.default.AggregateContainersReleased
+yarn.QueueMetrics.Queue=root.default.AllocatedContainers
+yarn.QueueMetrics.Queue=root.default.AllocatedMB
+yarn.QueueMetrics.Queue=root.default.AllocatedVCores
+yarn.QueueMetrics.Queue=root.default.AppAttemptFirstContainerAllocationDelayAvgTime
+yarn.QueueMetrics.Queue=root.default.AppAttemptFirstContainerAllocationDelayNumOps
+yarn.QueueMetrics.Queue=root.default.AppsCompleted
+yarn.QueueMetrics.Queue=root.default.AppsFailed
+yarn.QueueMetrics.Queue=root.default.AppsKilled
+yarn.QueueMetrics.Queue=root.default.AppsPending
+yarn.QueueMetrics.Queue=root.default.AppsRunning
+yarn.QueueMetrics.Queue=root.default.AppsSubmitted
+yarn.QueueMetrics.Queue=root.default.AvailableMB
+yarn.QueueMetrics.Queue=root.default.AvailableVCores
+yarn.QueueMetrics.Queue=root.default.PendingContainers
+yarn.QueueMetrics.Queue=root.default.PendingMB
+yarn.QueueMetrics.Queue=root.default.PendingVCores
+yarn.QueueMetrics.Queue=root.default.ReservedContainers
+yarn.QueueMetrics.Queue=root.default.ReservedMB
+yarn.QueueMetrics.Queue=root.default.ReservedVCores
+yarn.QueueMetrics.Queue=root.default.UsedAMResourceMB
+yarn.QueueMetrics.Queue=root.default.UsedAMResourceVCores
+yarn.QueueMetrics.Queue=root.default.running_0
+yarn.QueueMetrics.Queue=root.default.running_1440
+yarn.QueueMetrics.Queue=root.default.running_300
+yarn.QueueMetrics.Queue=root.default.running_60
+yarn.QueueMetrics.Queue=root.running_0
+yarn.QueueMetrics.Queue=root.running_1440
+yarn.QueueMetrics.Queue=root.running_300
+yarn.QueueMetrics.Queue=root.running_60
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
avijayan@apache.org.