rev |
line source |
jbe@299
|
1 local function format_time(real_time, proc_time)
|
jbe@299
|
2 if proc_time then
|
jbe@301
|
3 return string.format("%.1f ms (%.1f ms)", real_time * 1000, proc_time * 1000)
|
jbe@299
|
4 else
|
jbe@299
|
5 return string.format("%.1f ms", real_time * 1000)
|
jbe@299
|
6 end
|
jbe@295
|
7 end
|
jbe@295
|
8
|
jbe/bsw@0
|
9 local function open(class)
|
jbe/bsw@0
|
10 slot.put('<li class="trace_' .. class .. '">')
|
jbe/bsw@0
|
11 end
|
bsw@115
|
12 local function open_head(node)
|
jbe/bsw@0
|
13 slot.put('<div class="trace_head">')
|
jbe@299
|
14 if node.start_real_time and node.stop_real_time then
|
jbe@299
|
15 local total_real_time = node.stop_real_time - node.start_real_time
|
jbe@299
|
16 local total_proc_time = node.stop_proc_time - node.start_proc_time
|
jbe@299
|
17 local child_real_time = 0
|
jbe@299
|
18 local child_proc_time = 0
|
bsw@115
|
19 for i, child in ipairs(node) do
|
jbe@299
|
20 if child.start_real_time then
|
jbe@299
|
21 child_real_time = child_real_time + child.stop_real_time - child.start_real_time
|
jbe@299
|
22 child_proc_time = child_proc_time + child.stop_proc_time - child.start_proc_time
|
bsw@115
|
23 end
|
bsw@115
|
24 end
|
jbe@299
|
25 local real_time = total_real_time - child_real_time
|
jbe@299
|
26 local proc_time = total_proc_time - child_proc_time
|
jbe@299
|
27 slot.put(
|
jbe@299
|
28 '<div class="time">',
|
jbe@299
|
29 '<span class="duration_label">this:</span>',
|
jbe@299
|
30 ' ',
|
jbe@299
|
31 '<span class="duration">', format_time(real_time, proc_time), '</span>',
|
jbe@299
|
32 ' | ',
|
jbe@299
|
33 '<span class="child_duration_label">children:</span>',
|
jbe@299
|
34 ' ',
|
jbe@299
|
35 '<span class="child_duration">', format_time(child_real_time, child_proc_time), '</span>',
|
jbe@299
|
36 ' | ',
|
jbe@299
|
37 '<span class="total_duration_label">total:</span>',
|
jbe@299
|
38 ' ',
|
jbe@299
|
39 '<span class="total_duration">', format_time(total_real_time, total_proc_time), '</span>',
|
jbe@299
|
40 '</div>'
|
jbe@299
|
41 )
|
bsw@115
|
42 end
|
jbe/bsw@0
|
43 end
|
jbe/bsw@0
|
44 local function close_head()
|
jbe/bsw@0
|
45 slot.put('</div>')
|
jbe/bsw@0
|
46 end
|
jbe/bsw@0
|
47 local function close()
|
jbe/bsw@0
|
48 slot.put('</li>')
|
jbe/bsw@0
|
49 end
|
jbe/bsw@0
|
50 function trace._render_sub_tree(node)
|
jbe/bsw@0
|
51 local function render_children(tail)
|
jbe/bsw@0
|
52 if #node > 0 then
|
jbe/bsw@0
|
53 slot.put('<ul class="trace_list">')
|
jbe/bsw@0
|
54 for idx, child in ipairs(node) do
|
jbe/bsw@0
|
55 trace._render_sub_tree(child)
|
jbe/bsw@0
|
56 end
|
jbe/bsw@0
|
57 if tail then
|
jbe/bsw@0
|
58 slot.put(tail)
|
jbe/bsw@0
|
59 end
|
jbe/bsw@0
|
60 slot.put("</ul>")
|
jbe/bsw@0
|
61 end
|
jbe/bsw@0
|
62 end
|
jbe/bsw@0
|
63 local function close_with_children()
|
jbe/bsw@0
|
64 close_head()
|
jbe/bsw@0
|
65 render_children()
|
jbe/bsw@0
|
66 close()
|
jbe/bsw@0
|
67 end
|
jbe/bsw@0
|
68 local node_type = node.type
|
jbe/bsw@0
|
69 if node_type == "root" then
|
jbe/bsw@0
|
70 render_children()
|
jbe/bsw@0
|
71 elseif node_type == "debug" then
|
jbe/bsw@0
|
72 open("debug")
|
jbe/bsw@0
|
73 slot.put(encode.html(node.message))
|
jbe/bsw@0
|
74 close()
|
poelzi@31
|
75 elseif node_type == "debug_table" then
|
poelzi@31
|
76 open("debug")
|
poelzi@31
|
77 slot.put("<table>")
|
poelzi@31
|
78 if type(node.message) == "table" then
|
poelzi@31
|
79 for k, v in pairs(node.message) do
|
jbe@45
|
80 slot.put("<tr><td>", encode.html(tostring(k)), "</td><td>", encode.html(tostring(v)), "</td></tr>")
|
poelzi@31
|
81 end
|
poelzi@31
|
82 slot.put("</table>")
|
poelzi@31
|
83 else
|
poelzi@31
|
84 slot.put("debug_table: not of table type")
|
poelzi@31
|
85 end
|
poelzi@31
|
86 close()
|
poelzi@29
|
87 elseif node_type == "traceback" then
|
poelzi@29
|
88 open("debug")
|
poelzi@29
|
89 slot.put('<pre>')
|
poelzi@29
|
90 slot.put(encode.html(node.message))
|
poelzi@29
|
91 slot.put('</pre>')
|
poelzi@29
|
92 close()
|
jbe/bsw@0
|
93 elseif node_type == "request" then
|
jbe/bsw@0
|
94 open("request")
|
bsw@115
|
95 open_head(node)
|
jbe/bsw@0
|
96 slot.put("REQUESTED")
|
jbe/bsw@0
|
97 if node.view then
|
jbe/bsw@0
|
98 slot.put(" VIEW")
|
jbe/bsw@0
|
99 elseif node.action then
|
jbe/bsw@0
|
100 slot.put(" ACTION")
|
jbe/bsw@0
|
101 end
|
jbe/bsw@0
|
102 slot.put(
|
jbe/bsw@0
|
103 ": ",
|
jbe/bsw@0
|
104 encode.html(node.module),
|
jbe/bsw@0
|
105 "/",
|
jbe/bsw@0
|
106 encode.html(node.view or node.action)
|
jbe/bsw@0
|
107 )
|
jbe/bsw@0
|
108 close_with_children()
|
jbe/bsw@0
|
109 elseif node_type == "config" then
|
jbe/bsw@0
|
110 open("config")
|
bsw@115
|
111 open_head(node)
|
jbe/bsw@0
|
112 slot.put('Configuration "', encode.html(node.name), '"')
|
jbe/bsw@0
|
113 close_with_children()
|
jbe/bsw@0
|
114 elseif node_type == "filter" then
|
jbe/bsw@0
|
115 open("filter")
|
bsw@115
|
116 open_head(node)
|
jbe/bsw@0
|
117 slot.put(encode.html(node.path))
|
jbe/bsw@0
|
118 close_with_children()
|
jbe/bsw@0
|
119 elseif node_type == "view" then
|
jbe/bsw@0
|
120 open("view")
|
bsw@115
|
121 open_head(node)
|
jbe/bsw@0
|
122 slot.put(
|
jbe/bsw@0
|
123 "EXECUTE VIEW: ",
|
jbe/bsw@0
|
124 encode.html(node.module),
|
jbe/bsw@0
|
125 "/",
|
jbe/bsw@0
|
126 encode.html(node.view)
|
jbe/bsw@0
|
127 )
|
jbe/bsw@0
|
128 close_with_children()
|
jbe/bsw@0
|
129 elseif node_type == "action" then
|
jbe/bsw@0
|
130 if
|
jbe/bsw@0
|
131 node.status and (
|
jbe/bsw@0
|
132 node.status == "ok" or
|
jbe/bsw@0
|
133 string.find(node.status, "^ok_")
|
jbe/bsw@0
|
134 )
|
jbe/bsw@0
|
135 then
|
jbe/bsw@0
|
136 open("action_success")
|
jbe/bsw@0
|
137 elseif
|
jbe/bsw@0
|
138 node.status and (
|
jbe/bsw@0
|
139 node.status == "error" or
|
jbe/bsw@0
|
140 string.find(node.status, "^error_")
|
jbe/bsw@0
|
141 )
|
jbe/bsw@0
|
142 then
|
jbe/bsw@0
|
143 open("action_softfail")
|
jbe/bsw@0
|
144 else
|
jbe/bsw@0
|
145 open("action_neutral")
|
jbe/bsw@0
|
146 end
|
bsw@115
|
147 open_head(node)
|
jbe/bsw@0
|
148 slot.put(
|
jbe/bsw@0
|
149 "EXECUTE ACTION: ",
|
jbe/bsw@0
|
150 encode.html(node.module),
|
jbe/bsw@0
|
151 "/",
|
jbe/bsw@0
|
152 encode.html(node.action)
|
jbe/bsw@0
|
153 )
|
jbe/bsw@0
|
154 close_head()
|
jbe/bsw@0
|
155 if node.status == "softfail" then
|
jbe/bsw@0
|
156 render_children(
|
jbe/bsw@0
|
157 '<li class="trace_action_status">Status code: "' ..
|
jbe/bsw@0
|
158 encode.html(node.failure_code) ..
|
jbe/bsw@0
|
159 '"</li>'
|
jbe/bsw@0
|
160 )
|
jbe/bsw@0
|
161 else
|
jbe/bsw@0
|
162 render_children()
|
jbe/bsw@0
|
163 end
|
jbe/bsw@0
|
164 close()
|
jbe/bsw@0
|
165 elseif node_type == "redirect" then
|
jbe/bsw@0
|
166 open("redirect")
|
bsw@115
|
167 open_head(node)
|
jbe/bsw@0
|
168 slot.put("303 REDIRECT TO VIEW: ", encode.html(node.module), "/", encode.html(node.view))
|
jbe/bsw@0
|
169 close_with_children()
|
jbe/bsw@0
|
170 elseif node_type == "forward" then
|
jbe/bsw@0
|
171 open("forward")
|
bsw@115
|
172 open_head(node)
|
jbe/bsw@0
|
173 slot.put("INTERNAL FORWARD TO VIEW: ", encode.html(node.module), "/", encode.html(node.view))
|
jbe/bsw@0
|
174 close_with_children()
|
jbe@223
|
175 --[[
|
jbe/bsw@0
|
176 elseif node_type == "exectime" then
|
jbe/bsw@0
|
177 open("exectime")
|
bsw@115
|
178 open_head(node)
|
jbe/bsw@0
|
179 slot.put(
|
jbe/bsw@0
|
180 "Finished after " ..
|
jbe@65
|
181 string.format("%.1f", extos.monotonic_hires_time() * 1000) ..
|
jbe/bsw@0
|
182 ' ms (' ..
|
jbe/bsw@0
|
183 string.format("%.1f", os.clock() * 1000) ..
|
jbe/bsw@0
|
184 ' ms CPU)'
|
jbe/bsw@0
|
185 )
|
jbe/bsw@0
|
186 close_with_children()
|
jbe@223
|
187 --]]
|
jbe/bsw@0
|
188 elseif node_type == "sql" then
|
jbe/bsw@0
|
189 open("sql")
|
jbe/bsw@0
|
190 if node.error_position then
|
jbe/bsw@0
|
191 -- error position starts counting with 1
|
jbe/bsw@0
|
192 local part1 = string.sub(node.command, 1, node.error_position - 1)
|
jbe/bsw@0
|
193 local part2 = string.sub(node.command, node.error_position)
|
jbe/bsw@0
|
194 slot.put(encode.html(part1))
|
jbe/bsw@0
|
195 slot.put('<span class="trace_error_position">⇒</span>')
|
jbe/bsw@0
|
196 slot.put(encode.html(part2))
|
jbe/bsw@0
|
197 else
|
jbe/bsw@0
|
198 slot.put(encode.html(node.command))
|
jbe/bsw@0
|
199 end
|
jbe@296
|
200 slot.put(" (execution time: ", format_time(node.execution_time), ")")
|
jbe/bsw@0
|
201 close();
|
jbe/bsw@0
|
202 elseif node_type == "error" then
|
jbe/bsw@0
|
203 open("error")
|
bsw@115
|
204 open_head(node)
|
jbe/bsw@0
|
205 slot.put("UNEXPECTED ERROR")
|
jbe/bsw@0
|
206 close_head()
|
jbe/bsw@0
|
207 close()
|
jbe/bsw@0
|
208 end
|
jbe/bsw@0
|
209 end
|