You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by va...@apache.org on 2018/05/22 01:11:11 UTC
spark git commit: [SPARK-24209][SHS] Automatic retrieve proxyBase
from Knox headers
Repository: spark
Updated Branches:
refs/heads/master 32447079e -> 84d31aa5d
[SPARK-24209][SHS] Automatic retrieve proxyBase from Knox headers
## What changes were proposed in this pull request?
The PR retrieves the proxyBase automatically from the header `X-Forwarded-Context` (if available). This is the header used by Knox to inform the proxied service about the base path.
This provides 0-configuration support for Knox gateway (instead of having to properly set `spark.ui.proxyBase`) and it allows to access directly SHS when it is proxied by Knox. In the previous scenario, indeed, after setting `spark.ui.proxyBase`, direct access to SHS was not working fine (due to bad link generated).
## How was this patch tested?
added UT + manual tests
Author: Marco Gaido <ma...@gmail.com>
Closes #21268 from mgaido91/SPARK-24209.
Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/84d31aa5
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/84d31aa5
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/84d31aa5
Branch: refs/heads/master
Commit: 84d31aa5d453620d462f1fdd90206c676a8395cd
Parents: 3244707
Author: Marco Gaido <ma...@gmail.com>
Authored: Mon May 21 18:11:05 2018 -0700
Committer: Marcelo Vanzin <va...@cloudera.com>
Committed: Mon May 21 18:11:05 2018 -0700
----------------------------------------------------------------------
.../spark/deploy/history/HistoryPage.scala | 17 +--
.../spark/deploy/history/HistoryServer.scala | 2 +-
.../deploy/master/ui/ApplicationPage.scala | 4 +-
.../spark/deploy/master/ui/MasterPage.scala | 2 +-
.../apache/spark/deploy/worker/ui/LogPage.scala | 2 +-
.../spark/deploy/worker/ui/WorkerPage.scala | 2 +-
.../scala/org/apache/spark/ui/UIUtils.scala | 109 +++++++++++--------
.../apache/spark/ui/env/EnvironmentPage.scala | 2 +-
.../spark/ui/exec/ExecutorThreadDumpPage.scala | 2 +-
.../org/apache/spark/ui/exec/ExecutorsTab.scala | 6 +-
.../org/apache/spark/ui/jobs/AllJobsPage.scala | 4 +-
.../apache/spark/ui/jobs/AllStagesPage.scala | 4 +-
.../org/apache/spark/ui/jobs/JobPage.scala | 5 +-
.../org/apache/spark/ui/jobs/PoolPage.scala | 4 +-
.../org/apache/spark/ui/jobs/PoolTable.scala | 9 +-
.../org/apache/spark/ui/jobs/StagePage.scala | 8 +-
.../org/apache/spark/ui/jobs/StageTable.scala | 12 +-
.../org/apache/spark/ui/storage/RDDPage.scala | 7 +-
.../apache/spark/ui/storage/StoragePage.scala | 20 +++-
.../deploy/history/HistoryServerSuite.scala | 24 ++++
.../spark/ui/storage/StoragePageSuite.scala | 7 +-
.../spark/deploy/mesos/ui/DriverPage.scala | 6 +-
.../deploy/mesos/ui/MesosClusterPage.scala | 2 +-
.../sql/execution/ui/AllExecutionsPage.scala | 38 ++++---
.../spark/sql/execution/ui/ExecutionPage.scala | 30 ++---
.../hive/thriftserver/ui/ThriftServerPage.scala | 17 +--
.../ui/ThriftServerSessionPage.scala | 9 +-
.../apache/spark/streaming/ui/BatchPage.scala | 21 +++-
.../spark/streaming/ui/StreamingPage.scala | 12 +-
29 files changed, 232 insertions(+), 155 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/deploy/history/HistoryPage.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/deploy/history/HistoryPage.scala b/core/src/main/scala/org/apache/spark/deploy/history/HistoryPage.scala
index 6fc12d7..32667dd 100644
--- a/core/src/main/scala/org/apache/spark/deploy/history/HistoryPage.scala
+++ b/core/src/main/scala/org/apache/spark/deploy/history/HistoryPage.scala
@@ -37,8 +37,8 @@ private[history] class HistoryPage(parent: HistoryServer) extends WebUIPage("")
val lastUpdatedTime = parent.getLastUpdatedTime()
val providerConfig = parent.getProviderConfig()
val content =
- <script src={UIUtils.prependBaseUri("/static/historypage-common.js")}></script> ++
- <script src={UIUtils.prependBaseUri("/static/utils.js")}></script>
+ <script src={UIUtils.prependBaseUri(request, "/static/historypage-common.js")}></script> ++
+ <script src={UIUtils.prependBaseUri(request, "/static/utils.js")}></script>
<div>
<div class="container-fluid">
<ul class="unstyled">
@@ -64,9 +64,10 @@ private[history] class HistoryPage(parent: HistoryServer) extends WebUIPage("")
{
if (allAppsSize > 0) {
- <script src={UIUtils.prependBaseUri("/static/dataTables.rowsGroup.js")}></script> ++
+ <script src={UIUtils.prependBaseUri(
+ request, "/static/dataTables.rowsGroup.js")}></script> ++
<div id="history-summary" class="row-fluid"></div> ++
- <script src={UIUtils.prependBaseUri("/static/historypage.js")}></script> ++
+ <script src={UIUtils.prependBaseUri(request, "/static/historypage.js")}></script> ++
<script>setAppLimit({parent.maxApplications})</script>
} else if (requestedIncomplete) {
<h4>No incomplete applications found!</h4>
@@ -77,7 +78,7 @@ private[history] class HistoryPage(parent: HistoryServer) extends WebUIPage("")
}
}
- <a href={makePageLink(!requestedIncomplete)}>
+ <a href={makePageLink(request, !requestedIncomplete)}>
{
if (requestedIncomplete) {
"Back to completed applications"
@@ -88,11 +89,11 @@ private[history] class HistoryPage(parent: HistoryServer) extends WebUIPage("")
</a>
</div>
</div>
- UIUtils.basicSparkPage(content, "History Server", true)
+ UIUtils.basicSparkPage(request, content, "History Server", true)
}
- private def makePageLink(showIncomplete: Boolean): String = {
- UIUtils.prependBaseUri("/?" + "showIncomplete=" + showIncomplete)
+ private def makePageLink(request: HttpServletRequest, showIncomplete: Boolean): String = {
+ UIUtils.prependBaseUri(request, "/?" + "showIncomplete=" + showIncomplete)
}
private def isApplicationCompleted(appInfo: ApplicationInfo): Boolean = {
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/deploy/history/HistoryServer.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/deploy/history/HistoryServer.scala b/core/src/main/scala/org/apache/spark/deploy/history/HistoryServer.scala
index 611fa56..a9a4d5a 100644
--- a/core/src/main/scala/org/apache/spark/deploy/history/HistoryServer.scala
+++ b/core/src/main/scala/org/apache/spark/deploy/history/HistoryServer.scala
@@ -87,7 +87,7 @@ class HistoryServer(
if (!loadAppUi(appId, None) && (!attemptId.isDefined || !loadAppUi(appId, attemptId))) {
val msg = <div class="row-fluid">Application {appId} not found.</div>
res.setStatus(HttpServletResponse.SC_NOT_FOUND)
- UIUtils.basicSparkPage(msg, "Not Found").foreach { n =>
+ UIUtils.basicSparkPage(req, msg, "Not Found").foreach { n =>
res.getWriter().write(n.toString)
}
return
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/deploy/master/ui/ApplicationPage.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/deploy/master/ui/ApplicationPage.scala b/core/src/main/scala/org/apache/spark/deploy/master/ui/ApplicationPage.scala
index f699c75..fad4e46 100644
--- a/core/src/main/scala/org/apache/spark/deploy/master/ui/ApplicationPage.scala
+++ b/core/src/main/scala/org/apache/spark/deploy/master/ui/ApplicationPage.scala
@@ -40,7 +40,7 @@ private[ui] class ApplicationPage(parent: MasterWebUI) extends WebUIPage("app")
.getOrElse(state.completedApps.find(_.id == appId).orNull)
if (app == null) {
val msg = <div class="row-fluid">No running application with ID {appId}</div>
- return UIUtils.basicSparkPage(msg, "Not Found")
+ return UIUtils.basicSparkPage(request, msg, "Not Found")
}
val executorHeaders = Seq("ExecutorID", "Worker", "Cores", "Memory", "State", "Logs")
@@ -127,7 +127,7 @@ private[ui] class ApplicationPage(parent: MasterWebUI) extends WebUIPage("app")
}
</div>
</div>;
- UIUtils.basicSparkPage(content, "Application: " + app.desc.name)
+ UIUtils.basicSparkPage(request, content, "Application: " + app.desc.name)
}
private def executorRow(executor: ExecutorDesc): Seq[Node] = {
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/deploy/master/ui/MasterPage.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/deploy/master/ui/MasterPage.scala b/core/src/main/scala/org/apache/spark/deploy/master/ui/MasterPage.scala
index c629937..b8afe20 100644
--- a/core/src/main/scala/org/apache/spark/deploy/master/ui/MasterPage.scala
+++ b/core/src/main/scala/org/apache/spark/deploy/master/ui/MasterPage.scala
@@ -215,7 +215,7 @@ private[ui] class MasterPage(parent: MasterWebUI) extends WebUIPage("") {
}
</div>;
- UIUtils.basicSparkPage(content, "Spark Master at " + state.uri)
+ UIUtils.basicSparkPage(request, content, "Spark Master at " + state.uri)
}
private def workerRow(worker: WorkerInfo): Seq[Node] = {
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/deploy/worker/ui/LogPage.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/deploy/worker/ui/LogPage.scala b/core/src/main/scala/org/apache/spark/deploy/worker/ui/LogPage.scala
index 2f5a564..4fca934 100644
--- a/core/src/main/scala/org/apache/spark/deploy/worker/ui/LogPage.scala
+++ b/core/src/main/scala/org/apache/spark/deploy/worker/ui/LogPage.scala
@@ -118,7 +118,7 @@ private[ui] class LogPage(parent: WorkerWebUI) extends WebUIPage("logPage") with
<script>{Unparsed(jsOnload)}</script>
</div>
- UIUtils.basicSparkPage(content, logType + " log page for " + pageName)
+ UIUtils.basicSparkPage(request, content, logType + " log page for " + pageName)
}
/** Get the part of the log files given the offset and desired length of bytes */
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/deploy/worker/ui/WorkerPage.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/deploy/worker/ui/WorkerPage.scala b/core/src/main/scala/org/apache/spark/deploy/worker/ui/WorkerPage.scala
index 8b98ae5..aa4e28d 100644
--- a/core/src/main/scala/org/apache/spark/deploy/worker/ui/WorkerPage.scala
+++ b/core/src/main/scala/org/apache/spark/deploy/worker/ui/WorkerPage.scala
@@ -135,7 +135,7 @@ private[ui] class WorkerPage(parent: WorkerWebUI) extends WebUIPage("") {
}
</div>
</div>;
- UIUtils.basicSparkPage(content, "Spark Worker at %s:%s".format(
+ UIUtils.basicSparkPage(request, content, "Spark Worker at %s:%s".format(
workerState.host, workerState.port))
}
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/ui/UIUtils.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/ui/UIUtils.scala b/core/src/main/scala/org/apache/spark/ui/UIUtils.scala
index 02cf19e..5d015b0 100644
--- a/core/src/main/scala/org/apache/spark/ui/UIUtils.scala
+++ b/core/src/main/scala/org/apache/spark/ui/UIUtils.scala
@@ -20,6 +20,7 @@ package org.apache.spark.ui
import java.net.URLDecoder
import java.text.SimpleDateFormat
import java.util.{Date, Locale, TimeZone}
+import javax.servlet.http.HttpServletRequest
import scala.util.control.NonFatal
import scala.xml._
@@ -148,60 +149,71 @@ private[spark] object UIUtils extends Logging {
}
// Yarn has to go through a proxy so the base uri is provided and has to be on all links
- def uiRoot: String = {
+ def uiRoot(request: HttpServletRequest): String = {
+ // Knox uses X-Forwarded-Context to notify the application the base path
+ val knoxBasePath = Option(request.getHeader("X-Forwarded-Context"))
// SPARK-11484 - Use the proxyBase set by the AM, if not found then use env.
sys.props.get("spark.ui.proxyBase")
.orElse(sys.env.get("APPLICATION_WEB_PROXY_BASE"))
+ .orElse(knoxBasePath)
.getOrElse("")
}
- def prependBaseUri(basePath: String = "", resource: String = ""): String = {
- uiRoot + basePath + resource
+ def prependBaseUri(
+ request: HttpServletRequest,
+ basePath: String = "",
+ resource: String = ""): String = {
+ uiRoot(request) + basePath + resource
}
- def commonHeaderNodes: Seq[Node] = {
+ def commonHeaderNodes(request: HttpServletRequest): Seq[Node] = {
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
- <link rel="stylesheet" href={prependBaseUri("/static/bootstrap.min.css")} type="text/css"/>
- <link rel="stylesheet" href={prependBaseUri("/static/vis.min.css")} type="text/css"/>
- <link rel="stylesheet" href={prependBaseUri("/static/webui.css")} type="text/css"/>
- <link rel="stylesheet" href={prependBaseUri("/static/timeline-view.css")} type="text/css"/>
- <script src={prependBaseUri("/static/sorttable.js")} ></script>
- <script src={prependBaseUri("/static/jquery-1.11.1.min.js")}></script>
- <script src={prependBaseUri("/static/vis.min.js")}></script>
- <script src={prependBaseUri("/static/bootstrap-tooltip.js")}></script>
- <script src={prependBaseUri("/static/initialize-tooltips.js")}></script>
- <script src={prependBaseUri("/static/table.js")}></script>
- <script src={prependBaseUri("/static/additional-metrics.js")}></script>
- <script src={prependBaseUri("/static/timeline-view.js")}></script>
- <script src={prependBaseUri("/static/log-view.js")}></script>
- <script src={prependBaseUri("/static/webui.js")}></script>
- <script>setUIRoot('{UIUtils.uiRoot}')</script>
+ <link rel="stylesheet"
+ href={prependBaseUri(request, "/static/bootstrap.min.css")} type="text/css"/>
+ <link rel="stylesheet" href={prependBaseUri(request, "/static/vis.min.css")} type="text/css"/>
+ <link rel="stylesheet" href={prependBaseUri(request, "/static/webui.css")} type="text/css"/>
+ <link rel="stylesheet"
+ href={prependBaseUri(request, "/static/timeline-view.css")} type="text/css"/>
+ <script src={prependBaseUri(request, "/static/sorttable.js")} ></script>
+ <script src={prependBaseUri(request, "/static/jquery-1.11.1.min.js")}></script>
+ <script src={prependBaseUri(request, "/static/vis.min.js")}></script>
+ <script src={prependBaseUri(request, "/static/bootstrap-tooltip.js")}></script>
+ <script src={prependBaseUri(request, "/static/initialize-tooltips.js")}></script>
+ <script src={prependBaseUri(request, "/static/table.js")}></script>
+ <script src={prependBaseUri(request, "/static/additional-metrics.js")}></script>
+ <script src={prependBaseUri(request, "/static/timeline-view.js")}></script>
+ <script src={prependBaseUri(request, "/static/log-view.js")}></script>
+ <script src={prependBaseUri(request, "/static/webui.js")}></script>
+ <script>setUIRoot('{UIUtils.uiRoot(request)}')</script>
}
- def vizHeaderNodes: Seq[Node] = {
- <link rel="stylesheet" href={prependBaseUri("/static/spark-dag-viz.css")} type="text/css" />
- <script src={prependBaseUri("/static/d3.min.js")}></script>
- <script src={prependBaseUri("/static/dagre-d3.min.js")}></script>
- <script src={prependBaseUri("/static/graphlib-dot.min.js")}></script>
- <script src={prependBaseUri("/static/spark-dag-viz.js")}></script>
+ def vizHeaderNodes(request: HttpServletRequest): Seq[Node] = {
+ <link rel="stylesheet"
+ href={prependBaseUri(request, "/static/spark-dag-viz.css")} type="text/css" />
+ <script src={prependBaseUri(request, "/static/d3.min.js")}></script>
+ <script src={prependBaseUri(request, "/static/dagre-d3.min.js")}></script>
+ <script src={prependBaseUri(request, "/static/graphlib-dot.min.js")}></script>
+ <script src={prependBaseUri(request, "/static/spark-dag-viz.js")}></script>
}
- def dataTablesHeaderNodes: Seq[Node] = {
+ def dataTablesHeaderNodes(request: HttpServletRequest): Seq[Node] = {
+ <link rel="stylesheet" href={prependBaseUri(request,
+ "/static/jquery.dataTables.1.10.4.min.css")} type="text/css"/>
<link rel="stylesheet"
- href={prependBaseUri("/static/jquery.dataTables.1.10.4.min.css")} type="text/css"/>
+ href={prependBaseUri(request, "/static/dataTables.bootstrap.css")} type="text/css"/>
<link rel="stylesheet"
- href={prependBaseUri("/static/dataTables.bootstrap.css")} type="text/css"/>
- <link rel="stylesheet" href={prependBaseUri("/static/jsonFormatter.min.css")} type="text/css"/>
- <script src={prependBaseUri("/static/jquery.dataTables.1.10.4.min.js")}></script>
- <script src={prependBaseUri("/static/jquery.cookies.2.2.0.min.js")}></script>
- <script src={prependBaseUri("/static/jquery.blockUI.min.js")}></script>
- <script src={prependBaseUri("/static/dataTables.bootstrap.min.js")}></script>
- <script src={prependBaseUri("/static/jsonFormatter.min.js")}></script>
- <script src={prependBaseUri("/static/jquery.mustache.js")}></script>
+ href={prependBaseUri(request, "/static/jsonFormatter.min.css")} type="text/css"/>
+ <script src={prependBaseUri(request, "/static/jquery.dataTables.1.10.4.min.js")}></script>
+ <script src={prependBaseUri(request, "/static/jquery.cookies.2.2.0.min.js")}></script>
+ <script src={prependBaseUri(request, "/static/jquery.blockUI.min.js")}></script>
+ <script src={prependBaseUri(request, "/static/dataTables.bootstrap.min.js")}></script>
+ <script src={prependBaseUri(request, "/static/jsonFormatter.min.js")}></script>
+ <script src={prependBaseUri(request, "/static/jquery.mustache.js")}></script>
}
/** Returns a spark page with correctly formatted headers */
def headerSparkPage(
+ request: HttpServletRequest,
title: String,
content: => Seq[Node],
activeTab: SparkUITab,
@@ -214,25 +226,26 @@ private[spark] object UIUtils extends Logging {
val shortAppName = if (appName.length < 36) appName else appName.take(32) + "..."
val header = activeTab.headerTabs.map { tab =>
<li class={if (tab == activeTab) "active" else ""}>
- <a href={prependBaseUri(activeTab.basePath, "/" + tab.prefix + "/")}>{tab.name}</a>
+ <a href={prependBaseUri(request, activeTab.basePath, "/" + tab.prefix + "/")}>{tab.name}</a>
</li>
}
val helpButton: Seq[Node] = helpText.map(tooltip(_, "bottom")).getOrElse(Seq.empty)
<html>
<head>
- {commonHeaderNodes}
- {if (showVisualization) vizHeaderNodes else Seq.empty}
- {if (useDataTables) dataTablesHeaderNodes else Seq.empty}
- <link rel="shortcut icon" href={prependBaseUri("/static/spark-logo-77x50px-hd.png")}></link>
+ {commonHeaderNodes(request)}
+ {if (showVisualization) vizHeaderNodes(request) else Seq.empty}
+ {if (useDataTables) dataTablesHeaderNodes(request) else Seq.empty}
+ <link rel="shortcut icon"
+ href={prependBaseUri(request, "/static/spark-logo-77x50px-hd.png")}></link>
<title>{appName} - {title}</title>
</head>
<body>
<div class="navbar navbar-static-top">
<div class="navbar-inner">
<div class="brand">
- <a href={prependBaseUri("/")} class="brand">
- <img src={prependBaseUri("/static/spark-logo-77x50px-hd.png")} />
+ <a href={prependBaseUri(request, "/")} class="brand">
+ <img src={prependBaseUri(request, "/static/spark-logo-77x50px-hd.png")} />
<span class="version">{activeTab.appSparkVersion}</span>
</a>
</div>
@@ -259,14 +272,16 @@ private[spark] object UIUtils extends Logging {
/** Returns a page with the spark css/js and a simple format. Used for scheduler UI. */
def basicSparkPage(
+ request: HttpServletRequest,
content: => Seq[Node],
title: String,
useDataTables: Boolean = false): Seq[Node] = {
<html>
<head>
- {commonHeaderNodes}
- {if (useDataTables) dataTablesHeaderNodes else Seq.empty}
- <link rel="shortcut icon" href={prependBaseUri("/static/spark-logo-77x50px-hd.png")}></link>
+ {commonHeaderNodes(request)}
+ {if (useDataTables) dataTablesHeaderNodes(request) else Seq.empty}
+ <link rel="shortcut icon"
+ href={prependBaseUri(request, "/static/spark-logo-77x50px-hd.png")}></link>
<title>{title}</title>
</head>
<body>
@@ -274,8 +289,8 @@ private[spark] object UIUtils extends Logging {
<div class="row-fluid">
<div class="span12">
<h3 style="vertical-align: middle; display: inline-block;">
- <a style="text-decoration: none" href={prependBaseUri("/")}>
- <img src={prependBaseUri("/static/spark-logo-77x50px-hd.png")} />
+ <a style="text-decoration: none" href={prependBaseUri(request, "/")}>
+ <img src={prependBaseUri(request, "/static/spark-logo-77x50px-hd.png")} />
<span class="version"
style="margin-right: 15px;">{org.apache.spark.SPARK_VERSION}</span>
</a>
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/ui/env/EnvironmentPage.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/ui/env/EnvironmentPage.scala b/core/src/main/scala/org/apache/spark/ui/env/EnvironmentPage.scala
index 902eb92..3d465a3 100644
--- a/core/src/main/scala/org/apache/spark/ui/env/EnvironmentPage.scala
+++ b/core/src/main/scala/org/apache/spark/ui/env/EnvironmentPage.scala
@@ -94,7 +94,7 @@ private[ui] class EnvironmentPage(
</div>
</span>
- UIUtils.headerSparkPage("Environment", content, parent)
+ UIUtils.headerSparkPage(request, "Environment", content, parent)
}
private def propertyHeader = Seq("Name", "Value")
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala
index 9bb026c..f9713fb 100644
--- a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala
+++ b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala
@@ -97,6 +97,6 @@ private[ui] class ExecutorThreadDumpPage(
</table>
</div>
}.getOrElse(Text("Error fetching thread dump"))
- UIUtils.headerSparkPage(s"Thread dump for executor $executorId", content, parent)
+ UIUtils.headerSparkPage(request, s"Thread dump for executor $executorId", content, parent)
}
}
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/ui/exec/ExecutorsTab.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorsTab.scala b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorsTab.scala
index 843486f..d5a60f5 100644
--- a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorsTab.scala
+++ b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorsTab.scala
@@ -49,12 +49,12 @@ private[ui] class ExecutorsPage(
<div>
{
<div id="active-executors" class="row-fluid"></div> ++
- <script src={UIUtils.prependBaseUri("/static/utils.js")}></script> ++
- <script src={UIUtils.prependBaseUri("/static/executorspage.js")}></script> ++
+ <script src={UIUtils.prependBaseUri(request, "/static/utils.js")}></script> ++
+ <script src={UIUtils.prependBaseUri(request, "/static/executorspage.js")}></script> ++
<script>setThreadDumpEnabled({threadDumpEnabled})</script>
}
</div>
- UIUtils.headerSparkPage("Executors", content, parent, useDataTables = true)
+ UIUtils.headerSparkPage(request, "Executors", content, parent, useDataTables = true)
}
}
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/ui/jobs/AllJobsPage.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/ui/jobs/AllJobsPage.scala b/core/src/main/scala/org/apache/spark/ui/jobs/AllJobsPage.scala
index 2b0f4ac..f651fe9 100644
--- a/core/src/main/scala/org/apache/spark/ui/jobs/AllJobsPage.scala
+++ b/core/src/main/scala/org/apache/spark/ui/jobs/AllJobsPage.scala
@@ -248,7 +248,7 @@ private[ui] class AllJobsPage(parent: JobsTab, store: AppStatusStore) extends We
jobs,
tableHeaderId,
jobTag,
- UIUtils.prependBaseUri(parent.basePath),
+ UIUtils.prependBaseUri(request, parent.basePath),
"jobs", // subPath
parameterOtherTable,
killEnabled,
@@ -407,7 +407,7 @@ private[ui] class AllJobsPage(parent: JobsTab, store: AppStatusStore) extends We
val helpText = """A job is triggered by an action, like count() or saveAsTextFile().""" +
" Click on a job to see information about the stages of tasks inside it."
- UIUtils.headerSparkPage("Spark Jobs", content, parent, helpText = Some(helpText))
+ UIUtils.headerSparkPage(request, "Spark Jobs", content, parent, helpText = Some(helpText))
}
}
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/ui/jobs/AllStagesPage.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/ui/jobs/AllStagesPage.scala b/core/src/main/scala/org/apache/spark/ui/jobs/AllStagesPage.scala
index 4658aa1..f672ce0 100644
--- a/core/src/main/scala/org/apache/spark/ui/jobs/AllStagesPage.scala
+++ b/core/src/main/scala/org/apache/spark/ui/jobs/AllStagesPage.scala
@@ -66,7 +66,7 @@ private[ui] class AllStagesPage(parent: StagesTab) extends WebUIPage("") {
</h4>
</span> ++
<div class="aggregated-poolTable collapsible-table">
- {poolTable.toNodeSeq}
+ {poolTable.toNodeSeq(request)}
</div>
} else {
Seq.empty[Node]
@@ -74,7 +74,7 @@ private[ui] class AllStagesPage(parent: StagesTab) extends WebUIPage("") {
val content = summary ++ poolsDescription ++ tables.flatten.flatten
- UIUtils.headerSparkPage("Stages for All Jobs", content, parent)
+ UIUtils.headerSparkPage(request, "Stages for All Jobs", content, parent)
}
private def summaryAndTableForStatus(
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/ui/jobs/JobPage.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/ui/jobs/JobPage.scala b/core/src/main/scala/org/apache/spark/ui/jobs/JobPage.scala
index 46f2a76..55444a2 100644
--- a/core/src/main/scala/org/apache/spark/ui/jobs/JobPage.scala
+++ b/core/src/main/scala/org/apache/spark/ui/jobs/JobPage.scala
@@ -195,7 +195,7 @@ private[ui] class JobPage(parent: JobsTab, store: AppStatusStore) extends WebUIP
<p>No information to display for job {jobId}</p>
</div>
return UIUtils.headerSparkPage(
- s"Details for Job $jobId", content, parent)
+ request, s"Details for Job $jobId", content, parent)
}
val isComplete = jobData.status != JobExecutionStatus.RUNNING
val stages = jobData.stageIds.map { stageId =>
@@ -413,6 +413,7 @@ private[ui] class JobPage(parent: JobsTab, store: AppStatusStore) extends WebUIP
{failedStagesTable.toNodeSeq}
</div>
}
- UIUtils.headerSparkPage(s"Details for Job $jobId", content, parent, showVisualization = true)
+ UIUtils.headerSparkPage(
+ request, s"Details for Job $jobId", content, parent, showVisualization = true)
}
}
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/ui/jobs/PoolPage.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/ui/jobs/PoolPage.scala b/core/src/main/scala/org/apache/spark/ui/jobs/PoolPage.scala
index a3e1f13..22a4010 100644
--- a/core/src/main/scala/org/apache/spark/ui/jobs/PoolPage.scala
+++ b/core/src/main/scala/org/apache/spark/ui/jobs/PoolPage.scala
@@ -49,7 +49,7 @@ private[ui] class PoolPage(parent: StagesTab) extends WebUIPage("pool") {
"stages/pool", parent.isFairScheduler, parent.killEnabled, false)
val poolTable = new PoolTable(Map(pool -> uiPool), parent)
- var content = <h4>Summary </h4> ++ poolTable.toNodeSeq
+ var content = <h4>Summary </h4> ++ poolTable.toNodeSeq(request)
if (activeStages.nonEmpty) {
content ++=
<span class="collapse-aggregated-poolActiveStages collapse-table"
@@ -65,6 +65,6 @@ private[ui] class PoolPage(parent: StagesTab) extends WebUIPage("pool") {
</div>
}
- UIUtils.headerSparkPage("Fair Scheduler Pool: " + poolName, content, parent)
+ UIUtils.headerSparkPage(request, "Fair Scheduler Pool: " + poolName, content, parent)
}
}
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/ui/jobs/PoolTable.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/ui/jobs/PoolTable.scala b/core/src/main/scala/org/apache/spark/ui/jobs/PoolTable.scala
index 5dfce85..96b5f72 100644
--- a/core/src/main/scala/org/apache/spark/ui/jobs/PoolTable.scala
+++ b/core/src/main/scala/org/apache/spark/ui/jobs/PoolTable.scala
@@ -18,6 +18,7 @@
package org.apache.spark.ui.jobs
import java.net.URLEncoder
+import javax.servlet.http.HttpServletRequest
import scala.xml.Node
@@ -28,7 +29,7 @@ import org.apache.spark.ui.UIUtils
/** Table showing list of pools */
private[ui] class PoolTable(pools: Map[Schedulable, PoolData], parent: StagesTab) {
- def toNodeSeq: Seq[Node] = {
+ def toNodeSeq(request: HttpServletRequest): Seq[Node] = {
<table class="table table-bordered table-striped table-condensed sortable table-fixed">
<thead>
<th>Pool Name</th>
@@ -39,15 +40,15 @@ private[ui] class PoolTable(pools: Map[Schedulable, PoolData], parent: StagesTab
<th>SchedulingMode</th>
</thead>
<tbody>
- {pools.map { case (s, p) => poolRow(s, p) }}
+ {pools.map { case (s, p) => poolRow(request, s, p) }}
</tbody>
</table>
}
- private def poolRow(s: Schedulable, p: PoolData): Seq[Node] = {
+ private def poolRow(request: HttpServletRequest, s: Schedulable, p: PoolData): Seq[Node] = {
val activeStages = p.stageIds.size
val href = "%s/stages/pool?poolname=%s"
- .format(UIUtils.prependBaseUri(parent.basePath), URLEncoder.encode(p.name, "UTF-8"))
+ .format(UIUtils.prependBaseUri(request, parent.basePath), URLEncoder.encode(p.name, "UTF-8"))
<tr>
<td>
<a href={href}>{p.name}</a>
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/ui/jobs/StagePage.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/ui/jobs/StagePage.scala b/core/src/main/scala/org/apache/spark/ui/jobs/StagePage.scala
index ac83de1..2575914 100644
--- a/core/src/main/scala/org/apache/spark/ui/jobs/StagePage.scala
+++ b/core/src/main/scala/org/apache/spark/ui/jobs/StagePage.scala
@@ -112,7 +112,7 @@ private[ui] class StagePage(parent: StagesTab, store: AppStatusStore) extends We
<div id="no-info">
<p>No information to display for Stage {stageId} (Attempt {stageAttemptId})</p>
</div>
- return UIUtils.headerSparkPage(stageHeader, content, parent)
+ return UIUtils.headerSparkPage(request, stageHeader, content, parent)
}
val localitySummary = store.localitySummary(stageData.stageId, stageData.attemptId)
@@ -125,7 +125,7 @@ private[ui] class StagePage(parent: StagesTab, store: AppStatusStore) extends We
<h4>Summary Metrics</h4> No tasks have started yet
<h4>Tasks</h4> No tasks have started yet
</div>
- return UIUtils.headerSparkPage(stageHeader, content, parent)
+ return UIUtils.headerSparkPage(request, stageHeader, content, parent)
}
val storedTasks = store.taskCount(stageData.stageId, stageData.attemptId)
@@ -282,7 +282,7 @@ private[ui] class StagePage(parent: StagesTab, store: AppStatusStore) extends We
val (taskTable, taskTableHTML) = try {
val _taskTable = new TaskPagedTable(
stageData,
- UIUtils.prependBaseUri(parent.basePath) +
+ UIUtils.prependBaseUri(request, parent.basePath) +
s"/stages/stage?id=${stageId}&attempt=${stageAttemptId}",
currentTime,
pageSize = taskPageSize,
@@ -498,7 +498,7 @@ private[ui] class StagePage(parent: StagesTab, store: AppStatusStore) extends We
<div class="aggregated-tasks collapsible-table">
{taskTableHTML ++ jsForScrollingDownToTaskTable}
</div>
- UIUtils.headerSparkPage(stageHeader, content, parent, showVisualization = true)
+ UIUtils.headerSparkPage(request, stageHeader, content, parent, showVisualization = true)
}
def makeTimeline(tasks: Seq[TaskData], currentTime: Long): Seq[Node] = {
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/ui/jobs/StageTable.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/ui/jobs/StageTable.scala b/core/src/main/scala/org/apache/spark/ui/jobs/StageTable.scala
index 18a4926..b8b20db 100644
--- a/core/src/main/scala/org/apache/spark/ui/jobs/StageTable.scala
+++ b/core/src/main/scala/org/apache/spark/ui/jobs/StageTable.scala
@@ -92,7 +92,8 @@ private[ui] class StageTableBase(
stageSortColumn,
stageSortDesc,
isFailedStage,
- parameterOtherTable
+ parameterOtherTable,
+ request
).table(page)
} catch {
case e @ (_ : IllegalArgumentException | _ : IndexOutOfBoundsException) =>
@@ -147,7 +148,8 @@ private[ui] class StagePagedTable(
sortColumn: String,
desc: Boolean,
isFailedStage: Boolean,
- parameterOtherTable: Iterable[String]) extends PagedTable[StageTableRowData] {
+ parameterOtherTable: Iterable[String],
+ request: HttpServletRequest) extends PagedTable[StageTableRowData] {
override def tableId: String = stageTag + "-table"
@@ -161,7 +163,7 @@ private[ui] class StagePagedTable(
override def pageNumberFormField: String = stageTag + ".page"
- val parameterPath = UIUtils.prependBaseUri(basePath) + s"/$subPath/?" +
+ val parameterPath = UIUtils.prependBaseUri(request, basePath) + s"/$subPath/?" +
parameterOtherTable.mkString("&")
override val dataSource = new StageDataSource(
@@ -288,7 +290,7 @@ private[ui] class StagePagedTable(
{if (isFairScheduler) {
<td>
<a href={"%s/stages/pool?poolname=%s"
- .format(UIUtils.prependBaseUri(basePath), data.schedulingPool)}>
+ .format(UIUtils.prependBaseUri(request, basePath), data.schedulingPool)}>
{data.schedulingPool}
</a>
</td>
@@ -346,7 +348,7 @@ private[ui] class StagePagedTable(
}
private def makeDescription(s: v1.StageData, descriptionOption: Option[String]): Seq[Node] = {
- val basePathUri = UIUtils.prependBaseUri(basePath)
+ val basePathUri = UIUtils.prependBaseUri(request, basePath)
val killLink = if (killEnabled) {
val confirm =
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/ui/storage/RDDPage.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/ui/storage/RDDPage.scala b/core/src/main/scala/org/apache/spark/ui/storage/RDDPage.scala
index 2674b92..238cd31 100644
--- a/core/src/main/scala/org/apache/spark/ui/storage/RDDPage.scala
+++ b/core/src/main/scala/org/apache/spark/ui/storage/RDDPage.scala
@@ -53,7 +53,7 @@ private[ui] class RDDPage(parent: SparkUITab, store: AppStatusStore) extends Web
} catch {
case _: NoSuchElementException =>
// Rather than crashing, render an "RDD Not Found" page
- return UIUtils.headerSparkPage("RDD Not Found", Seq.empty[Node], parent)
+ return UIUtils.headerSparkPage(request, "RDD Not Found", Seq.empty[Node], parent)
}
// Worker table
@@ -72,7 +72,7 @@ private[ui] class RDDPage(parent: SparkUITab, store: AppStatusStore) extends Web
}
val blockTableHTML = try {
val _blockTable = new BlockPagedTable(
- UIUtils.prependBaseUri(parent.basePath) + s"/storage/rdd/?id=${rddId}",
+ UIUtils.prependBaseUri(request, parent.basePath) + s"/storage/rdd/?id=${rddId}",
rddStorageInfo.partitions.get,
blockPageSize,
blockSortColumn,
@@ -145,7 +145,8 @@ private[ui] class RDDPage(parent: SparkUITab, store: AppStatusStore) extends Web
{blockTableHTML ++ jsForScrollingDownToBlockTable}
</div>;
- UIUtils.headerSparkPage("RDD Storage Info for " + rddStorageInfo.name, content, parent)
+ UIUtils.headerSparkPage(
+ request, "RDD Storage Info for " + rddStorageInfo.name, content, parent)
}
/** Header fields for the worker table */
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/main/scala/org/apache/spark/ui/storage/StoragePage.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/ui/storage/StoragePage.scala b/core/src/main/scala/org/apache/spark/ui/storage/StoragePage.scala
index 68d9465..3eb546e 100644
--- a/core/src/main/scala/org/apache/spark/ui/storage/StoragePage.scala
+++ b/core/src/main/scala/org/apache/spark/ui/storage/StoragePage.scala
@@ -31,11 +31,14 @@ import org.apache.spark.util.Utils
private[ui] class StoragePage(parent: SparkUITab, store: AppStatusStore) extends WebUIPage("") {
def render(request: HttpServletRequest): Seq[Node] = {
- val content = rddTable(store.rddList()) ++ receiverBlockTables(store.streamBlocksList())
- UIUtils.headerSparkPage("Storage", content, parent)
+ val content = rddTable(request, store.rddList()) ++
+ receiverBlockTables(store.streamBlocksList())
+ UIUtils.headerSparkPage(request, "Storage", content, parent)
}
- private[storage] def rddTable(rdds: Seq[v1.RDDStorageInfo]): Seq[Node] = {
+ private[storage] def rddTable(
+ request: HttpServletRequest,
+ rdds: Seq[v1.RDDStorageInfo]): Seq[Node] = {
if (rdds.isEmpty) {
// Don't show the rdd table if there is no RDD persisted.
Nil
@@ -49,7 +52,11 @@ private[ui] class StoragePage(parent: SparkUITab, store: AppStatusStore) extends
</h4>
</span>
<div class="aggregated-rdds collapsible-table">
- {UIUtils.listingTable(rddHeader, rddRow, rdds, id = Some("storage-by-rdd-table"))}
+ {UIUtils.listingTable(
+ rddHeader,
+ rddRow(request, _: v1.RDDStorageInfo),
+ rdds,
+ id = Some("storage-by-rdd-table"))}
</div>
</div>
}
@@ -66,12 +73,13 @@ private[ui] class StoragePage(parent: SparkUITab, store: AppStatusStore) extends
"Size on Disk")
/** Render an HTML row representing an RDD */
- private def rddRow(rdd: v1.RDDStorageInfo): Seq[Node] = {
+ private def rddRow(request: HttpServletRequest, rdd: v1.RDDStorageInfo): Seq[Node] = {
// scalastyle:off
<tr>
<td>{rdd.id}</td>
<td>
- <a href={"%s/storage/rdd?id=%s".format(UIUtils.prependBaseUri(parent.basePath), rdd.id)}>
+ <a href={"%s/storage/rdd?id=%s".format(
+ UIUtils.prependBaseUri(request, parent.basePath), rdd.id)}>
{rdd.name}
</a>
</td>
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala
----------------------------------------------------------------------
diff --git a/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala b/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala
index a871b1c..11b2912 100644
--- a/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala
+++ b/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala
@@ -36,6 +36,7 @@ import org.eclipse.jetty.servlet.{ServletContextHandler, ServletHolder}
import org.json4s.JsonAST._
import org.json4s.jackson.JsonMethods
import org.json4s.jackson.JsonMethods._
+import org.mockito.Mockito._
import org.openqa.selenium.WebDriver
import org.openqa.selenium.htmlunit.HtmlUnitDriver
import org.scalatest.{BeforeAndAfter, Matchers}
@@ -281,6 +282,29 @@ class HistoryServerSuite extends SparkFunSuite with BeforeAndAfter with Matchers
getContentAndCode("foobar")._1 should be (HttpServletResponse.SC_NOT_FOUND)
}
+ test("automatically retrieve uiRoot from request through Knox") {
+ assert(sys.props.get("spark.ui.proxyBase").isEmpty,
+ "spark.ui.proxyBase is defined but it should not for this UT")
+ assert(sys.env.get("APPLICATION_WEB_PROXY_BASE").isEmpty,
+ "APPLICATION_WEB_PROXY_BASE is defined but it should not for this UT")
+ val page = new HistoryPage(server)
+ val requestThroughKnox = mock[HttpServletRequest]
+ val knoxBaseUrl = "/gateway/default/sparkhistoryui"
+ when(requestThroughKnox.getHeader("X-Forwarded-Context")).thenReturn(knoxBaseUrl)
+ val responseThroughKnox = page.render(requestThroughKnox)
+
+ val urlsThroughKnox = responseThroughKnox \\ "@href" map (_.toString)
+ val siteRelativeLinksThroughKnox = urlsThroughKnox filter (_.startsWith("/"))
+ all (siteRelativeLinksThroughKnox) should startWith (knoxBaseUrl)
+
+ val directRequest = mock[HttpServletRequest]
+ val directResponse = page.render(directRequest)
+
+ val directUrls = directResponse \\ "@href" map (_.toString)
+ val directSiteRelativeLinks = directUrls filter (_.startsWith("/"))
+ all (directSiteRelativeLinks) should not startWith (knoxBaseUrl)
+ }
+
test("static relative links are prefixed with uiRoot (spark.ui.proxyBase)") {
val uiRoot = Option(System.getenv("APPLICATION_WEB_PROXY_BASE")).getOrElse("/testwebproxybase")
val page = new HistoryPage(server)
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/core/src/test/scala/org/apache/spark/ui/storage/StoragePageSuite.scala
----------------------------------------------------------------------
diff --git a/core/src/test/scala/org/apache/spark/ui/storage/StoragePageSuite.scala b/core/src/test/scala/org/apache/spark/ui/storage/StoragePageSuite.scala
index a71521c..cdc7f54 100644
--- a/core/src/test/scala/org/apache/spark/ui/storage/StoragePageSuite.scala
+++ b/core/src/test/scala/org/apache/spark/ui/storage/StoragePageSuite.scala
@@ -17,6 +17,8 @@
package org.apache.spark.ui.storage
+import javax.servlet.http.HttpServletRequest
+
import org.mockito.Mockito._
import org.apache.spark.SparkFunSuite
@@ -29,6 +31,7 @@ class StoragePageSuite extends SparkFunSuite {
val storageTab = mock(classOf[StorageTab])
when(storageTab.basePath).thenReturn("http://localhost:4040")
val storagePage = new StoragePage(storageTab, null)
+ val request = mock(classOf[HttpServletRequest])
test("rddTable") {
val rdd1 = new RDDStorageInfo(1,
@@ -61,7 +64,7 @@ class StoragePageSuite extends SparkFunSuite {
None,
None)
- val xmlNodes = storagePage.rddTable(Seq(rdd1, rdd2, rdd3))
+ val xmlNodes = storagePage.rddTable(request, Seq(rdd1, rdd2, rdd3))
val headers = Seq(
"ID",
@@ -94,7 +97,7 @@ class StoragePageSuite extends SparkFunSuite {
}
test("empty rddTable") {
- assert(storagePage.rddTable(Seq.empty).isEmpty)
+ assert(storagePage.rddTable(request, Seq.empty).isEmpty)
}
test("streamBlockStorageLevelDescriptionAndSize") {
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/resource-managers/mesos/src/main/scala/org/apache/spark/deploy/mesos/ui/DriverPage.scala
----------------------------------------------------------------------
diff --git a/resource-managers/mesos/src/main/scala/org/apache/spark/deploy/mesos/ui/DriverPage.scala b/resource-managers/mesos/src/main/scala/org/apache/spark/deploy/mesos/ui/DriverPage.scala
index 022191d..91f6414 100644
--- a/resource-managers/mesos/src/main/scala/org/apache/spark/deploy/mesos/ui/DriverPage.scala
+++ b/resource-managers/mesos/src/main/scala/org/apache/spark/deploy/mesos/ui/DriverPage.scala
@@ -39,7 +39,7 @@ private[ui] class DriverPage(parent: MesosClusterUI) extends WebUIPage("driver")
<div>
<p>Cannot find driver {driverId}</p>
</div>
- return UIUtils.basicSparkPage(content, s"Details for Job $driverId")
+ return UIUtils.basicSparkPage(request, content, s"Details for Job $driverId")
}
val driverState = state.get
val driverHeaders = Seq("Driver property", "Value")
@@ -68,7 +68,7 @@ private[ui] class DriverPage(parent: MesosClusterUI) extends WebUIPage("driver")
retryHeaders, retryRow, Iterable.apply(driverState.description.retryState))
val content =
<p>Driver state information for driver id {driverId}</p>
- <a href={UIUtils.prependBaseUri("/")}>Back to Drivers</a>
+ <a href={UIUtils.prependBaseUri(request, "/")}>Back to Drivers</a>
<div class="row-fluid">
<div class="span12">
<h4>Driver state: {driverState.state}</h4>
@@ -87,7 +87,7 @@ private[ui] class DriverPage(parent: MesosClusterUI) extends WebUIPage("driver")
</div>
</div>;
- UIUtils.basicSparkPage(content, s"Details for Job $driverId")
+ UIUtils.basicSparkPage(request, content, s"Details for Job $driverId")
}
private def launchedRow(submissionState: Option[MesosClusterSubmissionState]): Seq[Node] = {
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/resource-managers/mesos/src/main/scala/org/apache/spark/deploy/mesos/ui/MesosClusterPage.scala
----------------------------------------------------------------------
diff --git a/resource-managers/mesos/src/main/scala/org/apache/spark/deploy/mesos/ui/MesosClusterPage.scala b/resource-managers/mesos/src/main/scala/org/apache/spark/deploy/mesos/ui/MesosClusterPage.scala
index 88a6614..c532853 100644
--- a/resource-managers/mesos/src/main/scala/org/apache/spark/deploy/mesos/ui/MesosClusterPage.scala
+++ b/resource-managers/mesos/src/main/scala/org/apache/spark/deploy/mesos/ui/MesosClusterPage.scala
@@ -62,7 +62,7 @@ private[mesos] class MesosClusterPage(parent: MesosClusterUI) extends WebUIPage(
{retryTable}
</div>
</div>;
- UIUtils.basicSparkPage(content, "Spark Drivers for Mesos cluster")
+ UIUtils.basicSparkPage(request, content, "Spark Drivers for Mesos cluster")
}
private def queuedRow(submission: MesosDriverDescription): Seq[Node] = {
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/sql/core/src/main/scala/org/apache/spark/sql/execution/ui/AllExecutionsPage.scala
----------------------------------------------------------------------
diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/ui/AllExecutionsPage.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/ui/AllExecutionsPage.scala
index 5825287..bf46bc4 100644
--- a/sql/core/src/main/scala/org/apache/spark/sql/execution/ui/AllExecutionsPage.scala
+++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/ui/AllExecutionsPage.scala
@@ -58,21 +58,21 @@ private[ui] class AllExecutionsPage(parent: SQLTab) extends WebUIPage("") with L
_content ++=
new RunningExecutionTable(
parent, s"Running Queries (${running.size})", currentTime,
- running.sortBy(_.submissionTime).reverse).toNodeSeq
+ running.sortBy(_.submissionTime).reverse).toNodeSeq(request)
}
if (completed.nonEmpty) {
_content ++=
new CompletedExecutionTable(
parent, s"Completed Queries (${completed.size})", currentTime,
- completed.sortBy(_.submissionTime).reverse).toNodeSeq
+ completed.sortBy(_.submissionTime).reverse).toNodeSeq(request)
}
if (failed.nonEmpty) {
_content ++=
new FailedExecutionTable(
parent, s"Failed Queries (${failed.size})", currentTime,
- failed.sortBy(_.submissionTime).reverse).toNodeSeq
+ failed.sortBy(_.submissionTime).reverse).toNodeSeq(request)
}
_content
}
@@ -111,7 +111,7 @@ private[ui] class AllExecutionsPage(parent: SQLTab) extends WebUIPage("") with L
}
</ul>
</div>
- UIUtils.headerSparkPage("SQL", summary ++ content, parent, Some(5000))
+ UIUtils.headerSparkPage(request, "SQL", summary ++ content, parent, Some(5000))
}
}
@@ -133,7 +133,10 @@ private[ui] abstract class ExecutionTable(
protected def header: Seq[String]
- protected def row(currentTime: Long, executionUIData: SQLExecutionUIData): Seq[Node] = {
+ protected def row(
+ request: HttpServletRequest,
+ currentTime: Long,
+ executionUIData: SQLExecutionUIData): Seq[Node] = {
val submissionTime = executionUIData.submissionTime
val duration = executionUIData.completionTime.map(_.getTime()).getOrElse(currentTime) -
submissionTime
@@ -141,7 +144,7 @@ private[ui] abstract class ExecutionTable(
def jobLinks(status: JobExecutionStatus): Seq[Node] = {
executionUIData.jobs.flatMap { case (jobId, jobStatus) =>
if (jobStatus == status) {
- <a href={jobURL(jobId)}>[{jobId.toString}]</a>
+ <a href={jobURL(request, jobId)}>[{jobId.toString}]</a>
} else {
None
}
@@ -153,7 +156,7 @@ private[ui] abstract class ExecutionTable(
{executionUIData.executionId.toString}
</td>
<td>
- {descriptionCell(executionUIData)}
+ {descriptionCell(request, executionUIData)}
</td>
<td sorttable_customkey={submissionTime.toString}>
{UIUtils.formatDate(submissionTime)}
@@ -179,7 +182,9 @@ private[ui] abstract class ExecutionTable(
</tr>
}
- private def descriptionCell(execution: SQLExecutionUIData): Seq[Node] = {
+ private def descriptionCell(
+ request: HttpServletRequest,
+ execution: SQLExecutionUIData): Seq[Node] = {
val details = if (execution.details != null && execution.details.nonEmpty) {
<span onclick="clickDetail(this)" class="expand-details">
+details
@@ -192,27 +197,28 @@ private[ui] abstract class ExecutionTable(
}
val desc = if (execution.description != null && execution.description.nonEmpty) {
- <a href={executionURL(execution.executionId)}>{execution.description}</a>
+ <a href={executionURL(request, execution.executionId)}>{execution.description}</a>
} else {
- <a href={executionURL(execution.executionId)}>{execution.executionId}</a>
+ <a href={executionURL(request, execution.executionId)}>{execution.executionId}</a>
}
<div>{desc} {details}</div>
}
- def toNodeSeq: Seq[Node] = {
+ def toNodeSeq(request: HttpServletRequest): Seq[Node] = {
<div>
<h4>{tableName}</h4>
{UIUtils.listingTable[SQLExecutionUIData](
- header, row(currentTime, _), executionUIDatas, id = Some(tableId))}
+ header, row(request, currentTime, _), executionUIDatas, id = Some(tableId))}
</div>
}
- private def jobURL(jobId: Long): String =
- "%s/jobs/job?id=%s".format(UIUtils.prependBaseUri(parent.basePath), jobId)
+ private def jobURL(request: HttpServletRequest, jobId: Long): String =
+ "%s/jobs/job?id=%s".format(UIUtils.prependBaseUri(request, parent.basePath), jobId)
- private def executionURL(executionID: Long): String =
- s"${UIUtils.prependBaseUri(parent.basePath)}/${parent.prefix}/execution?id=$executionID"
+ private def executionURL(request: HttpServletRequest, executionID: Long): String =
+ s"${UIUtils.prependBaseUri(
+ request, parent.basePath)}/${parent.prefix}/execution?id=$executionID"
}
private[ui] class RunningExecutionTable(
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/sql/core/src/main/scala/org/apache/spark/sql/execution/ui/ExecutionPage.scala
----------------------------------------------------------------------
diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/ui/ExecutionPage.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/ui/ExecutionPage.scala
index e0554f0..282f7b4 100644
--- a/sql/core/src/main/scala/org/apache/spark/sql/execution/ui/ExecutionPage.scala
+++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/ui/ExecutionPage.scala
@@ -49,7 +49,7 @@ class ExecutionPage(parent: SQLTab) extends WebUIPage("execution") with Logging
<li>
<strong>{label} </strong>
{jobs.toSeq.sorted.map { jobId =>
- <a href={jobURL(jobId.intValue())}>{jobId.toString}</a><span> </span>
+ <a href={jobURL(request, jobId.intValue())}>{jobId.toString}</a><span> </span>
}}
</li>
} else {
@@ -77,27 +77,31 @@ class ExecutionPage(parent: SQLTab) extends WebUIPage("execution") with Logging
val graph = sqlStore.planGraph(executionId)
summary ++
- planVisualization(metrics, graph) ++
+ planVisualization(request, metrics, graph) ++
physicalPlanDescription(executionUIData.physicalPlanDescription)
}.getOrElse {
<div>No information to display for query {executionId}</div>
}
- UIUtils.headerSparkPage(s"Details for Query $executionId", content, parent, Some(5000))
+ UIUtils.headerSparkPage(
+ request, s"Details for Query $executionId", content, parent, Some(5000))
}
- private def planVisualizationResources: Seq[Node] = {
+ private def planVisualizationResources(request: HttpServletRequest): Seq[Node] = {
// scalastyle:off
- <link rel="stylesheet" href={UIUtils.prependBaseUri("/static/sql/spark-sql-viz.css")} type="text/css"/>
- <script src={UIUtils.prependBaseUri("/static/d3.min.js")}></script>
- <script src={UIUtils.prependBaseUri("/static/dagre-d3.min.js")}></script>
- <script src={UIUtils.prependBaseUri("/static/graphlib-dot.min.js")}></script>
- <script src={UIUtils.prependBaseUri("/static/sql/spark-sql-viz.js")}></script>
+ <link rel="stylesheet" href={UIUtils.prependBaseUri(request, "/static/sql/spark-sql-viz.css")} type="text/css"/>
+ <script src={UIUtils.prependBaseUri(request, "/static/d3.min.js")}></script>
+ <script src={UIUtils.prependBaseUri(request, "/static/dagre-d3.min.js")}></script>
+ <script src={UIUtils.prependBaseUri(request, "/static/graphlib-dot.min.js")}></script>
+ <script src={UIUtils.prependBaseUri(request, "/static/sql/spark-sql-viz.js")}></script>
// scalastyle:on
}
- private def planVisualization(metrics: Map[Long, String], graph: SparkPlanGraph): Seq[Node] = {
+ private def planVisualization(
+ request: HttpServletRequest,
+ metrics: Map[Long, String],
+ graph: SparkPlanGraph): Seq[Node] = {
val metadata = graph.allNodes.flatMap { node =>
val nodeId = s"plan-meta-data-${node.id}"
<div id={nodeId}>{node.desc}</div>
@@ -112,13 +116,13 @@ class ExecutionPage(parent: SQLTab) extends WebUIPage("execution") with Logging
<div id="plan-viz-metadata-size">{graph.allNodes.size.toString}</div>
{metadata}
</div>
- {planVisualizationResources}
+ {planVisualizationResources(request)}
<script>$(function() {{ renderPlanViz(); }})</script>
</div>
}
- private def jobURL(jobId: Long): String =
- "%s/jobs/job?id=%s".format(UIUtils.prependBaseUri(parent.basePath), jobId)
+ private def jobURL(request: HttpServletRequest, jobId: Long): String =
+ "%s/jobs/job?id=%s".format(UIUtils.prependBaseUri(request, parent.basePath), jobId)
private def physicalPlanDescription(physicalPlanDescription: String): Seq[Node] = {
<div>
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/ui/ThriftServerPage.scala
----------------------------------------------------------------------
diff --git a/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/ui/ThriftServerPage.scala b/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/ui/ThriftServerPage.scala
index f517bff..0950b30 100644
--- a/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/ui/ThriftServerPage.scala
+++ b/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/ui/ThriftServerPage.scala
@@ -47,10 +47,10 @@ private[ui] class ThriftServerPage(parent: ThriftServerTab) extends WebUIPage(""
{listener.getOnlineSessionNum} session(s) are online,
running {listener.getTotalRunning} SQL statement(s)
</h4> ++
- generateSessionStatsTable() ++
- generateSQLStatsTable()
+ generateSessionStatsTable(request) ++
+ generateSQLStatsTable(request)
}
- UIUtils.headerSparkPage("JDBC/ODBC Server", content, parent, Some(5000))
+ UIUtils.headerSparkPage(request, "JDBC/ODBC Server", content, parent, Some(5000))
}
/** Generate basic stats of the thrift server program */
@@ -67,7 +67,7 @@ private[ui] class ThriftServerPage(parent: ThriftServerTab) extends WebUIPage(""
}
/** Generate stats of batch statements of the thrift server program */
- private def generateSQLStatsTable(): Seq[Node] = {
+ private def generateSQLStatsTable(request: HttpServletRequest): Seq[Node] = {
val numStatement = listener.getExecutionList.size
val table = if (numStatement > 0) {
val headerRow = Seq("User", "JobID", "GroupID", "Start Time", "Finish Time", "Duration",
@@ -76,7 +76,8 @@ private[ui] class ThriftServerPage(parent: ThriftServerTab) extends WebUIPage(""
def generateDataRow(info: ExecutionInfo): Seq[Node] = {
val jobLink = info.jobId.map { id: String =>
- <a href={"%s/jobs/job?id=%s".format(UIUtils.prependBaseUri(parent.basePath), id)}>
+ <a href={"%s/jobs/job?id=%s".format(
+ UIUtils.prependBaseUri(request, parent.basePath), id)}>
[{id}]
</a>
}
@@ -138,7 +139,7 @@ private[ui] class ThriftServerPage(parent: ThriftServerTab) extends WebUIPage(""
}
/** Generate stats of batch sessions of the thrift server program */
- private def generateSessionStatsTable(): Seq[Node] = {
+ private def generateSessionStatsTable(request: HttpServletRequest): Seq[Node] = {
val sessionList = listener.getSessionList
val numBatches = sessionList.size
val table = if (numBatches > 0) {
@@ -146,8 +147,8 @@ private[ui] class ThriftServerPage(parent: ThriftServerTab) extends WebUIPage(""
val headerRow = Seq("User", "IP", "Session ID", "Start Time", "Finish Time", "Duration",
"Total Execute")
def generateDataRow(session: SessionInfo): Seq[Node] = {
- val sessionLink = "%s/%s/session?id=%s"
- .format(UIUtils.prependBaseUri(parent.basePath), parent.prefix, session.sessionId)
+ val sessionLink = "%s/%s/session?id=%s".format(
+ UIUtils.prependBaseUri(request, parent.basePath), parent.prefix, session.sessionId)
<tr>
<td> {session.userName} </td>
<td> {session.ip} </td>
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/ui/ThriftServerSessionPage.scala
----------------------------------------------------------------------
diff --git a/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/ui/ThriftServerSessionPage.scala b/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/ui/ThriftServerSessionPage.scala
index 5cd2fdf..c884aa0 100644
--- a/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/ui/ThriftServerSessionPage.scala
+++ b/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/ui/ThriftServerSessionPage.scala
@@ -56,9 +56,9 @@ private[ui] class ThriftServerSessionPage(parent: ThriftServerTab)
Session created at {formatDate(sessionStat.startTimestamp)},
Total run {sessionStat.totalExecution} SQL
</h4> ++
- generateSQLStatsTable(sessionStat.sessionId)
+ generateSQLStatsTable(request, sessionStat.sessionId)
}
- UIUtils.headerSparkPage("JDBC/ODBC Session", content, parent, Some(5000))
+ UIUtils.headerSparkPage(request, "JDBC/ODBC Session", content, parent, Some(5000))
}
/** Generate basic stats of the thrift server program */
@@ -75,7 +75,7 @@ private[ui] class ThriftServerSessionPage(parent: ThriftServerTab)
}
/** Generate stats of batch statements of the thrift server program */
- private def generateSQLStatsTable(sessionID: String): Seq[Node] = {
+ private def generateSQLStatsTable(request: HttpServletRequest, sessionID: String): Seq[Node] = {
val executionList = listener.getExecutionList
.filter(_.sessionId == sessionID)
val numStatement = executionList.size
@@ -86,7 +86,8 @@ private[ui] class ThriftServerSessionPage(parent: ThriftServerTab)
def generateDataRow(info: ExecutionInfo): Seq[Node] = {
val jobLink = info.jobId.map { id: String =>
- <a href={"%s/jobs/job?id=%s".format(UIUtils.prependBaseUri(parent.basePath), id)}>
+ <a href={"%s/jobs/job?id=%s".format(
+ UIUtils.prependBaseUri(request, parent.basePath), id)}>
[{id}]
</a>
}
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/streaming/src/main/scala/org/apache/spark/streaming/ui/BatchPage.scala
----------------------------------------------------------------------
diff --git a/streaming/src/main/scala/org/apache/spark/streaming/ui/BatchPage.scala b/streaming/src/main/scala/org/apache/spark/streaming/ui/BatchPage.scala
index 6748dd4..ca9da61 100644
--- a/streaming/src/main/scala/org/apache/spark/streaming/ui/BatchPage.scala
+++ b/streaming/src/main/scala/org/apache/spark/streaming/ui/BatchPage.scala
@@ -47,6 +47,7 @@ private[ui] class BatchPage(parent: StreamingTab) extends WebUIPage("batch") {
}
private def generateJobRow(
+ request: HttpServletRequest,
outputOpData: OutputOperationUIData,
outputOpDescription: Seq[Node],
formattedOutputOpDuration: String,
@@ -54,7 +55,7 @@ private[ui] class BatchPage(parent: StreamingTab) extends WebUIPage("batch") {
isFirstRow: Boolean,
jobIdWithData: SparkJobIdWithUIData): Seq[Node] = {
if (jobIdWithData.jobData.isDefined) {
- generateNormalJobRow(outputOpData, outputOpDescription, formattedOutputOpDuration,
+ generateNormalJobRow(request, outputOpData, outputOpDescription, formattedOutputOpDuration,
numSparkJobRowsInOutputOp, isFirstRow, jobIdWithData.jobData.get)
} else {
generateDroppedJobRow(outputOpData, outputOpDescription, formattedOutputOpDuration,
@@ -89,6 +90,7 @@ private[ui] class BatchPage(parent: StreamingTab) extends WebUIPage("batch") {
* one cell, we use "rowspan" for the first row of an output op.
*/
private def generateNormalJobRow(
+ request: HttpServletRequest,
outputOpData: OutputOperationUIData,
outputOpDescription: Seq[Node],
formattedOutputOpDuration: String,
@@ -106,7 +108,8 @@ private[ui] class BatchPage(parent: StreamingTab) extends WebUIPage("batch") {
dropWhile(_.failureReason == None).take(1). // get the first info that contains failure
flatMap(info => info.failureReason).headOption.getOrElse("")
val formattedDuration = duration.map(d => SparkUIUtils.formatDuration(d)).getOrElse("-")
- val detailUrl = s"${SparkUIUtils.prependBaseUri(parent.basePath)}/jobs/job?id=${sparkJob.jobId}"
+ val detailUrl = s"${SparkUIUtils.prependBaseUri(
+ request, parent.basePath)}/jobs/job?id=${sparkJob.jobId}"
// In the first row, output op id and its information needs to be shown. In other rows, these
// cells will be taken up due to "rowspan".
@@ -196,6 +199,7 @@ private[ui] class BatchPage(parent: StreamingTab) extends WebUIPage("batch") {
}
private def generateOutputOpIdRow(
+ request: HttpServletRequest,
outputOpData: OutputOperationUIData,
sparkJobs: Seq[SparkJobIdWithUIData]): Seq[Node] = {
val formattedOutputOpDuration =
@@ -212,6 +216,7 @@ private[ui] class BatchPage(parent: StreamingTab) extends WebUIPage("batch") {
} else {
val firstRow =
generateJobRow(
+ request,
outputOpData,
description,
formattedOutputOpDuration,
@@ -221,6 +226,7 @@ private[ui] class BatchPage(parent: StreamingTab) extends WebUIPage("batch") {
val tailRows =
sparkJobs.tail.map { sparkJob =>
generateJobRow(
+ request,
outputOpData,
description,
formattedOutputOpDuration,
@@ -278,7 +284,9 @@ private[ui] class BatchPage(parent: StreamingTab) extends WebUIPage("batch") {
/**
* Generate the job table for the batch.
*/
- private def generateJobTable(batchUIData: BatchUIData): Seq[Node] = {
+ private def generateJobTable(
+ request: HttpServletRequest,
+ batchUIData: BatchUIData): Seq[Node] = {
val outputOpIdToSparkJobIds = batchUIData.outputOpIdSparkJobIdPairs.groupBy(_.outputOpId).
map { case (outputOpId, outputOpIdAndSparkJobIds) =>
// sort SparkJobIds for each OutputOpId
@@ -301,7 +309,7 @@ private[ui] class BatchPage(parent: StreamingTab) extends WebUIPage("batch") {
<tbody>
{
outputOpWithJobs.map { case (outputOpData, sparkJobs) =>
- generateOutputOpIdRow(outputOpData, sparkJobs)
+ generateOutputOpIdRow(request, outputOpData, sparkJobs)
}
}
</tbody>
@@ -364,9 +372,10 @@ private[ui] class BatchPage(parent: StreamingTab) extends WebUIPage("batch") {
</ul>
</div>
- val content = summary ++ generateJobTable(batchUIData)
+ val content = summary ++ generateJobTable(request, batchUIData)
- SparkUIUtils.headerSparkPage(s"Details of batch at $formattedBatchTime", content, parent)
+ SparkUIUtils.headerSparkPage(
+ request, s"Details of batch at $formattedBatchTime", content, parent)
}
def generateInputMetadataTable(inputMetadatas: Seq[(Int, String)]): Seq[Node] = {
http://git-wip-us.apache.org/repos/asf/spark/blob/84d31aa5/streaming/src/main/scala/org/apache/spark/streaming/ui/StreamingPage.scala
----------------------------------------------------------------------
diff --git a/streaming/src/main/scala/org/apache/spark/streaming/ui/StreamingPage.scala b/streaming/src/main/scala/org/apache/spark/streaming/ui/StreamingPage.scala
index 3a176f6..4ce661b 100644
--- a/streaming/src/main/scala/org/apache/spark/streaming/ui/StreamingPage.scala
+++ b/streaming/src/main/scala/org/apache/spark/streaming/ui/StreamingPage.scala
@@ -148,7 +148,7 @@ private[ui] class StreamingPage(parent: StreamingTab)
/** Render the page */
def render(request: HttpServletRequest): Seq[Node] = {
- val resources = generateLoadResources()
+ val resources = generateLoadResources(request)
val basicInfo = generateBasicInfo()
val content = resources ++
basicInfo ++
@@ -156,17 +156,17 @@ private[ui] class StreamingPage(parent: StreamingTab)
generateStatTable() ++
generateBatchListTables()
}
- SparkUIUtils.headerSparkPage("Streaming Statistics", content, parent, Some(5000))
+ SparkUIUtils.headerSparkPage(request, "Streaming Statistics", content, parent, Some(5000))
}
/**
* Generate html that will load css/js files for StreamingPage
*/
- private def generateLoadResources(): Seq[Node] = {
+ private def generateLoadResources(request: HttpServletRequest): Seq[Node] = {
// scalastyle:off
- <script src={SparkUIUtils.prependBaseUri("/static/d3.min.js")}></script>
- <link rel="stylesheet" href={SparkUIUtils.prependBaseUri("/static/streaming/streaming-page.css")} type="text/css"/>
- <script src={SparkUIUtils.prependBaseUri("/static/streaming/streaming-page.js")}></script>
+ <script src={SparkUIUtils.prependBaseUri(request, "/static/d3.min.js")}></script>
+ <link rel="stylesheet" href={SparkUIUtils.prependBaseUri(request, "/static/streaming/streaming-page.css")} type="text/css"/>
+ <script src={SparkUIUtils.prependBaseUri(request, "/static/streaming/streaming-page.js")}></script>
// scalastyle:on
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org