diff --git a/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/HBaseTimelineMetricsService.java b/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/HBaseTimelineMetricsService.java
index d21edfc..ae394e3 100644
--- a/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/HBaseTimelineMetricsService.java
+++ b/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/HBaseTimelineMetricsService.java
@@ -27,6 +27,7 @@
 import java.net.UnknownHostException;
 import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -262,8 +263,15 @@
     Multimap<String, List<Function>> metricFunctions =
       parseMetricNamesToAggregationFunctions(metricNames);
 
+    TimelineMetrics metrics = new TimelineMetrics();
+
     List<byte[]> uuids = metricMetadataManager.getUuids(metricFunctions.keySet(), hostnames, applicationId, instanceId);
 
+    if (uuids.isEmpty()) {
+      LOG.warn("No metric UUIDs generated for query : " + Arrays.asList(metricNames).toString());
+      return metrics;
+    }
+
     ConditionBuilder conditionBuilder = new ConditionBuilder(new ArrayList<String>(metricFunctions.keySet()))
       .hostnames(hostnames)
       .appId(applicationId)
@@ -296,8 +304,6 @@
 
     Condition condition = conditionBuilder.build();
 
-    TimelineMetrics metrics;
-
     if (hostnames == null || hostnames.isEmpty()) {
       metrics = hBaseAccessor.getAggregateMetricRecords(condition, metricFunctions);
     } else {
diff --git a/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/aggregators/Function.java b/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/aggregators/Function.java
index dd67b64..6929036 100644
--- a/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/aggregators/Function.java
+++ b/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/aggregators/Function.java
@@ -24,8 +24,7 @@
 /**
  * Is used to determine metrics aggregate table.
  *
- * @see TimelineWebServices#getTimelineMetric
- * @see TimelineWebServices#getTimelineMetrics
+ * @see org.apache.ambari.metrics.webapp.TimelineWebServices#getTimelineMetrics
  */
 public class Function {
   public static Function DEFAULT_VALUE_FUNCTION = new Function(ReadFunction.VALUE, null);
diff --git a/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java b/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java
index ff24c10..e13c884 100644
--- a/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java
+++ b/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java
@@ -55,6 +55,7 @@
 import static org.apache.ambari.metrics.core.timeline.TimelineMetricConfiguration.METRICS_METADATA_SYNC_SCHEDULE_DELAY;
 import static org.apache.ambari.metrics.core.timeline.TimelineMetricConfiguration.TIMELINE_METRICS_UUID_GEN_STRATEGY;
 import static org.apache.ambari.metrics.core.timeline.TimelineMetricConfiguration.TIMELINE_METRIC_METADATA_FILTERS;
+import static org.apache.ambari.metrics.core.timeline.aggregators.AggregatorUtils.getJavaRegexFromSqlRegex;
 
 public class TimelineMetricMetadataManager {
   private static final Log LOG = LogFactory.getLog(TimelineMetricMetadataManager.class);
@@ -497,19 +498,11 @@
   public List<byte[]> getUuids(Collection<String> metricNames, List<String> hostnames, String appId, String instanceId) {
 
     Collection<String> sanitizedMetricNames = new HashSet<>();
+    List<byte[]> uuids = new ArrayList<>();
 
     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("%", ".*");
-        }
+        String metricRegEx = getJavaRegexFromSqlRegex(metricName);
         for (TimelineMetricMetadataKey key : METADATA_CACHE.keySet()) {
           String metricNameFromMetadata = key.getMetricName();
           if (metricNameFromMetadata.matches(metricRegEx)) {
@@ -521,6 +514,10 @@
       }
     }
 
+    if(sanitizedMetricNames.isEmpty()) {
+      return uuids;
+    }
+
     Set<String> sanitizedHostNames = new HashSet<>();
     if (CollectionUtils.isNotEmpty(hostnames)) {
       for (String hostname : hostnames) {
@@ -538,8 +535,6 @@
       }
     }
 
-    List<byte[]> uuids = new ArrayList<>();
-
     if ( StringUtils.isNotEmpty(appId) && !(appId.equals("HOST") || appId.equals("FLUME_HANDLER"))) { //HACK.. Why??
       appId = appId.toLowerCase();
     }
diff --git a/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/discovery/TestMetadataManager.java b/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/discovery/TestMetadataManager.java
index 94fbb30..3604ec4 100644
--- a/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/discovery/TestMetadataManager.java
+++ b/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/discovery/TestMetadataManager.java
@@ -228,6 +228,11 @@
     List<String> hosts = Arrays.asList("dummy_host%", "dummy_3h");
     uuids = metadataManager.getUuids(metrics, hosts, "dummy_app2", null);
     Assert.assertTrue(uuids.size() == 9);
+
+    metrics = Arrays.asList("abc%");
+    hosts = Arrays.asList("dummy_host");
+    uuids = metadataManager.getUuids(metrics, hosts, "dummy_app2", null);
+    Assert.assertTrue(uuids.isEmpty());
   }
 
 
