Преглед на файлове

AMBARI-16926 Add ability to query all hosts using hostname=% through AMS API. (dsen)

Dmytro Sen преди 9 години
родител
ревизия
eb93cdf6c9

+ 21 - 2
ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/query/DefaultCondition.java

@@ -258,10 +258,29 @@ public class DefaultCondition implements Condition {
   }
 
   protected boolean appendHostnameClause(StringBuilder sb, boolean appendConjunction) {
+    boolean hostnameContainsRegex = false;
+    if (hostnames != null) {
+      for (String hostname : hostnames) {
+        if (hostname.contains("%")) {
+          hostnameContainsRegex = true;
+          break;
+        }
+      }
+    }
 
-    if (hostnames != null && getHostnames().size() > 1) {
-      StringBuilder hostnamesCondition = new StringBuilder();
+    StringBuilder hostnamesCondition = new StringBuilder();
+    if (hostnameContainsRegex) {
+      hostnamesCondition.append(" (");
+      for (String hostname : getHostnames()) {
+        if (hostnamesCondition.length() > 2) {
+          hostnamesCondition.append(" OR ");
+        }
+        hostnamesCondition.append("HOSTNAME LIKE ?");
+      }
+      hostnamesCondition.append(")");
 
+      appendConjunction = append(sb, appendConjunction, getHostnames(), hostnamesCondition.toString());
+    } else if (hostnames != null && getHostnames().size() > 1) {
       for (String hostname : getHostnames()) {
         if (hostnamesCondition.length() > 0) {
           hostnamesCondition.append(" ,");

+ 53 - 2
ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/TestPhoenixTransactSQL.java

@@ -575,7 +575,7 @@ public class TestPhoenixTransactSQL {
           "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(conditionClause, expectedClause);
+    Assert.assertEquals(expectedClause, conditionClause);
   }
 
   @Test
@@ -597,7 +597,7 @@ public class TestPhoenixTransactSQL {
       "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(conditionClause, expectedClause);
+    Assert.assertEquals(expectedClause, conditionClause);
   }
 
   @Test
@@ -612,4 +612,55 @@ public class TestPhoenixTransactSQL {
 
     Assert.assertEquals(condition.getConditionClause(), null);
   }
+
+  @Test
+  public void testHostsRegexpConditionClause() {
+    Condition condition = new TopNCondition(
+            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(
+            Arrays.asList("m1", "m2", "m3"), Arrays.asList("%.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 LIKE ?) 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 LIKE ?) AND APP_ID = ? AND INSTANCE_ID = ? AND SERVER_TIME >= ? AND SERVER_TIME < ?";
+    Assert.assertEquals(expectedClause, conditionClause);
+
+    condition = new TopNCondition(
+            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);
+  }
 }