| /** |
| * 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.webapp; |
| |
| import org.apache.hadoop.util.StringUtils; |
| import org.apache.hadoop.yarn.server.resourcemanager.RMContext; |
| import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager; |
| import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ClusterMetricsInfo; |
| import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.UserMetricsInfo; |
| |
| import org.apache.hadoop.yarn.webapp.hamlet.Hamlet; |
| import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.DIV; |
| import org.apache.hadoop.yarn.webapp.view.HtmlBlock; |
| |
| import com.google.inject.Inject; |
| |
| /** |
| * Provides an table with an overview of many cluster wide metrics and if |
| * per user metrics are enabled it will show an overview of what the |
| * current user is using on the cluster. |
| */ |
| public class MetricsOverviewTable extends HtmlBlock { |
| private static final long BYTES_IN_MB = 1024 * 1024; |
| |
| private final RMContext rmContext; |
| private final ResourceManager rm; |
| |
| @Inject |
| MetricsOverviewTable(RMContext context, ResourceManager rm, ViewContext ctx) { |
| super(ctx); |
| this.rmContext = context; |
| this.rm = rm; |
| } |
| |
| |
| @Override |
| protected void render(Block html) { |
| //Yes this is a hack, but there is no other way to insert |
| //CSS in the correct spot |
| html.style(".metrics {margin-bottom:5px}"); |
| |
| ClusterMetricsInfo clusterMetrics = |
| new ClusterMetricsInfo(this.rm, this.rmContext); |
| |
| DIV<Hamlet> div = html.div().$class("metrics"); |
| |
| div.h3("Cluster Metrics"). |
| table("#metricsoverview"). |
| thead().$class("ui-widget-header"). |
| tr(). |
| th().$class("ui-state-default")._("Apps Submitted")._(). |
| th().$class("ui-state-default")._("Apps Pending")._(). |
| th().$class("ui-state-default")._("Apps Running")._(). |
| th().$class("ui-state-default")._("Apps Completed")._(). |
| th().$class("ui-state-default")._("Containers Running")._(). |
| th().$class("ui-state-default")._("Memory Used")._(). |
| th().$class("ui-state-default")._("Memory Total")._(). |
| th().$class("ui-state-default")._("Memory Reserved")._(). |
| th().$class("ui-state-default")._("Active Nodes")._(). |
| th().$class("ui-state-default")._("Decommissioned Nodes")._(). |
| th().$class("ui-state-default")._("Lost Nodes")._(). |
| th().$class("ui-state-default")._("Unhealthy Nodes")._(). |
| th().$class("ui-state-default")._("Rebooted Nodes")._(). |
| _(). |
| _(). |
| tbody().$class("ui-widget-content"). |
| tr(). |
| td(String.valueOf(clusterMetrics.getAppsSubmitted())). |
| td(String.valueOf(clusterMetrics.getAppsPending())). |
| td(String.valueOf(clusterMetrics.getAppsRunning())). |
| td( |
| String.valueOf( |
| clusterMetrics.getAppsCompleted() + |
| clusterMetrics.getAppsFailed() + clusterMetrics.getAppsKilled() |
| ) |
| ). |
| td(String.valueOf(clusterMetrics.getContainersAllocated())). |
| td(StringUtils.byteDesc(clusterMetrics.getAllocatedMB() * BYTES_IN_MB)). |
| td(StringUtils.byteDesc(clusterMetrics.getTotalMB() * BYTES_IN_MB)). |
| td(StringUtils.byteDesc(clusterMetrics.getReservedMB() * BYTES_IN_MB)). |
| td().a(url("nodes"),String.valueOf(clusterMetrics.getActiveNodes()))._(). |
| td().a(url("nodes/decommissioned"),String.valueOf(clusterMetrics.getDecommissionedNodes()))._(). |
| td().a(url("nodes/lost"),String.valueOf(clusterMetrics.getLostNodes()))._(). |
| td().a(url("nodes/unhealthy"),String.valueOf(clusterMetrics.getUnhealthyNodes()))._(). |
| td().a(url("nodes/rebooted"),String.valueOf(clusterMetrics.getRebootedNodes()))._(). |
| _(). |
| _()._(); |
| |
| String user = request().getRemoteUser(); |
| if (user != null) { |
| UserMetricsInfo userMetrics = new UserMetricsInfo(this.rm, this.rmContext, user); |
| if (userMetrics.metricsAvailable()) { |
| div.h3("User Metrics for " + user). |
| table("#usermetricsoverview"). |
| thead().$class("ui-widget-header"). |
| tr(). |
| th().$class("ui-state-default")._("Apps Submitted")._(). |
| th().$class("ui-state-default")._("Apps Pending")._(). |
| th().$class("ui-state-default")._("Apps Running")._(). |
| th().$class("ui-state-default")._("Apps Completed")._(). |
| th().$class("ui-state-default")._("Containers Running")._(). |
| th().$class("ui-state-default")._("Containers Pending")._(). |
| th().$class("ui-state-default")._("Containers Reserved")._(). |
| th().$class("ui-state-default")._("Memory Used")._(). |
| th().$class("ui-state-default")._("Memory Pending")._(). |
| th().$class("ui-state-default")._("Memory Reserved")._(). |
| _(). |
| _(). |
| tbody().$class("ui-widget-content"). |
| tr(). |
| td(String.valueOf(userMetrics.getAppsSubmitted())). |
| td(String.valueOf(userMetrics.getAppsPending())). |
| td(String.valueOf(userMetrics.getAppsRunning())). |
| td( |
| String.valueOf( |
| (userMetrics.getAppsCompleted() + |
| userMetrics.getAppsFailed() + userMetrics.getAppsKilled()) |
| ) |
| ). |
| td(String.valueOf(userMetrics.getRunningContainers())). |
| td(String.valueOf(userMetrics.getPendingContainers())). |
| td(String.valueOf(userMetrics.getReservedContainers())). |
| td(StringUtils.byteDesc(userMetrics.getAllocatedMB() * BYTES_IN_MB)). |
| td(StringUtils.byteDesc(userMetrics.getPendingMB() * BYTES_IN_MB)). |
| td(StringUtils.byteDesc(userMetrics.getReservedMB() * BYTES_IN_MB)). |
| _(). |
| _()._(); |
| |
| } |
| } |
| |
| div._(); |
| } |
| } |