diff --git hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSystemImpl.java hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSystemImpl.java index 2224d81..259d329 100644 --- hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSystemImpl.java +++ hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSystemImpl.java @@ -381,7 +381,7 @@ synchronized MetricsBuffer sampleMetrics() { private void snapshotMetrics(MetricsSourceAdapter sa, MetricsBufferBuilder bufferBuilder) { long startTime = Time.now(); - bufferBuilder.add(sa.name(), sa.getMetrics(collector, false)); + bufferBuilder.add(sa.name(), sa.getMetrics(collector, true)); collector.clear(); snapshotStat.add(Time.now() - startTime); LOG.debug("Snapshotted source "+ sa.name()); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java 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 b9ffc26..9d2c739 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java @@ -126,18 +126,6 @@ static QueueMetrics forQueue(String queueName, Queue parent, enableUserMetrics, conf); } - // this method is here because we want to make sure these metrics show up on - // queue registration. - public void initMetrics() { - appsSubmitted.incr(0); - appsRunning.incr(0); - appsPending.incr(0); - appsCompleted.incr(0); - appsKilled.incr(0); - appsFailed.incr(0); - reservedContainers.incr(0); - } - /** * Helper method to clear cache - used only for unit tests. */ @@ -168,7 +156,6 @@ static QueueMetrics forQueue(MetricsSystem ms, String queueName, ms.register( sourceName(queueName).toString(), "Metrics for queue: " + queueName, metrics); - metrics.initMetrics(); } queueMetrics.put(queueName, metrics); } 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 857f025..6305a6c 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 @@ -94,7 +94,6 @@ static FSQueueMetrics forQueue(String queueName, Queue parent, metrics = ms.register( sourceName(queueName).toString(), "Metrics for queue: " + queueName, metrics); - metrics.initMetrics(); } queueMetrics.put(queueName, 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/TestQueueMetrics.java 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 d1d1f35..b3702ad 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetrics.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetrics.java @@ -68,7 +68,7 @@ public void setUp() { metrics.submitApp(user, 1); MetricsSource userSource = userSource(ms, queueName, user); - checkApps(queueSource, 1, 1, 0, 0, 0, 0); + checkApps(queueSource, 1, 1, 0, 0, 0, 0, true); metrics.setAvailableResourcesToQueue(Resources.createResource(100*GB, 100)); metrics.incrPendingResources(user, 5, Resources.createResource(15*GB, 15)); @@ -77,7 +77,7 @@ public void setUp() { checkResources(queueSource, 0, 0, 0, 0, 0, 100*GB, 100, 15*GB, 15, 5, 0, 0, 0); metrics.incrAppsRunning(app, user); - checkApps(queueSource, 1, 0, 1, 0, 0, 0); + checkApps(queueSource, 1, 0, 1, 0, 0, 0, true); metrics.allocateResources(user, 3, Resources.createResource(2*GB, 2)); checkResources(queueSource, 6*GB, 6, 3, 3, 0, 100*GB, 100, 9*GB, 9, 2, 0, 0, 0); @@ -86,7 +86,7 @@ public void setUp() { checkResources(queueSource, 4*GB, 4, 2, 3, 1, 100*GB, 100, 9*GB, 9, 2, 0, 0, 0); metrics.finishApp(app, RMAppAttemptState.FINISHED); - checkApps(queueSource, 1, 0, 0, 1, 0, 0); + checkApps(queueSource, 1, 0, 0, 1, 0, 0, true); assertNull(userSource); } @@ -102,37 +102,37 @@ public void testQueueAppMetricsForMultipleFailures() { metrics.submitApp(user, 1); MetricsSource userSource = userSource(ms, queueName, user); - checkApps(queueSource, 1, 1, 0, 0, 0, 0); + checkApps(queueSource, 1, 1, 0, 0, 0, 0, true); metrics.incrAppsRunning(app, user); - checkApps(queueSource, 1, 0, 1, 0, 0, 0); + checkApps(queueSource, 1, 0, 1, 0, 0, 0, true); metrics.finishApp(app, RMAppAttemptState.FAILED); - checkApps(queueSource, 1, 0, 0, 0, 1, 0); + checkApps(queueSource, 1, 0, 0, 0, 1, 0, true); // As the application has failed, framework retries the same application // based on configuration metrics.submitApp(user, 2); - checkApps(queueSource, 1, 1, 0, 0, 0, 0); + checkApps(queueSource, 1, 1, 0, 0, 0, 0, true); metrics.incrAppsRunning(app, user); - checkApps(queueSource, 1, 0, 1, 0, 0, 0); + checkApps(queueSource, 1, 0, 1, 0, 0, 0, true); // Suppose say application has failed this time as well. metrics.finishApp(app, RMAppAttemptState.FAILED); - checkApps(queueSource, 1, 0, 0, 0, 1, 0); + checkApps(queueSource, 1, 0, 0, 0, 1, 0, true); // As the application has failed, framework retries the same application // based on configuration metrics.submitApp(user, 3); - checkApps(queueSource, 1, 1, 0, 0, 0, 0); + checkApps(queueSource, 1, 1, 0, 0, 0, 0, true); metrics.incrAppsRunning(app, user); - checkApps(queueSource, 1, 0, 1, 0, 0, 0); + checkApps(queueSource, 1, 0, 1, 0, 0, 0, true); // Suppose say application has finished. metrics.finishApp(app, RMAppAttemptState.FINISHED); - checkApps(queueSource, 1, 0, 0, 1, 0, 0); + checkApps(queueSource, 1, 0, 0, 1, 0, 0, true); assertNull(userSource); } @@ -149,8 +149,8 @@ public void testQueueAppMetricsForMultipleFailures() { metrics.submitApp(user, 1); MetricsSource userSource = userSource(ms, queueName, user); - checkApps(queueSource, 1, 1, 0, 0, 0, 0); - checkApps(userSource, 1, 1, 0, 0, 0, 0); + checkApps(queueSource, 1, 1, 0, 0, 0, 0, true); + checkApps(userSource, 1, 1, 0, 0, 0, 0, true); metrics.setAvailableResourcesToQueue(Resources.createResource(100*GB, 100)); metrics.setAvailableResourcesToUser(user, Resources.createResource(10*GB, 10)); @@ -161,8 +161,8 @@ public void testQueueAppMetricsForMultipleFailures() { checkResources(userSource, 0, 0, 0, 0, 0, 10*GB, 10, 15*GB, 15, 5, 0, 0, 0); metrics.incrAppsRunning(app, user); - checkApps(queueSource, 1, 0, 1, 0, 0, 0); - checkApps(userSource, 1, 0, 1, 0, 0, 0); + checkApps(queueSource, 1, 0, 1, 0, 0, 0, true); + checkApps(userSource, 1, 0, 1, 0, 0, 0, true); metrics.allocateResources(user, 3, Resources.createResource(2*GB, 2)); checkResources(queueSource, 6*GB, 6, 3, 3, 0, 100*GB, 100, 9*GB, 9, 2, 0, 0, 0); @@ -173,8 +173,8 @@ public void testQueueAppMetricsForMultipleFailures() { checkResources(userSource, 4*GB, 4, 2, 3, 1, 10*GB, 10, 9*GB, 9, 2, 0, 0, 0); metrics.finishApp(app, RMAppAttemptState.FINISHED); - checkApps(queueSource, 1, 0, 0, 1, 0, 0); - checkApps(userSource, 1, 0, 0, 1, 0, 0); + checkApps(queueSource, 1, 0, 0, 1, 0, 0, true); + checkApps(userSource, 1, 0, 0, 1, 0, 0, true); } @Test public void testTwoLevelWithUserMetrics() { @@ -196,10 +196,10 @@ public void testQueueAppMetricsForMultipleFailures() { MetricsSource userSource = userSource(ms, leafQueueName, user); MetricsSource parentUserSource = userSource(ms, parentQueueName, user); - checkApps(queueSource, 1, 1, 0, 0, 0, 0); - checkApps(parentQueueSource, 1, 1, 0, 0, 0, 0); - checkApps(userSource, 1, 1, 0, 0, 0, 0); - checkApps(parentUserSource, 1, 1, 0, 0, 0, 0); + checkApps(queueSource, 1, 1, 0, 0, 0, 0, true); + checkApps(parentQueueSource, 1, 1, 0, 0, 0, 0, true); + checkApps(userSource, 1, 1, 0, 0, 0, 0, true); + checkApps(parentUserSource, 1, 1, 0, 0, 0, 0, true); parentMetrics.setAvailableResourcesToQueue(Resources.createResource(100*GB, 100)); metrics.setAvailableResourcesToQueue(Resources.createResource(100*GB, 100)); @@ -212,8 +212,8 @@ public void testQueueAppMetricsForMultipleFailures() { checkResources(parentUserSource, 0, 0, 0, 0, 0, 10*GB, 10, 15*GB, 15, 5, 0, 0, 0); metrics.incrAppsRunning(app, user); - checkApps(queueSource, 1, 0, 1, 0, 0, 0); - checkApps(userSource, 1, 0, 1, 0, 0, 0); + checkApps(queueSource, 1, 0, 1, 0, 0, 0, true); + checkApps(userSource, 1, 0, 1, 0, 0, 0, true); metrics.allocateResources(user, 3, Resources.createResource(2*GB, 2)); metrics.reserveResource(user, Resources.createResource(3*GB, 3)); @@ -232,10 +232,10 @@ public void testQueueAppMetricsForMultipleFailures() { checkResources(parentUserSource, 4*GB, 4, 2, 3, 1, 10*GB, 10, 9*GB, 9, 2, 0, 0, 0); metrics.finishApp(app, RMAppAttemptState.FINISHED); - checkApps(queueSource, 1, 0, 0, 1, 0, 0); - checkApps(parentQueueSource, 1, 0, 0, 1, 0, 0); - checkApps(userSource, 1, 0, 0, 1, 0, 0); - checkApps(parentUserSource, 1, 0, 0, 1, 0, 0); + checkApps(queueSource, 1, 0, 0, 1, 0, 0, true); + checkApps(parentQueueSource, 1, 0, 0, 1, 0, 0, true); + checkApps(userSource, 1, 0, 0, 1, 0, 0, true); + checkApps(parentUserSource, 1, 0, 0, 1, 0, 0, true); } @Test @@ -275,13 +275,35 @@ public void testMetricsInitializedOnRMInit() { FifoScheduler.class, ResourceScheduler.class); MockRM rm = new MockRM(conf); QueueMetrics metrics = rm.getResourceScheduler().getRootQueueMetrics(); - checkApps(metrics, 0, 0, 0, 0, 0, 0); + checkApps(metrics, 0, 0, 0, 0, 0, 0, true); MetricsAsserts.assertGauge("ReservedContainers", 0, metrics); } + // This is to test all metrics can consistently show up if specified true to + // collect all metrics, even though they are not modified from last time they + // are collected. If not collecting all metrics, only modified metrics will show up. + @Test + public void testCollectAllMetrics() { + String queueName = "single"; + QueueMetrics.forQueue(ms, queueName, null, false, conf); + MetricsSource queueSource = queueSource(ms, queueName); + + checkApps(queueSource, 0, 0, 0, 0, 0, 0, true); + try { + // do not collect all metrics + checkApps(queueSource, 0, 0, 0, 0, 0, 0, false); + Assert.fail(); + } catch (AssertionError e) { + Assert.assertTrue(e.getMessage().contains( + "Expected exactly one metric for name ")); + } + // collect all metrics + checkApps(queueSource, 0, 0, 0, 0, 0, 0, true); + } + public static void checkApps(MetricsSource source, int submitted, int pending, - int running, int completed, int failed, int killed) { - MetricsRecordBuilder rb = getMetrics(source); + int running, int completed, int failed, int killed, boolean all) { + MetricsRecordBuilder rb = getMetrics(source, all); assertCounter("AppsSubmitted", submitted, rb); assertGauge("AppsPending", pending, rb); assertGauge("AppsRunning", running, rb);