You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by ep...@apache.org on 2019/11/22 19:15:51 UTC

[hadoop] 01/02: YARN-9773: Add QueueMetrics for Custom Resources. Contributed by Manikandan R.

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

epayne pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hadoop.git

commit bfb76e60cfaf9e500a7756b75cf9d1a2f1ea45f3
Author: Eric E Payne <er...@verizonmedia.com>
AuthorDate: Wed Oct 16 21:10:08 2019 +0000

    YARN-9773: Add QueueMetrics for Custom Resources. Contributed by Manikandan R.
    
    (cherry picked from commit a5034c7988b6bf54bb7dab208100a2d205e3929e)
---
 .../resourcemanager/scheduler/QueueMetrics.java    | 112 ++++++++++++++++++++-
 .../scheduler/ResourceMetricsChecker.java          |  67 +++++++++---
 .../scheduler/TestQueueMetrics.java                |  60 +++++------
 .../TestQueueMetricsForCustomResources.java        |  57 ++++++++++-
 4 files changed, 240 insertions(+), 56 deletions(-)

diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java
index bb8d1d3..707cafa 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java
@@ -23,6 +23,7 @@ import static org.apache.hadoop.metrics2.lib.Interns.info;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import com.google.common.annotations.VisibleForTesting;
 import org.apache.hadoop.classification.InterfaceAudience;
@@ -43,6 +44,7 @@ import org.apache.hadoop.metrics2.lib.MutableGaugeLong;
 import org.apache.hadoop.metrics2.lib.MutableRate;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.Resource;
+import org.apache.hadoop.yarn.api.records.ResourceInformation;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState;
@@ -123,6 +125,31 @@ public class QueueMetrics implements MetricsSource {
   protected final Configuration conf;
   private QueueMetricsForCustomResources queueMetricsForCustomResources;
 
+  private static final String ALLOCATED_RESOURCE_METRIC_PREFIX =
+      "AllocatedResource.";
+  private static final String ALLOCATED_RESOURCE_METRIC_DESC =
+    "Allocated NAME";
+
+  private static final String AVAILABLE_RESOURCE_METRIC_PREFIX =
+    "AvailableResource.";
+  private static final String AVAILABLE_RESOURCE_METRIC_DESC =
+    "Available NAME";
+
+  private static final String PENDING_RESOURCE_METRIC_PREFIX =
+    "PendingResource.";
+  private static final String PENDING_RESOURCE_METRIC_DESC =
+    "Pending NAME";
+
+  private static final String RESERVED_RESOURCE_METRIC_PREFIX =
+    "ReservedResource.";
+  private static final String RESERVED_RESOURCE_METRIC_DESC =
+    "Reserved NAME";
+
+  private static final String AGGREGATE_PREEMPTED_SECONDS_METRIC_PREFIX =
+    "AggregatePreemptedSeconds.";
+  private static final String AGGREGATE_PREEMPTED_SECONDS_METRIC_DESC =
+    "Aggregate Preempted Seconds for NAME";
+
   protected QueueMetrics(MetricsSystem ms, String queueName, Queue parent, 
 	       boolean enableUserMetrics, Configuration conf) {
     registry = new MetricsRegistry(RECORD_INFO);
@@ -137,6 +164,7 @@ public class QueueMetrics implements MetricsSource {
     if (ResourceUtils.getNumberOfKnownResourceTypes() > 2) {
       this.queueMetricsForCustomResources =
           new QueueMetricsForCustomResources();
+      registerCustomResources();
     }
   }
 
@@ -368,6 +396,9 @@ public class QueueMetrics implements MetricsSource {
       availableVCores.set(limit.getVirtualCores());
       if (queueMetricsForCustomResources != null) {
         queueMetricsForCustomResources.setAvailable(limit);
+        registerCustomResources(
+            queueMetricsForCustomResources.getAvailableValues(),
+            AVAILABLE_RESOURCE_METRIC_PREFIX, AVAILABLE_RESOURCE_METRIC_DESC);
       }
     }
   }
@@ -420,16 +451,67 @@ public class QueueMetrics implements MetricsSource {
     }
   }
 
+  /**
+   * Register all custom resources metrics as part of initialization. As and
+   * when this metric object construction happens for any queue, all custom
+   * resource metrics value would be initialized with '0' like any other
+   * mandatory resources metrics
+   */
+  private void registerCustomResources() {
+    Map<String, Long> customResources =
+      new HashMap<String, Long>();
+    ResourceInformation[] resources =
+      ResourceUtils.getResourceTypesArray();
+
+    for (int i =
+      2; i < resources.length; i++) {
+      ResourceInformation resource =
+        resources[i];
+      customResources.put(resource.getName(), new Long(0));
+    }
+
+    registerCustomResources(customResources, ALLOCATED_RESOURCE_METRIC_PREFIX,
+        ALLOCATED_RESOURCE_METRIC_DESC);
+    registerCustomResources(customResources, AVAILABLE_RESOURCE_METRIC_PREFIX,
+        AVAILABLE_RESOURCE_METRIC_DESC);
+    registerCustomResources(customResources, PENDING_RESOURCE_METRIC_PREFIX,
+        PENDING_RESOURCE_METRIC_DESC);
+    registerCustomResources(customResources, RESERVED_RESOURCE_METRIC_PREFIX,
+        RESERVED_RESOURCE_METRIC_DESC);
+    registerCustomResources(customResources,
+        AGGREGATE_PREEMPTED_SECONDS_METRIC_PREFIX,
+        AGGREGATE_PREEMPTED_SECONDS_METRIC_DESC);
+  }
+
+  private void registerCustomResources(Map<String, Long> customResources,
+      String metricPrefix, String metricDesc) {
+    for (Entry<String, Long> entry : customResources.entrySet()) {
+      String resourceName = entry.getKey();
+      Long resourceValue = entry.getValue();
+
+      MutableGaugeLong resourceMetric =
+        (MutableGaugeLong) this.registry.get(metricPrefix + resourceName);
+
+      if (resourceMetric == null) {
+        resourceMetric =
+          this.registry.newGauge(metricPrefix + resourceName,
+              metricDesc.replace("NAME", resourceName), 0L);
+      }
+      resourceMetric.set(resourceValue);
+    }
+  }
+
   private void _incrPendingResources(int containers, Resource res) {
     pendingContainers.incr(containers);
     pendingMB.incr(res.getMemorySize() * containers);
     pendingVCores.incr(res.getVirtualCores() * containers);
     if (queueMetricsForCustomResources != null) {
       queueMetricsForCustomResources.increasePending(res, containers);
+      registerCustomResources(queueMetricsForCustomResources.getPendingValues(),
+          PENDING_RESOURCE_METRIC_PREFIX, PENDING_RESOURCE_METRIC_DESC);
     }
   }
 
-
   public void decrPendingResources(String partition, String user,
       int containers, Resource res) {
     if (partition == null || partition.equals(RMNodeLabelsManager.NO_LABEL)) {
@@ -450,6 +532,8 @@ public class QueueMetrics implements MetricsSource {
     pendingVCores.decr(res.getVirtualCores() * containers);
     if (queueMetricsForCustomResources != null) {
       queueMetricsForCustomResources.decreasePending(res, containers);
+      registerCustomResources(queueMetricsForCustomResources.getPendingValues(),
+          PENDING_RESOURCE_METRIC_PREFIX, PENDING_RESOURCE_METRIC_DESC);
     }
   }
 
@@ -482,6 +566,9 @@ public class QueueMetrics implements MetricsSource {
       allocatedVCores.incr(res.getVirtualCores() * containers);
       if (queueMetricsForCustomResources != null) {
         queueMetricsForCustomResources.increaseAllocated(res, containers);
+        registerCustomResources(
+            queueMetricsForCustomResources.getAllocatedValues(),
+            ALLOCATED_RESOURCE_METRIC_PREFIX, ALLOCATED_RESOURCE_METRIC_DESC);
       }
 
       if (decrPending) {
@@ -510,12 +597,18 @@ public class QueueMetrics implements MetricsSource {
       allocatedVCores.incr(res.getVirtualCores());
       if (queueMetricsForCustomResources != null) {
         queueMetricsForCustomResources.increaseAllocated(res);
+        registerCustomResources(
+            queueMetricsForCustomResources.getAllocatedValues(),
+            ALLOCATED_RESOURCE_METRIC_PREFIX, ALLOCATED_RESOURCE_METRIC_DESC);
       }
 
       pendingMB.decr(res.getMemorySize());
       pendingVCores.decr(res.getVirtualCores());
       if (queueMetricsForCustomResources != null) {
         queueMetricsForCustomResources.decreasePending(res);
+        registerCustomResources(
+            queueMetricsForCustomResources.getPendingValues(),
+            PENDING_RESOURCE_METRIC_PREFIX, PENDING_RESOURCE_METRIC_DESC);
       }
 
       QueueMetrics userMetrics = getUserMetrics(user);
@@ -537,6 +630,9 @@ public class QueueMetrics implements MetricsSource {
       allocatedVCores.decr(res.getVirtualCores() * containers);
       if (queueMetricsForCustomResources != null) {
         queueMetricsForCustomResources.decreaseAllocated(res, containers);
+        registerCustomResources(
+            queueMetricsForCustomResources.getAllocatedValues(),
+            ALLOCATED_RESOURCE_METRIC_PREFIX, ALLOCATED_RESOURCE_METRIC_DESC);
       }
 
       QueueMetrics userMetrics = getUserMetrics(user);
@@ -560,6 +656,9 @@ public class QueueMetrics implements MetricsSource {
     allocatedVCores.decr(res.getVirtualCores());
     if (queueMetricsForCustomResources != null) {
       queueMetricsForCustomResources.decreaseAllocated(res);
+      registerCustomResources(
+          queueMetricsForCustomResources.getAllocatedValues(),
+          ALLOCATED_RESOURCE_METRIC_PREFIX, ALLOCATED_RESOURCE_METRIC_DESC);
     }
 
     QueueMetrics userMetrics = getUserMetrics(user);
@@ -597,6 +696,11 @@ public class QueueMetrics implements MetricsSource {
     if (queueMetricsForCustomResources != null) {
       queueMetricsForCustomResources
           .increaseAggregatedPreemptedSeconds(res, seconds);
+      registerCustomResources(
+          queueMetricsForCustomResources.getAggregatePreemptedSeconds()
+              .getValues(),
+          AGGREGATE_PREEMPTED_SECONDS_METRIC_PREFIX,
+          AGGREGATE_PREEMPTED_SECONDS_METRIC_DESC);
     }
     if (parent != null) {
       parent.updatePreemptedSecondsForCustomResources(res, seconds);
@@ -623,6 +727,9 @@ public class QueueMetrics implements MetricsSource {
     reservedVCores.incr(res.getVirtualCores());
     if (queueMetricsForCustomResources != null) {
       queueMetricsForCustomResources.increaseReserved(res);
+      registerCustomResources(
+          queueMetricsForCustomResources.getReservedValues(),
+          RESERVED_RESOURCE_METRIC_PREFIX, RESERVED_RESOURCE_METRIC_DESC);
     }
     QueueMetrics userMetrics = getUserMetrics(user);
     if (userMetrics != null) {
@@ -639,6 +746,9 @@ public class QueueMetrics implements MetricsSource {
     reservedVCores.decr(res.getVirtualCores());
     if (queueMetricsForCustomResources != null) {
       queueMetricsForCustomResources.decreaseReserved(res);
+      registerCustomResources(
+          queueMetricsForCustomResources.getReservedValues(),
+          RESERVED_RESOURCE_METRIC_PREFIX, RESERVED_RESOURCE_METRIC_DESC);
     }
     QueueMetrics userMetrics = getUserMetrics(user);
     if (userMetrics != null) {
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/ResourceMetricsChecker.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/ResourceMetricsChecker.java
index 05341aab..b49b125 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/ResourceMetricsChecker.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/ResourceMetricsChecker.java
@@ -43,6 +43,16 @@ import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMe
 import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.RESERVED_CONTAINERS;
 import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.RESERVED_MB;
 import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.RESERVED_V_CORES;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.ALLOCATED_CUSTOM_RES1;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.ALLOCATED_CUSTOM_RES2;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.AVAILABLE_CUSTOM_RES1;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.AVAILABLE_CUSTOM_RES2;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.PENDING_CUSTOM_RES1;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.PENDING_CUSTOM_RES2;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.RESERVED_CUSTOM_RES1;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.RESERVED_CUSTOM_RES2;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.AGGREGATE_PREEMPTED_SECONDS_CUSTOM_RES1;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.AGGREGATE_PREEMPTED_SECONDS_CUSTOM_RES2;
 
 final class ResourceMetricsChecker {
   private final static Logger LOG =
@@ -52,21 +62,33 @@ final class ResourceMetricsChecker {
     GAUGE_INT, GAUGE_LONG, COUNTER_INT, COUNTER_LONG
   }
 
+  private static final ResourceMetricsChecker INITIAL_MANDATORY_RES_CHECKER =
+    new ResourceMetricsChecker().gaugeLong(ALLOCATED_MB, 0)
+        .gaugeInt(ALLOCATED_V_CORES, 0).gaugeInt(ALLOCATED_CONTAINERS, 0)
+        .counter(AGGREGATE_CONTAINERS_ALLOCATED, 0)
+        .counter(AGGREGATE_CONTAINERS_RELEASED, 0).gaugeLong(AVAILABLE_MB, 0)
+        .gaugeInt(AVAILABLE_V_CORES, 0).gaugeLong(PENDING_MB, 0)
+        .gaugeInt(PENDING_V_CORES, 0).gaugeInt(PENDING_CONTAINERS, 0)
+        .gaugeLong(RESERVED_MB, 0).gaugeInt(RESERVED_V_CORES, 0)
+        .gaugeInt(RESERVED_CONTAINERS, 0);
+
   private static final ResourceMetricsChecker INITIAL_CHECKER =
-      new ResourceMetricsChecker()
-          .gaugeLong(ALLOCATED_MB, 0)
-          .gaugeInt(ALLOCATED_V_CORES, 0)
-          .gaugeInt(ALLOCATED_CONTAINERS, 0)
-          .counter(AGGREGATE_CONTAINERS_ALLOCATED, 0)
-          .counter(AGGREGATE_CONTAINERS_RELEASED, 0)
-          .gaugeLong(AVAILABLE_MB, 0)
-          .gaugeInt(AVAILABLE_V_CORES, 0)
-          .gaugeLong(PENDING_MB, 0)
-          .gaugeInt(PENDING_V_CORES, 0)
-          .gaugeInt(PENDING_CONTAINERS, 0)
-          .gaugeLong(RESERVED_MB, 0)
-          .gaugeInt(RESERVED_V_CORES, 0)
-          .gaugeInt(RESERVED_CONTAINERS, 0);
+    new ResourceMetricsChecker().gaugeLong(ALLOCATED_MB, 0)
+        .gaugeInt(ALLOCATED_V_CORES, 0).gaugeInt(ALLOCATED_CONTAINERS, 0)
+        .counter(AGGREGATE_CONTAINERS_ALLOCATED, 0)
+        .counter(AGGREGATE_CONTAINERS_RELEASED, 0).gaugeLong(AVAILABLE_MB, 0)
+        .gaugeInt(AVAILABLE_V_CORES, 0).gaugeLong(PENDING_MB, 0)
+        .gaugeInt(PENDING_V_CORES, 0).gaugeInt(PENDING_CONTAINERS, 0)
+        .gaugeLong(RESERVED_MB, 0).gaugeInt(RESERVED_V_CORES, 0)
+        .gaugeInt(RESERVED_CONTAINERS, 0).gaugeLong(ALLOCATED_CUSTOM_RES1, 0)
+        .gaugeLong(ALLOCATED_CUSTOM_RES2, 0).gaugeLong(AVAILABLE_CUSTOM_RES1, 0)
+        .gaugeLong(AVAILABLE_CUSTOM_RES2, 0).gaugeLong(PENDING_CUSTOM_RES1, 0)
+        .gaugeLong(PENDING_CUSTOM_RES2, 0).gaugeLong(RESERVED_CUSTOM_RES1, 0)
+        .gaugeLong(RESERVED_CUSTOM_RES2, 0)
+        .gaugeLong(AGGREGATE_PREEMPTED_SECONDS_CUSTOM_RES1, 0)
+        .gaugeLong(AGGREGATE_PREEMPTED_SECONDS_CUSTOM_RES2, 0);
+
+
 
   enum ResourceMetricsKey {
     ALLOCATED_MB("AllocatedMB", GAUGE_LONG),
@@ -87,7 +109,18 @@ final class ResourceMetricsChecker {
     AGGREGATE_VCORE_SECONDS_PREEMPTED(
         "AggregateVcoreSecondsPreempted", COUNTER_LONG),
     AGGREGATE_MEMORY_MB_SECONDS_PREEMPTED(
-        "AggregateMemoryMBSecondsPreempted", COUNTER_LONG);
+        "AggregateMemoryMBSecondsPreempted", COUNTER_LONG),
+    ALLOCATED_CUSTOM_RES1("AllocatedResource.custom_res_1", GAUGE_LONG),
+    ALLOCATED_CUSTOM_RES2("AllocatedResource.custom_res_2", GAUGE_LONG),
+    AVAILABLE_CUSTOM_RES1("AvailableResource.custom_res_1", GAUGE_LONG),
+    AVAILABLE_CUSTOM_RES2("AvailableResource.custom_res_2", GAUGE_LONG),
+    PENDING_CUSTOM_RES1("PendingResource.custom_res_1",GAUGE_LONG),
+    PENDING_CUSTOM_RES2("PendingResource.custom_res_2",GAUGE_LONG),
+    RESERVED_CUSTOM_RES1("ReservedResource.custom_res_1",GAUGE_LONG),
+    RESERVED_CUSTOM_RES2("ReservedResource.custom_res_2", GAUGE_LONG),
+    AGGREGATE_PREEMPTED_SECONDS_CUSTOM_RES1("AggregatePreemptedSeconds.custom_res_1", GAUGE_LONG),
+    AGGREGATE_PREEMPTED_SECONDS_CUSTOM_RES2("AggregatePreemptedSeconds.custom_res_2", GAUGE_LONG);
+
 
     private String value;
     private ResourceMetricType type;
@@ -131,6 +164,10 @@ final class ResourceMetricsChecker {
     return new ResourceMetricsChecker(INITIAL_CHECKER);
   }
 
+  public static ResourceMetricsChecker createMandatoryResourceChecker() {
+    return new ResourceMetricsChecker(INITIAL_MANDATORY_RES_CHECKER);
+  }
+
   ResourceMetricsChecker gaugeLong(ResourceMetricsKey key, long value) {
     ensureTypeIsCorrect(key, GAUGE_LONG);
     gaugesLong.put(key, value);
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetrics.java
index 2066f60..33c3929 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetrics.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetrics.java
@@ -105,13 +105,11 @@ public class TestQueueMetrics {
         USER, 5, Resources.createResource(3*GB, 3));
     // Available resources is set externally, as it depends on dynamic
     // configurable cluster/queue resources
-    ResourceMetricsChecker rmChecker = ResourceMetricsChecker.create()
-        .gaugeLong(AVAILABLE_MB, 100 * GB)
-        .gaugeInt(AVAILABLE_V_CORES, 100)
-        .gaugeLong(PENDING_MB, 15 * GB)
-        .gaugeInt(PENDING_V_CORES, 15)
-        .gaugeInt(PENDING_CONTAINERS, 5)
-        .checkAgainst(queueSource);
+    ResourceMetricsChecker rmChecker =
+      ResourceMetricsChecker.createMandatoryResourceChecker()
+          .gaugeLong(AVAILABLE_MB, 100 * GB).gaugeInt(AVAILABLE_V_CORES, 100)
+          .gaugeLong(PENDING_MB, 15 * GB).gaugeInt(PENDING_V_CORES, 15)
+          .gaugeInt(PENDING_CONTAINERS, 5).checkAgainst(queueSource);
 
     metrics.runAppAttempt(app.getApplicationId(), USER);
     appMetricsChecker = AppMetricsChecker.createFromChecker(appMetricsChecker)
@@ -284,7 +282,7 @@ public class TestQueueMetrics {
     // Available resources is set externally, as it depends on dynamic
     // configurable cluster/queue resources
     ResourceMetricsChecker resMetricsQueueSourceChecker =
-        ResourceMetricsChecker.create()
+      ResourceMetricsChecker.createMandatoryResourceChecker()
             .gaugeLong(AVAILABLE_MB, 100 * GB)
             .gaugeInt(AVAILABLE_V_CORES, 100)
             .gaugeLong(PENDING_MB, 15 * GB)
@@ -292,7 +290,7 @@ public class TestQueueMetrics {
             .gaugeInt(PENDING_CONTAINERS, 5)
             .checkAgainst(queueSource);
     ResourceMetricsChecker resMetricsUserSourceChecker =
-        ResourceMetricsChecker.create()
+      ResourceMetricsChecker.createMandatoryResourceChecker()
             .gaugeLong(AVAILABLE_MB, 10 * GB)
             .gaugeInt(AVAILABLE_V_CORES, 10)
             .gaugeLong(PENDING_MB, 15 * GB)
@@ -471,37 +469,25 @@ public class TestQueueMetrics {
         USER, 5, Resources.createResource(3*GB, 3));
 
     ResourceMetricsChecker resMetricsQueueSourceChecker =
-        ResourceMetricsChecker.create()
-        .gaugeLong(AVAILABLE_MB, 100 * GB)
-        .gaugeInt(AVAILABLE_V_CORES, 100)
-        .gaugeLong(PENDING_MB, 15 * GB)
-        .gaugeInt(PENDING_V_CORES, 15)
-        .gaugeInt(PENDING_CONTAINERS, 5)
-        .checkAgainst(leaf.queueSource);
+      ResourceMetricsChecker.createMandatoryResourceChecker()
+          .gaugeLong(AVAILABLE_MB, 100 * GB).gaugeInt(AVAILABLE_V_CORES, 100)
+          .gaugeLong(PENDING_MB, 15 * GB).gaugeInt(PENDING_V_CORES, 15)
+          .gaugeInt(PENDING_CONTAINERS, 5).checkAgainst(leaf.queueSource);
     ResourceMetricsChecker resMetricsParentQueueSourceChecker =
-        ResourceMetricsChecker.create()
-            .gaugeLong(AVAILABLE_MB, 100 * GB)
-            .gaugeInt(AVAILABLE_V_CORES, 100)
-            .gaugeLong(PENDING_MB, 15 * GB)
-            .gaugeInt(PENDING_V_CORES, 15)
-            .gaugeInt(PENDING_CONTAINERS, 5)
-            .checkAgainst(root.queueSource);
+      ResourceMetricsChecker.createMandatoryResourceChecker()
+          .gaugeLong(AVAILABLE_MB, 100 * GB).gaugeInt(AVAILABLE_V_CORES, 100)
+          .gaugeLong(PENDING_MB, 15 * GB).gaugeInt(PENDING_V_CORES, 15)
+          .gaugeInt(PENDING_CONTAINERS, 5).checkAgainst(root.queueSource);
     ResourceMetricsChecker resMetricsUserSourceChecker =
-        ResourceMetricsChecker.create()
-            .gaugeLong(AVAILABLE_MB, 10 * GB)
-            .gaugeInt(AVAILABLE_V_CORES, 10)
-            .gaugeLong(PENDING_MB, 15 * GB)
-            .gaugeInt(PENDING_V_CORES, 15)
-            .gaugeInt(PENDING_CONTAINERS, 5)
-            .checkAgainst(leaf.userSource);
+      ResourceMetricsChecker.createMandatoryResourceChecker()
+          .gaugeLong(AVAILABLE_MB, 10 * GB).gaugeInt(AVAILABLE_V_CORES, 10)
+          .gaugeLong(PENDING_MB, 15 * GB).gaugeInt(PENDING_V_CORES, 15)
+          .gaugeInt(PENDING_CONTAINERS, 5).checkAgainst(leaf.userSource);
     ResourceMetricsChecker resMetricsParentUserSourceChecker =
-        ResourceMetricsChecker.create()
-            .gaugeLong(AVAILABLE_MB, 10 * GB)
-            .gaugeInt(AVAILABLE_V_CORES, 10)
-            .gaugeLong(PENDING_MB, 15 * GB)
-            .gaugeInt(PENDING_V_CORES, 15)
-            .gaugeInt(PENDING_CONTAINERS, 5)
-            .checkAgainst(root.userSource);
+      ResourceMetricsChecker.createMandatoryResourceChecker()
+          .gaugeLong(AVAILABLE_MB, 10 * GB).gaugeInt(AVAILABLE_V_CORES, 10)
+          .gaugeLong(PENDING_MB, 15 * GB).gaugeInt(PENDING_V_CORES, 15)
+          .gaugeInt(PENDING_CONTAINERS, 5).checkAgainst(root.userSource);
 
     leaf.queueMetrics.runAppAttempt(app.getApplicationId(), USER);
     appMetricsQueueSourceChecker =
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetricsForCustomResources.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetricsForCustomResources.java
index eb927e7..214a59c 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetricsForCustomResources.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetricsForCustomResources.java
@@ -71,6 +71,17 @@ import static org.apache.hadoop.yarn.server.resourcemanager.scheduler
 import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.RESERVED_CONTAINERS;
 import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.RESERVED_MB;
 import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.RESERVED_V_CORES;
+
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.ALLOCATED_CUSTOM_RES1;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.ALLOCATED_CUSTOM_RES2;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.AVAILABLE_CUSTOM_RES1;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.AVAILABLE_CUSTOM_RES2;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.PENDING_CUSTOM_RES1;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.PENDING_CUSTOM_RES2;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.RESERVED_CUSTOM_RES1;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.RESERVED_CUSTOM_RES2;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.AGGREGATE_PREEMPTED_SECONDS_CUSTOM_RES1;
+import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceMetricsChecker.ResourceMetricsKey.AGGREGATE_PREEMPTED_SECONDS_CUSTOM_RES2;
 import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.TestQueueMetrics.queueSource;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -203,7 +214,11 @@ public class TestQueueMetricsForCustomResources {
         .gaugeLong(PENDING_MB, containers *
             testData.resource.getMemorySize())
         .gaugeInt(PENDING_V_CORES, containers *
-            testData.resource.getVirtualCores());
+              testData.resource.getVirtualCores())
+        .gaugeLong(PENDING_CUSTOM_RES1,
+            containers * testData.customResourceValues.get(CUSTOM_RES_1))
+        .gaugeLong(PENDING_CUSTOM_RES2,
+            containers * testData.customResourceValues.get(CUSTOM_RES_2));
     Map<String, Long> expected = new HashMap<>();
     for (Map.Entry<String, Long> entry : testData.customResourceValues.entrySet()) {
       expected.put(entry.getKey(), entry.getValue() * containers);
@@ -228,6 +243,12 @@ public class TestQueueMetricsForCustomResources {
         .gaugeInt(PENDING_CONTAINERS, 0)
         .gaugeLong(PENDING_MB, 0)
         .gaugeInt(PENDING_V_CORES, 0)
+        .gaugeLong(ALLOCATED_CUSTOM_RES1,
+            testData.containers
+                * testData.customResourceValues.get(CUSTOM_RES_1))
+        .gaugeLong(ALLOCATED_CUSTOM_RES2,
+            testData.containers
+                * testData.customResourceValues.get(CUSTOM_RES_2))
         .checkAgainst(testData.leafQueue.queueSource);
     if (decreasePending) {
       Map<String, Long> expected = new HashMap<>();
@@ -261,7 +282,11 @@ public class TestQueueMetricsForCustomResources {
         .counter(AGGREGATE_MEMORY_MB_SECONDS_PREEMPTED,
             testData.resource.getMemorySize() * seconds)
         .counter(AGGREGATE_VCORE_SECONDS_PREEMPTED,
-            testData.resource.getVirtualCores() * seconds);
+            testData.resource.getVirtualCores() * seconds)
+        .gaugeLong(AGGREGATE_PREEMPTED_SECONDS_CUSTOM_RES1,
+            testData.customResourceValues.get(CUSTOM_RES_1) * seconds)
+        .gaugeLong(AGGREGATE_PREEMPTED_SECONDS_CUSTOM_RES2,
+            testData.customResourceValues.get(CUSTOM_RES_2) * seconds);
 
     Map<String, Long> expected = new HashMap<>();
     for (Map.Entry<String, Long> entry : testData.customResourceValues.entrySet()) {
@@ -292,6 +317,10 @@ public class TestQueueMetricsForCustomResources {
         .gaugeInt(RESERVED_CONTAINERS, 1)
         .gaugeLong(RESERVED_MB, testData.resource.getMemorySize())
         .gaugeInt(RESERVED_V_CORES, testData.resource.getVirtualCores())
+        .gaugeLong(RESERVED_CUSTOM_RES1,
+            testData.customResourceValues.get(CUSTOM_RES_1))
+        .gaugeLong(RESERVED_CUSTOM_RES2,
+            testData.customResourceValues.get(CUSTOM_RES_2))
         .checkAgainst(testData.leafQueue.queueSource);
     assertAllReservedMetrics(testData.leafQueue, checker,
         MetricsForCustomResource.RESERVED, testData.customResourceValues);
@@ -513,6 +542,8 @@ public class TestQueueMetricsForCustomResources {
     ResourceMetricsChecker.create()
         .gaugeLong(AVAILABLE_MB, GB)
         .gaugeInt(AVAILABLE_V_CORES, 4)
+        .gaugeLong(AVAILABLE_CUSTOM_RES1, 5 * GB)
+        .gaugeLong(AVAILABLE_CUSTOM_RES2, 6 * GB)
         .checkAgainst(queueSource);
 
     assertCustomResourceValue(MetricsForCustomResource.AVAILABLE,
@@ -537,6 +568,8 @@ public class TestQueueMetricsForCustomResources {
     ResourceMetricsChecker.create()
         .gaugeLong(AVAILABLE_MB, GB)
         .gaugeInt(AVAILABLE_V_CORES, 4)
+        .gaugeLong(AVAILABLE_CUSTOM_RES1, 15 * GB)
+        .gaugeLong(AVAILABLE_CUSTOM_RES2, 20 * GB)
         .checkAgainst(queueSource);
 
     assertCustomResourceValue(MetricsForCustomResource.AVAILABLE,
@@ -574,12 +607,23 @@ public class TestQueueMetricsForCustomResources {
     final int vCoresToDecrease = resourceToDecrease.getVirtualCores();
     final long memoryMBToDecrease = resourceToDecrease.getMemorySize();
     final int containersAfterDecrease = containers - containersToDecrease;
+    final long customRes1ToDecrease =
+      resourceToDecrease.getResourceValue(CUSTOM_RES_1);
+    final long customRes2ToDecrease =
+      resourceToDecrease.getResourceValue(CUSTOM_RES_2);
+
     final int vcoresAfterDecrease =
         (defaultResource.getVirtualCores() * containers)
             - (vCoresToDecrease * containersToDecrease);
     final long memoryAfterDecrease =
         (defaultResource.getMemorySize() * containers)
             - (memoryMBToDecrease * containersToDecrease);
+    final long customResource1AfterDecrease =
+      (testData.customResourceValues.get(CUSTOM_RES_1) * containers)
+          - (customRes1ToDecrease * containersToDecrease);
+    final long customResource2AfterDecrease =
+      (testData.customResourceValues.get(CUSTOM_RES_2) * containers)
+          - (customRes2ToDecrease * containersToDecrease);
 
     //first, increase resources to be able to decrease some
     testIncreasePendingResources(testData);
@@ -597,6 +641,8 @@ public class TestQueueMetricsForCustomResources {
         .gaugeInt(PENDING_CONTAINERS, containersAfterDecrease)
         .gaugeLong(PENDING_MB, memoryAfterDecrease)
         .gaugeInt(PENDING_V_CORES, vcoresAfterDecrease)
+        .gaugeLong(PENDING_CUSTOM_RES1, customResource1AfterDecrease)
+        .gaugeLong(PENDING_CUSTOM_RES2, customResource2AfterDecrease)
         .checkAgainst(testData.leafQueue.queueSource);
 
     Map<String, Long> expected = new HashMap<>();
@@ -652,7 +698,11 @@ public class TestQueueMetricsForCustomResources {
         .gaugeLong(ALLOCATED_MB, resource.getMemorySize())
         .gaugeInt(ALLOCATED_V_CORES, resource.getVirtualCores())
         .gaugeInt(PENDING_CONTAINERS, 1).gaugeLong(PENDING_MB, 0)
-        .gaugeInt(PENDING_V_CORES, 0);
+        .gaugeInt(PENDING_V_CORES, 0)
+        .gaugeLong(ALLOCATED_CUSTOM_RES1,
+            testData.customResourceValues.get(CUSTOM_RES_1))
+        .gaugeLong(ALLOCATED_CUSTOM_RES2,
+            testData.customResourceValues.get(CUSTOM_RES_2));
 
     checker.checkAgainst(testData.leafQueue.queueSource);
     checker.checkAgainst(testData.leafQueue.getRoot().queueSource);
@@ -749,6 +799,7 @@ public class TestQueueMetricsForCustomResources {
         .gaugeInt(RESERVED_CONTAINERS, 0)
         .gaugeLong(RESERVED_MB, 0)
         .gaugeInt(RESERVED_V_CORES, 0)
+        .gaugeLong(RESERVED_CUSTOM_RES1, 0).gaugeLong(RESERVED_CUSTOM_RES2, 0)
         .checkAgainst(testData.leafQueue.queueSource);
     Map<String, Long> expected = new HashMap<>();
     for (Map.Entry<String, Long> entry : testData.customResourceValues.entrySet()) {


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org