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 |