Repository: incubator-slider Updated Branches: refs/heads/develop c9c7eeeac -> 63b5c83ff
SLIDER-1210 Expose diagnostics information as a summary table in AM UI landing page as well Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/63b5c83f Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/63b5c83f Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/63b5c83f Branch: refs/heads/develop Commit: 63b5c83ff42479833e3013a2b8436a2af2a24143 Parents: c9c7eee Author: Gour Saha <gourks...@apache.org> Authored: Thu Feb 16 20:08:13 2017 -0800 Committer: Gour Saha <gourks...@apache.org> Committed: Thu Feb 16 20:08:13 2017 -0800 ---------------------------------------------------------------------- .../slider/api/types/ContainerInformation.java | 14 ++++++ .../server/appmaster/web/view/IndexBlock.java | 45 +++++++++++++++++--- .../src/main/resources/webapps/static/yarn.css | 2 + 3 files changed, 56 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/63b5c83f/slider-core/src/main/java/org/apache/slider/api/types/ContainerInformation.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/api/types/ContainerInformation.java b/slider-core/src/main/java/org/apache/slider/api/types/ContainerInformation.java index 25ef310..3b5b590 100644 --- a/slider-core/src/main/java/org/apache/slider/api/types/ContainerInformation.java +++ b/slider-core/src/main/java/org/apache/slider/api/types/ContainerInformation.java @@ -18,6 +18,9 @@ package org.apache.slider.api.types; +import java.io.Serializable; +import java.util.Comparator; + import org.apache.hadoop.registry.client.binding.JsonSerDeser; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.map.annotate.JsonSerialize; @@ -143,4 +146,15 @@ public class ContainerInformation { ContainerInformation.class); return serDeser.toString(this); } + + /** + * Compare two containers by their ids. + */ + public static class CompareById implements Comparator<ContainerInformation>, + Serializable { + @Override + public int compare(ContainerInformation c1, ContainerInformation c2) { + return c1.getContainerId().compareTo(c2.getContainerId()); + } + } } http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/63b5c83f/slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/IndexBlock.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/IndexBlock.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/IndexBlock.java index c3b9b6f..3d9dbaf 100644 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/IndexBlock.java +++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/view/IndexBlock.java @@ -24,8 +24,9 @@ import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.LI; import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.UL; import org.apache.slider.api.ClusterDescription; import org.apache.slider.api.StatusKeys; +import org.apache.slider.api.types.ApplicationDiagnostics; import org.apache.slider.api.types.ApplicationLivenessInformation; -import org.apache.slider.api.types.RoleStatistics; +import org.apache.slider.api.types.ContainerInformation; import org.apache.slider.common.tools.SliderUtils; import org.apache.slider.core.registry.docstore.ExportEntry; import org.apache.slider.core.registry.docstore.PublishedExports; @@ -183,10 +184,6 @@ public class IndexBlock extends SliderHamletBlock { containers._(); containers = null; - // some spacing - html.div()._(); - html.div()._(); - DIV<Hamlet> diagnostics = html.div("diagnostics"); List<String> statusEntries = new ArrayList<>(0); @@ -228,6 +225,44 @@ public class IndexBlock extends SliderHamletBlock { enumeratePublishedExports(appState.getPublishedExportsSet(), ul); ul._(); exports._(); + + DIV<Hamlet> appDiagnosticsDiv = html.div("app_diagnostics") + .h3("Application Container Diagnostics"); + + Hamlet.TABLE<DIV<Hamlet>> appDiagnosticsTable = appDiagnosticsDiv.table(); + Hamlet.TR<Hamlet.THEAD<Hamlet.TABLE<DIV<Hamlet>>>> appDiagnosticsHeader = + appDiagnosticsTable.thead().tr(); + trb(appDiagnosticsHeader, "Container ID"); + trb(appDiagnosticsHeader, "Component"); + trb(appDiagnosticsHeader, "State"); + trb(appDiagnosticsHeader, "Exit Code"); + trb(appDiagnosticsHeader, "Logs"); + trb(appDiagnosticsHeader, "Diagnostics"); + appDiagnosticsHeader._()._(); // tr & thread + + ApplicationDiagnostics appDiagnostics = appState + .getApplicationDiagnostics(); + List<ContainerInformation> appContainers = new ArrayList<>( + appDiagnostics.getContainers()); + Collections.sort(appContainers, new ContainerInformation.CompareById()); + for (ContainerInformation appContainer : appContainers) { + String diagText = String.format("%s", + appContainer.getDiagnostics() == null ? "" + : appContainer.getDiagnostics()); + appDiagnosticsTable.tr() + .td(appContainer.getContainerId()) + .td(appContainer.getComponent()) + .td(String.format("%d", appContainer.getState())) + .td(String.format("%d", appContainer.getExitCode())) + .td().a(appContainer.getLogLink(), "Logs")._() + .td(diagText) + ._(); + } + + // close table and div + appDiagnosticsTable._(); + appDiagnosticsDiv._(); + appDiagnosticsDiv = null; } @VisibleForTesting http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/63b5c83f/slider-core/src/main/resources/webapps/static/yarn.css ---------------------------------------------------------------------- diff --git a/slider-core/src/main/resources/webapps/static/yarn.css b/slider-core/src/main/resources/webapps/static/yarn.css index 1e9ca94..7f9f862 100644 --- a/slider-core/src/main/resources/webapps/static/yarn.css +++ b/slider-core/src/main/resources/webapps/static/yarn.css @@ -61,5 +61,7 @@ div.general_info { margin-bottom: 15px; } div.container_instances { margin-bottom: 15px; } div.diagnostics { margin-bottom: 15px; } div.provider_info { margin-bottom: 15px; } +div.exports { margin-bottom: 15px; } +div.app_diagnostics { margin-bottom: 15px; } div.cluster_json pre { white-space: pre-wrap; }