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