| OLD | NEW |
| (Empty) |
| 1 <html> | |
| 2 <head> | |
| 3 <title> | |
| 4 Trace Events | |
| 5 </title> | |
| 6 <style> | |
| 7 body { | |
| 8 font-family: "Courier New"; | |
| 9 font-size: 9pt; | |
| 10 } | |
| 11 | |
| 12 #header { | |
| 13 position: absolute; | |
| 14 top: 0px; | |
| 15 left: 0px; | |
| 16 border-bottom: 1px dashed black; | |
| 17 background-color: #F0F0F0; | |
| 18 z-index: 3; | |
| 19 } | |
| 20 | |
| 21 #outer { | |
| 22 position: relative; | |
| 23 height: 200px; | |
| 24 } | |
| 25 | |
| 26 #time_scale { | |
| 27 height: 15px; | |
| 28 width: 100%; | |
| 29 } | |
| 30 | |
| 31 #tooltip { | |
| 32 position: absolute; | |
| 33 background-color: #FFFFCC; | |
| 34 display: none; | |
| 35 font-family: "Courier New"; | |
| 36 font-size: 9pt; | |
| 37 padding: 5px; | |
| 38 border: 1px solid #CCCC88; | |
| 39 z-index: 3; | |
| 40 } | |
| 41 | |
| 42 #legend { | |
| 43 position: fixed; | |
| 44 left: 10px; | |
| 45 bottom: 10px; | |
| 46 padding: 5px; | |
| 47 border: 1px solid silver; | |
| 48 z-index: 10; | |
| 49 background-color: #f0f0f0; | |
| 50 } | |
| 51 | |
| 52 h2 { | |
| 53 margin: 5px; | |
| 54 } | |
| 55 | |
| 56 #instructions { | |
| 57 position: absolute; | |
| 58 top: | |
| 59 float: right; | |
| 60 display: none; | |
| 61 } | |
| 62 | |
| 63 li.time_tick { | |
| 64 background-color: #FFFFCC; | |
| 65 height: 15px; | |
| 66 } | |
| 67 | |
| 68 li { | |
| 69 background: pink; | |
| 70 position: absolute; | |
| 71 height: 10px; | |
| 72 list-style: none; | |
| 73 margin: 0px; | |
| 74 padding: 0px; | |
| 75 z-index: 2; | |
| 76 } | |
| 77 | |
| 78 li:hover { | |
| 79 border: 1px solid red; | |
| 80 } | |
| 81 | |
| 82 .url { | |
| 83 background-color: green; | |
| 84 } | |
| 85 | |
| 86 .http { | |
| 87 background-color: blue; | |
| 88 } | |
| 89 | |
| 90 .socket { | |
| 91 background-color: black; | |
| 92 } | |
| 93 | |
| 94 .v8 { | |
| 95 background-color: orange; | |
| 96 } | |
| 97 | |
| 98 </style> | |
| 99 | |
| 100 <script src='trace_data.js'></script> | |
| 101 <script> | |
| 102 var scale = 100000; | |
| 103 var row_height = 15; | |
| 104 var trace_initial_time = 0; | |
| 105 var trace_threads = {}; | |
| 106 var heartbeats = []; | |
| 107 var trace_total_time = 0; | |
| 108 | |
| 109 function process_raw_events() { | |
| 110 trace_initial_time = raw_trace_events[0].usec_begin; | |
| 111 var stack = []; | |
| 112 var e; | |
| 113 for (var i in raw_trace_events) { | |
| 114 e = raw_trace_events[i]; | |
| 115 var trace_events = trace_threads["e.tid"]; | |
| 116 if (!trace_events) { | |
| 117 trace_events = []; | |
| 118 trace_threads["e.tid"] = trace_events; | |
| 119 } | |
| 120 if (e.name.indexOf("heartbeat.") == 0) { | |
| 121 heartbeats.push(e); | |
| 122 } else if (e.type == "BEGIN") { | |
| 123 trace_events.push(e); | |
| 124 stack.unshift(e); | |
| 125 } else if (e.type == "END") { | |
| 126 for (var s in stack) { | |
| 127 var begin = stack[s]; | |
| 128 if ((begin.id == e.id) && (begin.name == e.name) && | |
| 129 (begin.pid == e.pid) && (begin.tid == e.tid)) { | |
| 130 begin.usec_end = e.usec_begin; | |
| 131 begin.duration = begin.usec_end - begin.usec_begin; | |
| 132 stack.splice(s, 1); | |
| 133 break; | |
| 134 } | |
| 135 } | |
| 136 } else if (e.type == "INSTANT") { | |
| 137 trace_events.push(e); | |
| 138 e.duration = 0; | |
| 139 } | |
| 140 } | |
| 141 if (e.usec_end) | |
| 142 trace_total_time = e.usec_end - trace_initial_time; | |
| 143 else | |
| 144 trace_total_time = e.usec_begin - trace_initial_time; | |
| 145 } | |
| 146 | |
| 147 function compute_scale() { | |
| 148 var outer = document.getElementById("outer"); | |
| 149 scale = Math.floor(trace_total_time / (outer.offsetWidth - (row_height * 2))); | |
| 150 }; | |
| 151 | |
| 152 function show_details(tid, i, event) { | |
| 153 var trace_events = trace_threads["e.tid"]; | |
| 154 var inner = trace_events[i].name + " " + | |
| 155 trace_events[i].duration / 1000 + "ms<br />" + | |
| 156 trace_events[i].id + "<br />" + | |
| 157 trace_events[i].extra + "<br />"; | |
| 158 var tooltip = document.getElementById("tooltip"); | |
| 159 tooltip.innerHTML = inner; | |
| 160 if (window.event) | |
| 161 event = window.event; | |
| 162 tooltip.style.top = event.pageY + 3; | |
| 163 tooltip.style.left = event.pageX + 3; | |
| 164 tooltip.style.display = "block"; | |
| 165 }; | |
| 166 | |
| 167 function generate_time_scale() { | |
| 168 var view_size = window.clientWidth; | |
| 169 var body_size = document.body.scrollWidth; | |
| 170 var inner = ""; | |
| 171 | |
| 172 var step_ms = Math.floor(scale / 10); // ms per 100px | |
| 173 var pow10 = Math.pow(10, Math.floor(Math.log(step_ms) / Math.log(10))); | |
| 174 var round = .5 * pow10; | |
| 175 step_ms = round * (Math.floor(step_ms / round)); // round to a multiple of rou
nd | |
| 176 for (var i = step_ms; i < trace_total_time / 1000; i += step_ms) { | |
| 177 var x = Math.floor(i * 1000 / scale); | |
| 178 inner += "<li class='time_tick' style='left: " + x + "px'>" + i + "</li>"; | |
| 179 } | |
| 180 var time_scale = document.getElementById("time_scale"); | |
| 181 time_scale.innerHTML = inner; | |
| 182 time_scale.style.width = document.body.scrollWidth; | |
| 183 } | |
| 184 | |
| 185 function generate_subchart(trace_events, top) { | |
| 186 var inner = ""; | |
| 187 var last_max_time = 0; | |
| 188 var last_max_x = 0; | |
| 189 for (var i in trace_events) { | |
| 190 var e = trace_events[i]; | |
| 191 var start_time = e.usec_begin - trace_initial_time; | |
| 192 var left = row_height + Math.floor(start_time / scale); | |
| 193 var width = Math.floor(e.duration / scale); | |
| 194 if (width == 0) | |
| 195 width = 1; | |
| 196 if (start_time < last_max_time) | |
| 197 top += row_height; | |
| 198 var style = "top: " + top + "px; left: " + left + "px; width: " + width + "p
x;"; | |
| 199 var js = 'javascript:show_details("' + e.tid + '", ' + i + ', event);'; | |
| 200 var cls = e.name.split('.')[0]; | |
| 201 inner += "<li class='" + cls + "' onmouseover='" + js + "' id='li-" + i + "'
style='" + style + "'></li>\n"; | |
| 202 last_max_time = start_time + e.duration; | |
| 203 last_max_x = left + width; | |
| 204 } | |
| 205 var subchart = document.createElement('div'); | |
| 206 subchart.setAttribute("class", "subchart"); | |
| 207 subchart.setAttribute("id", trace_events[0].tid); | |
| 208 subchart.innerHTML = inner; | |
| 209 subchart.style.height = top + row_height; | |
| 210 subchart.style.width = row_height + last_max_x; | |
| 211 var chart = document.getElementById("chart"); | |
| 212 chart.appendChild(subchart); | |
| 213 | |
| 214 return top; | |
| 215 }; | |
| 216 | |
| 217 function generate_chart() { | |
| 218 var chart = document.getElementById("chart"); | |
| 219 chart.innerHTML = ""; | |
| 220 var top = 60; | |
| 221 for (var t in trace_threads) { | |
| 222 top = generate_subchart(trace_threads[t], top); | |
| 223 } | |
| 224 generate_time_scale(); | |
| 225 } | |
| 226 | |
| 227 function change_scale(event) { | |
| 228 if (!event) | |
| 229 event = window.event; | |
| 230 if (!event.shiftKey) | |
| 231 return; | |
| 232 var delta = 0; | |
| 233 if (event.wheelDelta) { | |
| 234 delta = event.wheelDelta / 120; | |
| 235 } else if (event.detail) { | |
| 236 delta = - event.detail / 3; | |
| 237 } | |
| 238 if (delta) { | |
| 239 var tooltip = document.getElementById("tooltip"); | |
| 240 tooltip.style.display = "none"; | |
| 241 var factor = 1.1; | |
| 242 if (delta < 0) | |
| 243 scale = Math.floor(scale * factor); | |
| 244 else | |
| 245 scale = Math.floor(scale / factor); | |
| 246 if (scale > 300000) | |
| 247 scale = 300000; | |
| 248 generate_chart(); | |
| 249 if (event.preventDefault) | |
| 250 event.preventDefault(); | |
| 251 } | |
| 252 event.returnValue = false; | |
| 253 }; | |
| 254 | |
| 255 function initial_load() { | |
| 256 if (window.addEventListener) | |
| 257 window.addEventListener('DOMMouseScroll', change_scale, false); | |
| 258 window.onmousewheel = document.onmousewheel = change_scale; | |
| 259 | |
| 260 process_raw_events(); | |
| 261 compute_scale(); | |
| 262 generate_chart(); | |
| 263 }; | |
| 264 | |
| 265 </script> | |
| 266 </head> | |
| 267 <body onload='initial_load();'> | |
| 268 <div id="header"> | |
| 269 <h2>Trace Events</h2> | |
| 270 <div id="instructions"> | |
| 271 Use shift+mouse-wheel to zoom in and out. | |
| 272 </div> | |
| 273 <div id="time_scale"></div> | |
| 274 </div> | |
| 275 <div id="legend"> | |
| 276 <span class="url"> </span> URL<br /> | |
| 277 <span class="http"> </span> HTTP<br /> | |
| 278 <span class="socket"> </span> Socket<br /> | |
| 279 <span class="v8"> </span> V8<br /> | |
| 280 </div> | |
| 281 <div id="chart"> | |
| 282 <div id="outer"> | |
| 283 </div> | |
| 284 </div> | |
| 285 <div id="tooltip" ondblclick="this.style.display = 'none';"></div> | |
| 286 </body> | |
| 287 </html> | |
| OLD | NEW |