diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ClusterMetricsInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ClusterMetricsInfo.java index e188fa05268..1e7a5bd83ed 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ClusterMetricsInfo.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ClusterMetricsInfo.java @@ -136,6 +136,16 @@ public ClusterMetricsInfo(final ResourceScheduler rs) { cs.getRootQueue().getQueueResourceUsage().getAllReserved()); totalAllocatedContainersAcrossPartition = ((ParentQueue) cs.getRootQueue()).getNumContainers(); + + this.totalMB = totalClusterResourcesAcrossPartition.getMemorySize(); + this.totalVirtualCores = totalClusterResourcesAcrossPartition.getvCores(); + this.allocatedMB = totalUsedResourcesAcrossPartition.getMemorySize(); + this.allocatedVirtualCores = totalUsedResourcesAcrossPartition.getvCores(); + this.reservedMB = totalReservedResourcesAcrossPartition.getMemorySize(); + this.reservedVirtualCores = totalReservedResourcesAcrossPartition.getMemorySize(); + this.availableMB = totalMB - allocatedMB - reservedMB; + this.availableVirtualCores = + totalVirtualCores - allocatedVirtualCores - reservedVirtualCores; crossPartitionMetricsAvailable = true; } } else { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesNodeLabels.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesNodeLabels.java index f1ea0fba033..f7f74e7fd82 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesNodeLabels.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesNodeLabels.java @@ -26,9 +26,17 @@ import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; import javax.ws.rs.core.MediaType; +import org.apache.hadoop.util.Sets; +import org.apache.hadoop.thirdparty.com.google.common.collect.ImmutableMap; +import org.apache.hadoop.yarn.api.records.NodeId; +import org.apache.hadoop.yarn.api.records.NodeLabel; +import org.apache.hadoop.yarn.server.resourcemanager.MockNM; +import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.hadoop.http.JettyUtils; @@ -753,6 +761,48 @@ public void testNodeLabelPartitionInfo() throws Exception { assertNotNull(nodes.getPartitionInfo().getResourceAvailable()); } + @Test + public void testMetricsNodeLabels() throws JSONException, Exception { + RMNodeLabelsManager nodeLabelManager; + Set labels = new HashSet(); + labels.add(NodeLabel.newInstance("y")); + labels.add(NodeLabel.newInstance("z")); + nodeLabelManager = rm.getRMContext().getNodeLabelManager(); + nodeLabelManager.addToCluserNodeLabels(labels); + + rm.start(); + MockNM nm1 = rm.registerNode("h1:1235", 2048, 1); + MockNM nm2 = rm.registerNode("h2:1235", 2048, 1); + + nodeLabelManager.addLabelsToNode( + ImmutableMap.of(NodeId.newInstance("h1", 1235), toSet("y"))); + nodeLabelManager.addLabelsToNode( + ImmutableMap.of(NodeId.newInstance("h2", 1235), toSet("z"))); + nm1.nodeHeartbeat(true); + nm2.nodeHeartbeat(true); + ClientResponse response; + + WebResource r = resource(); + response = + r.path("ws").path("v1").path("cluster") + .path("metrics/") + .queryParam("user.name", userName) + .accept(MediaType.APPLICATION_JSON) + .get(ClientResponse.class); + + JSONObject json = response.getEntity(JSONObject.class); + JSONObject clusterinfo = json.getJSONObject("clusterMetrics"); + assertEquals("totalMB doesn't match", 4096, clusterinfo.getInt("totalMB")); + assertEquals("totalVirtualCores doesn't match", 2, clusterinfo.getInt("totalVirtualCores")); + rm.stop(); + } + + @SuppressWarnings("unchecked") + private Set toSet(E... elements) { + Set set = Sets.newHashSet(elements); + return set; + } + @SuppressWarnings("rawtypes") private String toJson(Object nsli, Class klass) throws Exception { StringWriter sw = new StringWriter();