diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSQueueMetrics.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSQueueMetrics.java index 42c8825..d748254 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSQueueMetrics.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSQueueMetrics.java @@ -18,6 +18,7 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair; +import com.google.common.annotations.VisibleForTesting; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.metrics2.MetricsSystem; import org.apache.hadoop.metrics2.annotation.Metric; @@ -109,6 +110,7 @@ public void setMaxApps(int max) { maxApps.set(max); } + @Metric("Scheduling policy") public String getSchedulingPolicy() { return schedulingPolicy; } @@ -121,21 +123,26 @@ public void setSchedulingPolicy(String policy) { static FSQueueMetrics forQueue(String queueName, Queue parent, boolean enableUserMetrics, Configuration conf) { MetricsSystem ms = DefaultMetricsSystem.instance(); + return forQueue(ms, queueName, parent, enableUserMetrics, conf); + } + + @VisibleForTesting + protected static FSQueueMetrics forQueue(MetricsSystem ms , String queueName, + Queue parent, boolean enableUserMetrics, Configuration conf) { QueueMetrics metrics = queueMetrics.get(queueName); if (metrics == null) { metrics = new FSQueueMetrics(ms, queueName, parent, enableUserMetrics, conf) .tag(QUEUE_INFO, queueName); - + // Register with the MetricsSystems if (ms != null) { metrics = ms.register( - sourceName(queueName).toString(), - "Metrics for queue: " + queueName, metrics); + sourceName(queueName).toString(), + "Metrics for queue: " + queueName, metrics); } queueMetrics.put(queueName, metrics); } return (FSQueueMetrics)metrics; } - } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFSQueueMetrics.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFSQueueMetrics.java new file mode 100644 index 0000000..1e94111 --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFSQueueMetrics.java @@ -0,0 +1,69 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.metrics2.MetricsSource; +import org.apache.hadoop.metrics2.MetricsSystem; +import org.apache.hadoop.metrics2.impl.MetricsCollectorImpl; +import org.apache.hadoop.metrics2.impl.MetricsRecords; +import org.apache.hadoop.metrics2.impl.MetricsSystemImpl; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetrics; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.TestQueueMetrics; +import org.junit.Before; +import org.junit.Test; + +/** + * The test class for {@link FSQueueMetrics}. + */ +public class TestFSQueueMetrics { + private static final Configuration conf = new Configuration(); + + private MetricsSystem ms; + + @Before public void setUp() { + ms = new MetricsSystemImpl(); + QueueMetrics.clearQueueMetrics(); + } + + /** + * Test if the metric scheduling policy is set correctly. + */ + @Test + public void testSchedulingPolicy() { + String queueName = "single"; + + FSQueueMetrics metrics = FSQueueMetrics.forQueue(ms, queueName, null, false, + conf); + metrics.setSchedulingPolicy("drf"); + checkSchedulingPolicy(queueName, "drf"); + + // test resetting the scheduling policy + metrics.setSchedulingPolicy("fair"); + checkSchedulingPolicy(queueName, "fair"); + } + + private void checkSchedulingPolicy(String queueName, String policy) { + MetricsSource queueSource = TestQueueMetrics.queueSource(ms, queueName); + MetricsCollectorImpl collector = new MetricsCollectorImpl(); + queueSource.getMetrics(collector, true); + MetricsRecords.assertTag(collector.getRecords().get(0), "SchedulingPolicy", + policy); + } +}