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 c126338ef0d..a3dd4a7b65c 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 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; @@ -117,6 +118,31 @@ protected final Configuration conf; private QueueMetricsForCustomResources queueMetricsForCustomResources; + private static String ALLOCATED_RESOURCE_METRIC_PREFIX = + "AllocatedResource."; + private static String ALLOCATED_RESOURCE_METRIC_DESC = + "Allocated NAME"; + + private static String AVAILABLE_RESOURCE_METRIC_PREFIX = + "AvailableResource."; + private static String AVAILABLE_RESOURCE_METRIC_DESC = + "Available NAME"; + + private static String PENDING_RESOURCE_METRIC_PREFIX = + "PendingResource."; + private static String PENDING_RESOURCE_METRIC_DESC = + "Pending NAME"; + + private static String RESERVED_RESOURCE_METRIC_PREFIX = + "ReservedResource."; + private static String RESERVED_RESOURCE_METRIC_DESC = + "Reserved NAME"; + + private static String AGGREGATE_PREEMPTED_SECONDS_METRIC_PREFIX = + "aggregatePreemptedSeconds."; + private static 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); @@ -362,6 +388,9 @@ public void setAvailableResourcesToQueue(String partition, Resource limit) { availableVCores.set(limit.getVirtualCores()); if (queueMetricsForCustomResources != null) { queueMetricsForCustomResources.setAvailable(limit); + registerCustomResources( + queueMetricsForCustomResources.getAvailableValues(), + AVAILABLE_RESOURCE_METRIC_PREFIX, AVAILABLE_RESOURCE_METRIC_DESC); } } } @@ -414,16 +443,39 @@ public void incrPendingResources(String partition, String user, } } + private void registerCustomResources(Map customResources, + String metricPrefix, String metricDesc) { + for (Entry entry : customResources.entrySet()) { + String resourceName = + entry.getKey(); + Long resourceValue = + entry.getValue(); + + MutableGaugeLong resourceMetric = + null; + if (this.registry.get(metricPrefix + resourceName) == null) { + resourceMetric = + this.registry.newGauge(metricPrefix + resourceName, + metricDesc.replace("NAME", resourceName), 0L); + } else { + resourceMetric = + (MutableGaugeLong) this.registry.get(metricPrefix + resourceName); + } + 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)) { @@ -444,6 +496,8 @@ private void _decrPendingResources(int containers, Resource res) { pendingVCores.decr(res.getVirtualCores() * containers); if (queueMetricsForCustomResources != null) { queueMetricsForCustomResources.decreasePending(res, containers); + registerCustomResources(queueMetricsForCustomResources.getPendingValues(), + PENDING_RESOURCE_METRIC_PREFIX, PENDING_RESOURCE_METRIC_DESC); } } @@ -476,6 +530,9 @@ public void allocateResources(String partition, String user, 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) { @@ -504,12 +561,18 @@ public void allocateResources(String partition, String user, Resource res) { 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); @@ -531,6 +594,9 @@ public void releaseResources(String partition, 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); @@ -554,6 +620,9 @@ private void releaseResources(String user, Resource res) { 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); @@ -591,6 +660,11 @@ public void updatePreemptedSecondsForCustomResources(Resource res, 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); @@ -609,6 +683,9 @@ public void reserveResource(String user, Resource res) { 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) { @@ -625,6 +702,9 @@ private void unreserveResource(String user, Resource res) { 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) {