blob: ea50ec60e1c16b4de367db912ec920adb15b87ce [file] [log] [blame]
/**
* 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.
*/
module.exports = {
durationFormatter:function(d) {
if (d==0) { return "0" }
var seconds = Math.floor(parseInt(d) / 1000);
if ( seconds < 60 )
return seconds + "s";
var minutes = Math.floor(seconds / 60);
if ( minutes < 60 ) {
var x = seconds - 60*minutes;
return minutes + "m" + (x==0 ? "" : " " + x + "s");
}
var hours = Math.floor(minutes / 60);
if ( hours < 24 ) {
var x = minutes - 60*hours;
return hours + "h" + (x==0 ? "" : " " + x + "m");
}
var days = Math.floor(hours / 24);
if ( days < 7 ) {
var x = hours - 24*days;
return days + "d " + (x==0 ? "" : " " + x + "h");
}
var weeks = Math.floor(days / 7);
var x = days - 7*weeks;
return weeks + "w " + (x==0 ? "" : " " + x + "d");
},
bytesFormatter:function(y) {
if (y >= 1125899906842624) { return Math.floor(10 * y / 1125899906842624)/10 + " PB" }
else if (y >= 1099511627776){ return Math.floor(10 * y / 1099511627776)/10 + " TB" }
else if (y >= 1073741824) { return Math.floor(10 * y / 1073741824)/10 + " GB" }
else if (y >= 1048576) { return Math.floor(10 * y / 1048576)/10 + " MB" }
else if (y >= 1024) { return Math.floor(10 * y / 1024)/10 + " KB" }
else { return y + " B"}
},
addSeries:function(svgg,series,color,xscale,yscale,margin,startTime,dotInfo) {
if (series.length==0) return;
var self = this;
var g = svgg.append("svg:g").selectAll("g")
.data(series)
.enter().append("svg:g")
.attr("transform", "translate(0,"+margin+")");
g.append("svg:circle")
.attr("r",function(d) {return d.r;})
.attr("cx",function(d) {return xscale(d.x);})
.attr("cy",function(d) {return yscale(d.y);})
.style("fill",color)
.style("fill-opacity",0.8)
.style("stroke",d3.interpolateRgb(color, 'black')(0.125))
.append("title")
.text(function(d) { return dotInfo[Math.round(xscale(d.x))][Math.round(yscale(d.y))]; });
g.append("svg:line")
.attr("x1", function(d) { return xscale(d.x)+d.r; } )
.attr("x2", function(d) { return xscale(d.x+d.y); } )
.attr("y1", function(d) { return yscale(d.y); } )
.attr("y2", function(d) { return yscale(d.y); } )
.style("stroke",d3.interpolateRgb(color, 'black')(0.125))
.style("stroke-width",2)
.append("title")
.text(function(d) { return dotInfo[Math.round(xscale(d.x))][Math.round(yscale(d.y))]; });
},
/**
*
* @param mapNodeLocal
* @param mapRackLocal
* @param mapOffSwitch
* @param reduceOffSwitch
* @param startTime
* @param endTime
* @param w
* @param h
* @param element
*/
drawJobTasks:function (mapNodeLocal, mapRackLocal, mapOffSwitch, reduceOffSwitch, startTime, endTime, svgw, svgh, element) {
var rmax = 24; // default value
var axisHeight = 24;
var margin = {"vertical":10, "horizontal":50};
var w = svgw - 2*margin.horizontal;
var h = svgh - 2*margin.vertical;
var x = d3.time.scale.utc()
.domain([startTime, endTime])
.range([0, w]);
var xrel = d3.time.scale()
.domain([0, endTime-startTime])
.range([0, w]);
// create axes
var topAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
var self = this;
var bottomAxis = d3.svg.axis()
.scale(xrel)
.orient("bottom")
.tickFormat(function(d) {return self.durationFormatter(d.getTime())});
var svg = d3.select("div#" + element).append("svg:svg")
.attr("width", svgw+"px")
.attr("height", svgh+"px");
var svgg = svg.append("g")
.attr("transform", "translate("+margin.horizontal+","+margin.vertical+")");
svgg.append("g")
.attr("class", "x axis top")
.call(topAxis);
svgg.append("g")
.attr("class", "x axis bottom")
.call(bottomAxis)
.attr("transform", "translate(0,"+(h-axisHeight)+")");
var ymax = 0;
if (mapNodeLocal.length > 0)
ymax = Math.max(ymax, d3.max(mapNodeLocal, function(d) { return d.y; } ));
if (mapRackLocal.length > 0)
ymax = Math.max(ymax, d3.max(mapRackLocal, function(d) { return d.y; } ));
if (mapOffSwitch.length > 0)
ymax = Math.max(ymax, d3.max(mapOffSwitch, function(d) { return d.y; } ));
if (reduceOffSwitch.length > 0)
ymax = Math.max(ymax, d3.max(reduceOffSwitch, function(d) { return d.y; } ));
var y = d3.scale.linear()
.domain([0, ymax])
.range([h-2*axisHeight-rmax, 0]);
var yAxis = d3.svg.axis()
.scale(y)
.orient("left")
.tickFormat(self.durationFormatter);
svgg.append("svg:g")
.attr("class", "y axis")
.call(yAxis)
.attr("transform", "translate(0,"+(axisHeight+rmax)+")")
.append("text")
.attr("transform", "rotate(-90)")
.attr("x", -(h-2*axisHeight-rmax)/2)
.attr("y", -margin.horizontal + 11)
.attr("class", "axislabel")
.text("Task Attempt Duration");
var dotInfo = new Array();
var mapDotInfo = function(d) {
var thisx = Math.round(x(d.x));
var thisy = Math.round(y(d.y));
if (!(thisx in dotInfo))
dotInfo[thisx] = new Array();
var existing = dotInfo[thisx][thisy];
var newInfo = d.label + " \n" +
'Run-time: ' + self.durationFormatter(d.y) + ' \nWait-time: ' + self.durationFormatter(d.x-startTime) +
' \nI/O: ' + self.bytesFormatter(d.io) + ' \nStatus: ' + d.status;
if (existing)
dotInfo[thisx][thisy] = existing + " \n" + newInfo;
else
dotInfo[thisx][thisy] = newInfo;
};
mapNodeLocal.forEach(mapDotInfo);
mapRackLocal.forEach(mapDotInfo);
mapOffSwitch.forEach(mapDotInfo);
reduceOffSwitch.forEach(mapDotInfo);
this.addSeries(svgg, mapNodeLocal, "green", x, y, axisHeight+rmax, startTime, dotInfo);
this.addSeries(svgg, mapRackLocal,'#66B366', x, y, axisHeight+rmax, startTime, dotInfo);
this.addSeries(svgg, mapOffSwitch, 'brown', x, y, axisHeight+rmax, startTime, dotInfo);
this.addSeries(svgg, reduceOffSwitch, 'steelblue', x, y, axisHeight+rmax, startTime, dotInfo);
}
}