1
1
function renderJobsGraphs ( data ) {
2
+ /* show visualization toggle */
2
3
$ ( ".expand-visualization-arrow" ) . toggleClass ( 'arrow-closed' ) ;
3
4
$ ( ".expand-visualization-arrow" ) . toggleClass ( 'arrow-open' ) ;
4
5
if ( $ ( ".expand-visualization-arrow" ) . hasClass ( "arrow-closed" ) ) {
5
6
$ ( "#chartContainer" ) . empty ( ) ;
6
7
return ;
7
8
}
9
+
10
+ /* no data to graph */
11
+ if ( ! Object . keys ( data ) . length ) {
12
+ return ;
13
+ }
14
+
15
+ /* format data to a form readable by dimple.js */
8
16
var tableData = [ ] ;
9
17
for ( var k in data ) {
10
18
var arr = ( data [ k ] ) . split ( "," ) ;
11
19
data [ k ] = arr ;
12
20
}
13
- var startTime = getMin ( data [ "Launch Time" ] ) ;
14
- var numTasks = data [ k ] . length ;
21
+ var startTime = getMin ( data [ "launchtime" ] ) ;
22
+ var numTasks = Math . min ( 1000 , data [ k ] . length ) ;
23
+
24
+ /*data update */
25
+ data [ "launchtime" ] = data [ "launchtime" ] . map ( function ( launchTime ) { return launchTime - startTime ; } ) ;
15
26
var maxTime = 0 ;
16
- data [ "Launch Time" ] = data [ "Launch Time" ] . map ( function ( launchTime ) { return launchTime - startTime ; } ) ;
17
- for ( i = 0 ; i < data [ k ] . length ; i ++ ) {
27
+ for ( i = 0 ; i < numTasks ; i ++ ) {
18
28
var time = 0 ;
29
+ for ( var key in data ) {
30
+ time += parseFloat ( data [ key ] [ i ] ) ;
31
+ }
32
+ maxTime = Math . max ( time , maxTime ) ;
33
+ }
34
+ divisorAndTitle = getDivisiorAndTitle ( maxTime ) ;
35
+ for ( i = 0 ; i < numTasks ; i ++ ) {
19
36
for ( var key in data ) {
20
37
job = { } ;
21
- job [ "Task #" ] = i + 1 ;
38
+ job [ "Task #" ] = i ;
22
39
job [ "Task" ] = key ;
23
- job [ "Time" ] = parseFloat ( data [ key ] [ i ] ) ;
24
- time += job [ "Time" ] ;
40
+ job [ "Time" ] = parseFloat ( data [ key ] [ i ] ) / divisorAndTitle [ 0 ] ;
25
41
tableData . push ( job ) ;
26
42
}
27
- maxTime = Math . max ( time , maxTime ) ;
28
43
}
29
- console . log ( JSON . stringify ( tableData ) ) ;
30
- var height = Math . min ( numTasks * 100 , 2000 ) ;
31
- var width = Math . min ( maxTime * 2.5 , 2000 ) ;
44
+
45
+ var height = Math . max ( Math . min ( numTasks * 50 , 2000 ) , 200 ) ;
32
46
var svg = dimple . newSvg ( "#chartContainer" , "100%" , height ) ;
33
47
var chart = new dimple . chart ( svg ) ;
34
- chart . setBounds ( "5%" , "20%" , "90%" , "60%" ) ;
48
+ chart . setMargins ( 60 , 60 , 60 , 60 ) ;
49
+
35
50
var x = chart . addMeasureAxis ( "x" , "Time" ) ;
36
- var y = chart . addCategoryAxis ( "y" , "Task #" ) ;
37
- x . title = "Time (ms)" ;
38
51
x . fontSize = "12px" ;
52
+ x . title = divisorAndTitle [ 1 ] ;
53
+
54
+ var y = chart . addCategoryAxis ( "y" , "Task #" ) ;
39
55
y . fontSize = "12px" ;
56
+
40
57
var s = chart . addSeries ( "Task" , dimple . plot . bar ) ;
41
58
s . data = tableData ;
42
- s . addOrderRule ( [ "Launch Time" , "Scheduler Delay" , "Task Deserialization Time" , "Duration" , "Result Serialization Time" , "Getting Result Time" , "GC Time" ] ) ;
43
- chart . addLegend ( "20%" , "10%" , "80%" , "20%" , "right" ) ;
59
+ s . addOrderRule ( getOrderRule ( ) ) ;
60
+
61
+ s . getTooltipText = function ( dat ) {
62
+ return [ "Task #: " + dat [ "yField" ] [ 0 ] ,
63
+ "Phase: " + dat [ "aggField" ] [ 0 ] ,
64
+ "Time (ms): " + dat [ "xValue" ] * divisorAndTitle [ 0 ]
65
+ ] ;
66
+ } ;
67
+
68
+ chart . addLegend ( 20 , 10 , 1000 , 40 , "right" ) ;
44
69
( chart . legends [ 0 ] ) . fontSize = "12px" ;
70
+
45
71
chart . draw ( ) ;
72
+ svg . selectAll ( ".dimple-launchtime" ) . remove ( ) ;
73
+ numTicks ( y , Math . floor ( numTasks / 20 ) ) ;
46
74
}
47
75
48
76
function getMin ( arr ) {
49
77
return Math . min . apply ( null , arr ) ;
78
+ }
79
+
80
+ function getOrderRule ( ) {
81
+ return [ "launchtime" , "Scheduler Delay" , "Task Deserialization Time" ,
82
+ "Duration" , "Result Serialization Time" , "Getting Result Time" , "GC Time" ] ;
83
+ }
84
+
85
+ function getDivisiorAndTitle ( maxTime ) {
86
+ var sec = 1000 ;
87
+ var min = sec * 60 ;
88
+ var hr = min * 60 ;
89
+ if ( maxTime >= hr ) {
90
+ return [ hr , "Time (hr)" ] ;
91
+ } else if ( maxTime >= min ) {
92
+ return [ min , "Time (min)" ] ;
93
+ } else if ( maxTime >= sec ) {
94
+ return [ sec , "Time (s)" ] ;
95
+ } else {
96
+ return [ 1 , "Time (ms)" ] ;
97
+ }
98
+ }
99
+
100
+ /* limits the number of ticks in the Y-axis to oneInEvery */
101
+ function numTicks ( axis , oneInEvery ) {
102
+ if ( axis . shapes . length > 0 ) {
103
+ var del = 0 ;
104
+ if ( oneInEvery > 1 ) {
105
+ axis . shapes . selectAll ( "text" ) . each ( function ( d ) {
106
+ if ( del % oneInEvery !== 0 ) {
107
+ this . remove ( ) ;
108
+ axis . shapes . selectAll ( "line" ) . each ( function ( d2 ) {
109
+ if ( d === d2 ) {
110
+ this . remove ( ) ;
111
+ }
112
+ } ) ;
113
+ }
114
+ del += 1 ;
115
+ } ) ;
116
+ }
117
+ }
50
118
}
0 commit comments