Skip to content

Commit 1720a12

Browse files
authored
v1.0
1 parent 5e64c49 commit 1720a12

File tree

1 file changed

+234
-0
lines changed

1 file changed

+234
-0
lines changed

kla.html

+234
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="UTF-8">
5+
<style type="text/css">
6+
#top {display: flex;flex-direction: row;flex-grow:1;width: 100%}
7+
#main {display: flex;flex-direction: row}
8+
#jobs {width: 17vw;min-width: 600px; max-height: 94vh;overflow:auto}
9+
#log {display: flex;flex-direction: column;width: 99%; max-height: 94vh;overflow:auto; font-family: monospace;}
10+
ul {list-style:none;padding-left:10px;}
11+
.zero_duration {}
12+
.no_log {}
13+
.collapsed {display: none}
14+
.children_collapsed {}
15+
</style>
16+
</head>
17+
<body>
18+
<div id="top">
19+
<button type="button" onclick="process_log();">Process log</button>
20+
<button type="button" onclick="show_hide_ta();">Show/Hide input area</button>
21+
<input id="chShowZeroes" type="checkbox" value="1" checked onchange="set_jobs_visibility();"/><label>Show entries with 0 duration</label>
22+
<input id="chNoLogs" type="checkbox" value="1" checked onchange="set_jobs_visibility();"/><label>Show entries without log</label>
23+
<input id="chShowZeroesInLog" type="checkbox" value="1" checked onchange="show_log(current_log);"/><label>Show entries with 0 duration in log</label>
24+
</div>
25+
<textarea id="input_area" rows="48" cols="160">
26+
</textarea>
27+
<div id="main">
28+
<div id="jobs"></div>
29+
<div id="log"></div>
30+
</div>
31+
<script type="text/javascript">
32+
33+
var job_name = '';
34+
var entries = {};
35+
var regDate = /(\d{4})\/(\d{2})\/(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
36+
var current_log = '';
37+
var entries_wo_parent = 0;
38+
39+
String.prototype.toHHMMSS = function () {
40+
var sec_num = parseInt(this, 10);
41+
var h = Math.floor(sec_num / 3600);
42+
var m = Math.floor((sec_num - (h * 3600)) / 60);
43+
var s = sec_num - (h * 3600) - (m * 60);
44+
45+
return (h < 10 ? '0' : '') + h + ':' + (m < 10 ? '0' : '') + m + ':' + (s < 10 ? '0' : '') + s;
46+
}
47+
48+
String.prototype.fromKettleDate = function () {
49+
var da = regDate.exec(this);
50+
var d = new Date((da[1]),(da[2])-1,(da[3]),(da[4]),(da[5]),(da[6]));
51+
return d;
52+
}
53+
54+
function show_hide_ta(){
55+
var TA = document.getElementById('input_area');
56+
if(TA.style.display == "block")
57+
TA.style.display = "none";
58+
else
59+
TA.style.display = "block";
60+
}
61+
function process_log(){
62+
entries = {};
63+
entries_wo_parent = 0;
64+
document.getElementById('input_area').style.display = "none";
65+
var lines = document.getElementById('input_area').value.split('\n');
66+
for(var i = 0;i < lines.length;i++){
67+
var l = lines[i].split(' - ', 4);
68+
if (l.length >= 3){
69+
var event_date = l[0].fromKettleDate();
70+
if (l.length == 3){
71+
e_name = l[1];
72+
e_message = l[2];
73+
}
74+
else
75+
if (entries[l[1] + ' - ' + l[2]]){
76+
e_name = l[1] + ' - ' + l[2];
77+
e_message = l[3];
78+
}
79+
else {
80+
e_name = l[1];
81+
e_message = l[2] + ' - ' + l[3];
82+
}
83+
84+
if (e_message == 'Start of job execution')
85+
job_name = e_name;
86+
87+
if (entries[e_name]) {
88+
entries[e_name]['log'].push([i, lines[i]]);
89+
entries[e_name]['finish_time'] = event_date;
90+
entries[e_name]['duration'] = String((entries[e_name]['finish_time'] - entries[e_name]['start_time']) / 1000).toHHMMSS();
91+
92+
var parent_entry = entries[e_name]['parent'];
93+
var deepness = 30;
94+
while (parent_entry != '' && deepness > 0) {
95+
entries[parent_entry]['finish_time'] = event_date;
96+
entries[parent_entry]['duration'] = String((entries[parent_entry]['finish_time'] - entries[parent_entry]['start_time']) / 1000).toHHMMSS();
97+
parent_entry = entries[parent_entry]['parent'];
98+
deepness--;
99+
}
100+
if (deepness = 0)
101+
alert('Too deep parent-child relationship');
102+
}
103+
else {
104+
entries[e_name] = {'parent': '', 'start_time': event_date, 'finish_time':event_date, 'duration': '0'.toHHMMSS(), 'log':[[i, lines[i]]], 'start_row':i, 'num_children':0, 'full_parents':['']};
105+
entries_wo_parent++;
106+
}
107+
108+
var started = e_message.split('Starting entry [');
109+
if (started.length > 1)
110+
if (! entries[started[1].split(']')[0]]) {
111+
entries[started[1].split(']')[0]] = {'parent': e_name, 'start_time': event_date, 'finish_time':event_date, 'duration': '0'.toHHMMSS()
112+
, 'log':[], 'start_row':i, 'num_children':0, 'full_parents':entries[e_name]['full_parents'].concat([e_name])};
113+
entries[e_name]['num_children'] ++;
114+
}
115+
116+
}
117+
}
118+
119+
drawJobs();
120+
show_log(job_name);
121+
}
122+
123+
function format_entry(ent){
124+
res = '<a id="a_'+ ent + '" style="color: '
125+
if (entries[ent]['log'].toString().toLowerCase().match('error'))
126+
res += 'red';
127+
else
128+
res += 'blue';
129+
130+
res += '" " href="#" onclick="show_log(\''+ ent +'\', event.shiftKey);return false;" '
131+
if (entries[ent]['num_children'] == 0)
132+
res += '>' + ent + ' (' + entries[ent]['duration'] + ')'
133+
else
134+
res += 'ondblclick="expand_collapse(\'ul_'+ ent +'\', event.shiftKey);return false;"><b>(' + entries[ent]['num_children'] + ') '+ ent + ' (' + entries[ent]['duration'] + ')</b>'
135+
return res + '</a>';
136+
}
137+
138+
function drawJobs() {
139+
var jobs_div = document.getElementById('jobs');
140+
jobs_div.innerHTML = '';
141+
tmp_j = document.createElement('ul');
142+
tmp_j.setAttribute('id','ul_' + job_name);
143+
tmp_j.innerHTML = format_entry(job_name);
144+
jobs_div.appendChild(tmp_j);
145+
146+
other_j = document.createElement('ul');
147+
other_j.setAttribute('id','ul_');
148+
other_j.innerHTML = '<a id="a_" style="color: blue " " href="#" ondblclick="expand_collapse(\'ul_\', event.shiftKey);return false;"><b>(' + entries_wo_parent + ') Other</b></a>';
149+
jobs_div.appendChild(other_j);
150+
151+
for (entry in entries) {
152+
if (entry != job_name){
153+
tmp_j = document.createElement('ul');
154+
tmp_j.setAttribute('id','ul_' + entry);
155+
tmp_j.innerHTML = format_entry(entry);
156+
if (entries[entry]['duration'] == '00:00:00')
157+
tmp_j.className += ' zero_duration'
158+
if (entries[entry]['log'].length == 0)
159+
tmp_j.className += ' no_log'
160+
161+
p_job = document.getElementById('ul_' + entries[entry]['parent'])
162+
p_job.appendChild(tmp_j);
163+
}
164+
}
165+
set_jobs_visibility();
166+
};
167+
168+
function show_log(ent){
169+
current_log = ent;
170+
var log_div = document.getElementById('log');
171+
if (entries[ent]['duration'] != '00:00:00' || document.getElementById('chShowZeroesInLog').checked) {
172+
logs = entries[ent]['log'];
173+
if (entries[ent]['num_children'] > 0) {
174+
ch_logs = return_children_log(ent);
175+
logs = logs.concat(ch_logs);
176+
}
177+
logs.sort(log_sort);
178+
var res = '';
179+
for (i in logs)
180+
res += logs[i][1] + '<br>';
181+
log_div.innerHTML = res;
182+
}
183+
else
184+
log_div.innerHTML = '';
185+
}
186+
187+
function log_sort(a,b){
188+
return a[0] - b[0];
189+
}
190+
191+
192+
function return_children_log(ent){
193+
res = []
194+
for (ent1 in entries)
195+
if (entries[ent1]['full_parents'].indexOf(ent) >= 0 && (entries[ent1]['duration'] != '00:00:00' || document.getElementById('chShowZeroesInLog').checked)) {
196+
res = res.concat(entries[ent1]['log']);
197+
}
198+
return res
199+
}
200+
201+
function expand_collapse(ul_clicked){
202+
var ul = document.getElementById(ul_clicked)
203+
var show_children = ul.className.match(/(?:^|\s)children_collapsed(?!\S)/)
204+
if (show_children)
205+
ul.className = ul.className.replace(/(?:^|\s)children_collapsed(?!\S)/g,'')
206+
else
207+
ul.className += ' children_collapsed'
208+
209+
for (c in ul.childNodes) {
210+
if (ul.childNodes[c].tagName)
211+
if (ul.childNodes[c].tagName.toLowerCase() == 'ul')
212+
if (show_children)
213+
ul.childNodes[c].className = ul.childNodes[c].className.replace(/(?:^|\s)collapsed(?!\S)/g,'')
214+
else
215+
ul.childNodes[c].className += ' collapsed'
216+
}
217+
}
218+
219+
function set_jobs_visibility(){
220+
var rules = document.styleSheets[0].cssRules
221+
for (rule in rules){
222+
switch (rules[rule].selectorText) {
223+
case '.zero_duration':
224+
rules[rule].style.display = (document.getElementById('chShowZeroes').checked ? '': 'none'); break;
225+
case '.no_log':
226+
rules[rule].style.display = (document.getElementById('chNoLogs').checked ? '' : 'none'); break;
227+
}
228+
229+
}
230+
}
231+
show_hide_ta();
232+
</script>
233+
</body>
234+
</html>

0 commit comments

Comments
 (0)