Skip to content

Commit

Permalink
[SPARK-17724][STREAMING][WEBUI] Unevaluated new lines in tooltip in D…
Browse files Browse the repository at this point in the history
…AG Visualization of a job

https://issues.apache.org/jira/browse/SPARK-17724

## What changes were proposed in this pull request?
For unevaluated `\n`, evaluate it and enable line break, for Streaming WebUI `stages` page and `job` page.
(I didn't change Scala source file, since Jetty server has to somehow indicate line break and js to code display it.)
(This PR is a continue from previous PR apache#15353 for the same issue, sorry being so long time)

Two changes:

1. RDD Node tooltipText is actually showing the `<circle>`  `title` property, so I set extra attribute in `spark-dag-viz.js`: `.attr("data-html", "true")`

`<circle x="-5" y="-5" r="5" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="ParallelCollectionRDD [9]\nmakeRDD at QueueStream.scala:49"></circle>`

2. Static `<tspan>` text of each stage, split by `/n`, and append an extra `<tspan>` element to its parentNode

`<text><tspan xml:space="preserve" dy="1em" x="1">reduceByKey</tspan><tspan xml:space="preserve" dy="1em" x="1">reduceByKey/n 23:34:49</tspan></text>
`

## UI changes
Screenshot **before fix**, `\n` is not evaluated in both circle tooltipText and static text:
![screen shot 2017-01-19 at 12 21 54 am](https://cloud.githubusercontent.com/assets/3925641/22098829/53c7f49c-dddd-11e6-9daa-b3ddb6044114.png)

Screenshot **after fix**:
![screen shot 2017-01-19 at 12 20 30 am](https://cloud.githubusercontent.com/assets/3925641/22098806/294910d4-dddd-11e6-9948-d942e09f545e.png)

## How was this patch tested?
Tested locally. For Streaming WebUI `stages` page and `job` page, on multiple browsers:
- Chrome
- Firefox
- Safari

Author: Xin Ren <[email protected]>

Closes apache#16643 from keypointt/SPARK-17724-2nd.
  • Loading branch information
keypointt authored and srowen committed Jan 21, 2017
1 parent 3c2ba9f commit bcdabaa
Showing 1 changed file with 32 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
* primitives (e.g. take, any SQL query).
*
* In the visualization, an RDD is expressed as a node, and its dependencies
* as directed edges (from parent to child). operation scopes, stages, and
* as directed edges (from parent to child). Operation scopes, stages, and
* jobs are expressed as clusters that may contain one or many nodes. These
* clusters may be nested inside of each other in the scenarios described
* above.
Expand Down Expand Up @@ -173,6 +173,7 @@ function renderDagViz(forJob) {
});

resizeSvg(svg);
interpretLineBreak(svg);
}

/* Render the RDD DAG visualization on the stage page. */
Expand Down Expand Up @@ -362,6 +363,27 @@ function resizeSvg(svg) {
.attr("height", height);
}

/*
* Helper function to interpret line break for tag 'tspan'.
* For tag 'tspan', line break '/n' is display in UI as raw for both stage page and job page,
* here this function is to enable line break.
*/
function interpretLineBreak(svg) {
var allTSpan = svg.selectAll("tspan").each(function() {
node = d3.select(this);
var original = node[0][0].innerHTML;
if (original.indexOf("\\n") != -1) {
var arr = original.split("\\n");
var newNode = this.cloneNode(this);

node[0][0].innerHTML = arr[0];
newNode.innerHTML = arr[1];

this.parentNode.appendChild(newNode);
}
});
}

/*
* (Job page only) Helper function to draw edges that cross stage boundaries.
* We need to do this manually because we render each stage separately in dagre-d3.
Expand Down Expand Up @@ -470,15 +492,23 @@ function connectRDDs(fromRDDId, toRDDId, edgesContainer, svgContainer) {
edgesContainer.append("path").datum(points).attr("d", line);
}

/*
* Replace `/n` with `<br/>`
*/
function replaceLineBreak(str) {
return str.replace("\\n", "<br/>");
}

/* (Job page only) Helper function to add tooltips for RDDs. */
function addTooltipsForRDDs(svgContainer) {
svgContainer.selectAll("g.node").each(function() {
var node = d3.select(this);
var tooltipText = node.attr("name");
var tooltipText = replaceLineBreak(node.attr("name"));
if (tooltipText) {
node.select("circle")
.attr("data-toggle", "tooltip")
.attr("data-placement", "bottom")
.attr("data-html", "true") // to interpret line break, tooltipText is showing <circle> title
.attr("title", tooltipText);
}
// Link tooltips for all nodes that belong to the same RDD
Expand Down

0 comments on commit bcdabaa

Please sign in to comment.