Skip to content

Commit a5853fc

Browse files
authored
IGNITE-24288 Add system view data to HTML report (#297)
1 parent 9adeebe commit a5853fc

3 files changed

Lines changed: 123 additions & 0 deletions

File tree

modules/performance-statistics-ext/report/index.html

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@
7878
<a class="nav-link" data-toggle="tab" href="#computeStatisticsTab" role="tab"
7979
aria-selected="false">Tasks and jobs</a>
8080
</li>
81+
<li class="nav-item">
82+
<a class="nav-link" data-toggle="tab" href="#systemViewTab" role="tab"
83+
aria-selected="false">System views</a>
84+
</li>
8185
</ul>
8286
</div>
8387
</nav>
@@ -150,6 +154,15 @@ <h2 class="mt-4">Overall statistics</h2>
150154
<h2 class="mt-4">Top of slowest tasks</h2>
151155
<table data-toggle="table" id="topSlowComputeTable"></table>
152156
</div>
157+
<div class="tab-pane fade" id="systemViewTab" role="tabpanel">
158+
<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
159+
<h1 class="h2">System views</h1>
160+
</div>
161+
<select id="sysViewSearchNodes" class="selectpicker" data-live-search="true"></select>
162+
<select id="searchViews" class="selectpicker" data-live-search="true"></select>
163+
164+
<div id="systemViewTableDiv"></div>
165+
</div>
153166
</div>
154167
</main>
155168
</div>
@@ -186,6 +199,7 @@ <h2 class="mt-4">Top of slowest tasks</h2>
186199
<script type="text/javascript" src="js/indexQueryTab.js"></script>
187200
<script type="text/javascript" src="js/txTab.js"></script>
188201
<script type="text/javascript" src="js/computeTab.js"></script>
202+
<script type="text/javascript" src="js/systemViewTab.js"></script>
189203

190204
</body>
191205
</html>
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
const sysViewSearchNodesSelect = $('#sysViewSearchNodes');
19+
const searchViewsSelect = $('#searchViews');
20+
21+
function generateColumns(viewName, nodeId) {
22+
const keys = [];
23+
24+
if (nodeId === "total")
25+
keys.push("viewNodeId");
26+
27+
const hasSchema = Object.values(REPORT_DATA['systemView']).some(nodeData => {
28+
if (nodeData[viewName]) {
29+
keys.push(...nodeData[viewName]['schema']);
30+
return true;
31+
}
32+
return false;
33+
});
34+
35+
if (!hasSchema)
36+
return null;
37+
38+
return keys.map((key, index) => ({
39+
field: index,
40+
title: key,
41+
sortable: true
42+
}));
43+
}
44+
45+
function generateRows(viewName, nodeId) {
46+
if (nodeId !== "total") {
47+
const view = REPORT_DATA['systemView'][nodeId][viewName];
48+
if (view)
49+
return view['data'];
50+
51+
return [];
52+
}
53+
54+
return Object.entries(REPORT_DATA['systemView']).flatMap(([nodeId, nodeData]) => {
55+
if (!nodeData[viewName])
56+
return [];
57+
58+
return nodeData[viewName]['data'].map(row => [nodeId, ...row]);
59+
});
60+
}
61+
62+
function drawSystemViewsTable() {
63+
const div = document.getElementById('systemViewTableDiv');
64+
div.innerHTML = "";
65+
66+
const nodeId = sysViewSearchNodesSelect.val();
67+
const viewName = searchViewsSelect.val();
68+
69+
const columns = generateColumns(viewName, nodeId);
70+
const rows = generateRows(viewName, nodeId);
71+
72+
const table = document.createElement('table');
73+
74+
table.id = 'systemViewTable';
75+
div.appendChild(table);
76+
77+
$(table).bootstrapTable({
78+
formatNoMatches: () => `The "${viewName}" system view is empty on node "${nodeId}".`,
79+
pagination: true,
80+
search: true,
81+
columns: columns,
82+
data: rows,
83+
sortOrder: 'desc'
84+
});
85+
}
86+
87+
buildSelectNodesSystemView(sysViewSearchNodesSelect, drawSystemViewsTable);
88+
buildSelectSystemViews(searchViewsSelect, drawSystemViewsTable);
89+
90+
drawSystemViewsTable();

modules/performance-statistics-ext/report/js/utils.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,22 @@ function buildSelectNodes(el, onSelect) {
8484

8585
el.on('changed.bs.select', onSelect);
8686
}
87+
88+
/** Builds bootstrap-select for nodes in system view tab. */
89+
function buildSelectNodesSystemView(el, onSelect) {
90+
el.append('<option data-content="<b>All nodes</b>" value="total"/>');
91+
92+
Object.keys(REPORT_DATA['systemView']).forEach(nodeId =>
93+
el.append('<option data-content="' + nodeId + '" value="' + nodeId + '"/>'));
94+
95+
el.on('changed.bs.select', onSelect);
96+
}
97+
98+
/** Builds bootstrap-select for system views. */
99+
function buildSelectSystemViews(el, onSelect) {
100+
const views = new Set(Object.values(REPORT_DATA['systemView']).flatMap(nodeData => Object.keys(nodeData)));
101+
102+
views.forEach(view => el.append('<option data-content="' + view + '" value="' + view + '"/>'));
103+
104+
el.on('changed.bs.select', onSelect);
105+
}

0 commit comments

Comments
 (0)