Skip to content

Commit ecb89f5

Browse files
committed
Enable support for large execution reports #547
This commit render the execution report boxplots using the report summary data collected by nextflow at runtime. The trace data is omitted when the number of tasks is greater than 10’000 (default) and the related table is not shown
1 parent 90f8dcc commit ecb89f5

File tree

6 files changed

+347
-344
lines changed

6 files changed

+347
-344
lines changed

src/main/groovy/nextflow/trace/ReportObserver.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ class ReportObserver implements TraceObserver {
235235
*/
236236
protected String renderTasksJson() {
237237
final r = getRecords()
238-
r.size()<=maxTasks ? renderJsonData(r.values()) : '[]'
238+
r.size()<=maxTasks ? renderJsonData(r.values()) : 'null'
239239
}
240240

241241
/**

src/main/groovy/nextflow/trace/ReportSummary.groovy

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,35 @@ class ReportSummary {
4141
mappers.time = { TraceRecord record -> record.get('realtime') as Double }
4242
mappers.reads = { TraceRecord record -> record.get('read_bytes') as Double }
4343
mappers.writes = { TraceRecord record -> record.get('write_bytes') as Double}
44+
45+
mappers.cpuUsage = { TraceRecord record ->
46+
final Double pcpu = record.get('%cpu') as Double
47+
final int ncpu = (record.get('cpus') ?: 1) as int
48+
if( !pcpu )
49+
return null
50+
return pcpu / ncpu as Double
51+
}
52+
53+
mappers.memUsage = { TraceRecord record ->
54+
final vmem = record.get('vmem') as Double
55+
final request = record.get('memory') as Long
56+
if( !vmem ) return null
57+
if( !request ) return null
58+
return vmem / request * 100 as Double
59+
}
60+
61+
62+
mappers.timeUsage = { TraceRecord record ->
63+
final realtime = record.get('realtime') as Long
64+
final request = record.get('time') as Long
65+
if( !realtime ) return null
66+
if( !request ) return null
67+
return realtime / request * 100 as Double
68+
}
4469
}
4570

71+
72+
4673
/**
4774
* Hold the summary for each series ie. cpu, memory, time, disk reads, disk writes
4875
*/
@@ -118,8 +145,6 @@ class ReportSummary {
118145

119146
private int count
120147

121-
private Integer digits = 2
122-
123148
@PackageScope Double min
124149

125150
@PackageScope Double max
@@ -154,11 +179,8 @@ class ReportSummary {
154179
}
155180
}
156181

157-
private double round( double value ) {
158-
if( digits == null )
159-
return value
160-
final x = Math.pow(10,digits)
161-
Math.round( value * x ) / x
182+
private BigDecimal round( double value ) {
183+
Math.round( value * 100 ) / 100
162184
}
163185

164186
void add( TraceRecord record ) {
@@ -208,11 +230,16 @@ class ReportSummary {
208230
result.q2 = round(quantile(sorted, 50))
209231
result.q3 = round(quantile(sorted, 75))
210232
result.max = round(quantile(sorted, 100))
233+
// discard entry with all zero
234+
if( result.min == 0 && result.min == result.max )
235+
return null
236+
211237
result.minLabel = minLabel
212238
result.maxLabel = maxLabel
213239
result.q1Label = q1Label
214240
result.q2Label = q2Label
215241
result.q3Label = q3Label
242+
216243
return result
217244
}
218245

src/main/resources/nextflow/trace/ReportTemplate.html

Lines changed: 51 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -208,76 +208,93 @@ <h2 id="resources" style="padding-top: 80px;">Resource Usage</h2>
208208
<h4>CPU Usage</h4>
209209
<ul class="nav nav-tabs" id="cpuplot_tabs" role="tablist">
210210
<li class="nav-item">
211-
<a class="nav-link active" id="pctcpuplot_tablink" data-toggle="tab" href="#pctcpuplot_tabpanel" role="tab" aria-controls="cpuplot_tabpanel" aria-expanded="true">
212-
% Allocated
211+
<a class="nav-link active" id="cpuplot_tablink" data-toggle="tab" href="#cpuplot_tabpanel" role="tab" aria-controls="pctcpuplot_tabpanel" aria-expanded="false">
212+
Raw Usage
213213
</a>
214214
</li>
215215
<li class="nav-item">
216-
<a class="nav-link" id="cpuplot_tablink" data-toggle="tab" href="#cpuplot_tabpanel" role="tab" aria-controls="pctcpuplot_tabpanel" aria-expanded="false">
217-
Raw Usage
216+
<a class="nav-link" id="pctcpuplot_tablink" data-toggle="tab" href="#pctcpuplot_tabpanel" role="tab" aria-controls="cpuplot_tabpanel" aria-expanded="true">
217+
% Allocated
218218
</a>
219219
</li>
220220
</ul>
221221
<div class="tab-content" id="cpuplot_tabcontent">
222-
<div class="tab-pane fade show active" id="pctcpuplot_tabpanel" role="tabpanel">
223-
<div id="pctcpuplot"></div>
224-
</div>
225-
<div class="tab-pane fade" id="cpuplot_tabpanel" role="tabpanel">
222+
<div class="tab-pane fade show active" id="cpuplot_tabpanel" role="tabpanel">
226223
<div id="cpuplot"></div>
227224
</div>
225+
<div class="tab-pane fade" id="pctcpuplot_tabpanel" role="tabpanel">
226+
<div id="pctcpuplot"></div>
227+
</div>
228+
228229
</div>
229230

230231
<h4>Memory Usage</h4>
231232
<ul class="nav nav-tabs" id="memplot_tabs" role="tablist">
232233
<li class="nav-item">
233-
<a class="nav-link active" id="pctmemplot_tablink" data-toggle="tab" href="#pctmemplot_tabpanel" role="tab" aria-controls="pctmemplot_tabpanel" aria-expanded="true">
234-
% Allocated
234+
<a class="nav-link active" id="memplotlot_tablink" data-toggle="tab" href="#memplotlot_tabpanel" role="tab" aria-controls="memplotlot_tabpanel" aria-expanded="false">
235+
Raw Usage
235236
</a>
236237
</li>
237238
<li class="nav-item">
238-
<a class="nav-link" id="memplotlot_tablink" data-toggle="tab" href="#memplotlot_tabpanel" role="tab" aria-controls="memplotlot_tabpanel" aria-expanded="false">
239-
Raw Usage
239+
<a class="nav-link" id="pctmemplot_tablink" data-toggle="tab" href="#pctmemplot_tabpanel" role="tab" aria-controls="pctmemplot_tabpanel" aria-expanded="true">
240+
% Allocated
240241
</a>
241242
</li>
242243
</ul>
243244
<div class="tab-content" id="memplot_tabcontent">
244-
<div class="tab-pane fade show active" id="pctmemplot_tabpanel" role="tabpanel">
245-
<div id="pctmemplot"></div>
246-
</div>
247-
<div class="tab-pane fade" id="memplotlot_tabpanel" role="tabpanel">
245+
<div class="tab-pane fade show active" id="memplotlot_tabpanel" role="tabpanel">
248246
<div id="memplot"></div>
249247
</div>
248+
<div class="tab-pane fade" id="pctmemplot_tabpanel" role="tabpanel">
249+
<div id="pctmemplot"></div>
250+
</div>
250251
</div>
251252

252253
<h4 id="timeplot_header">Job Duration</h4>
253254
<ul class="nav nav-tabs" id="timeplot_tabs" role="tablist">
254255
<li class="nav-item">
255-
<a class="nav-link active" id="pcttimeplot_tablink" data-toggle="tab" href="#pcttimeplot_tabpanel" role="tab" aria-controls="pcttimeplot_tabpanel" aria-expanded="true">
256-
% Allocated
256+
<a class="nav-link active" id="timeplot_tablink" data-toggle="tab" href="#timeplot_tabpanel" role="tab" aria-controls="timeplot_tabpanel" aria-expanded="false">
257+
Raw Usage
257258
</a>
258259
</li>
259260
<li class="nav-item">
260-
<a class="nav-link" id="timeplot_tablink" data-toggle="tab" href="#timeplot_tabpanel" role="tab" aria-controls="timeplot_tabpanel" aria-expanded="false">
261-
Raw Usage
261+
<a class="nav-link" id="pcttimeplot_tablink" data-toggle="tab" href="#pcttimeplot_tabpanel" role="tab" aria-controls="pcttimeplot_tabpanel" aria-expanded="true">
262+
% Allocated
262263
</a>
263264
</li>
264265
</ul>
265266
<div class="tab-content" id="timeplot_tabcontent">
266-
<div class="tab-pane fade show active" id="pcttimeplot_tabpanel" role="tabpanel">
267-
<div id="pcttimeplot"></div>
268-
</div>
269-
<div class="tab-pane fade" id="timeplot_tabpanel" role="tabpanel">
267+
<div class="tab-pane fade show active" id="timeplot_tabpanel" role="tabpanel">
270268
<div id="timeplot"></div>
271269
</div>
270+
<div class="tab-pane fade" id="pcttimeplot_tabpanel" role="tabpanel">
271+
<div id="pcttimeplot"></div>
272+
</div>
272273
</div>
273274

274-
<div id="readwriteplot_div">
275-
<h4>Disk Read / Write</h4>
276-
<p>Number of bytes directly read from disk added to the number of bytes the process originally
277-
dirtied in the page-cache for each process.</p>
278-
<div id="readwriteplot"></div>
275+
<h4 id="readwriteplot_header">Disk I/O</h4>
276+
<ul class="nav nav-tabs" id="readwriteplot_tabs" role="tablist">
277+
<li class="nav-item">
278+
<a class="nav-link active" id="readplot_tablink" data-toggle="tab" href="#readplot_tabpanel" role="tab" aria-controls="readplot_tabpanel" aria-expanded="true">
279+
Read
280+
</a>
281+
</li>
282+
<li class="nav-item">
283+
<a class="nav-link" id="writeplot_tablink" data-toggle="tab" href="#writeplot_tabpanel" role="tab" aria-controls="writeplot_tabpanel" aria-expanded="false">
284+
Write
285+
</a>
286+
</li>
287+
</ul>
288+
<div class="tab-content" id="readwriteplot_tabcontent">
289+
<div class="tab-pane fade show active" id="readplot_tabpanel" role="tabpanel">
290+
<div id="readplot"></div>
291+
</div>
292+
<div class="tab-pane fade" id="writeplot_tabpanel" role="tabpanel">
293+
<div id="writeplot"></div>
294+
</div>
279295
</div>
280296

297+
<div id="table-container">
281298
<h2 id="tasks" style="padding-top: 80px;">Tasks</h2>
282299
<p>This table shows information about each task in the workflow. Use the search box on the right
283300
to filter rows for specific values. Clicking headers will sort the table by that value and
@@ -291,49 +308,11 @@ <h2 id="tasks" style="padding-top: 80px;">Tasks</h2>
291308
</form>
292309
</div>
293310
<div class="container-fluid">
294-
<table class="table small table-striped" id="tasks_table">
295-
<thead>
296-
<tr>
297-
<th>task_id</th>
298-
<th>process</th>
299-
<th>tag</th>
300-
<th>status</th>
301-
<th>hash</th>
302-
<th>allocated cpus</th>
303-
<th>%cpu</th>
304-
<th>allocated memory (bytes)</th>
305-
<th>%mem</th>
306-
<th>vmem</th>
307-
<th>rss</th>
308-
<th>peak_vmem</th>
309-
<th>peak_rss</th>
310-
<th>allocated time</th>
311-
<th>duration</th>
312-
<th>realtime</th>
313-
<th>script</th>
314-
<th>exit</th>
315-
<th>submit</th>
316-
<th>start</th>
317-
<th>complete</th>
318-
<th>rchar</th>
319-
<th>wchar</th>
320-
<th>syscr</th>
321-
<th>syscw</th>
322-
<th>read_bytes</th>
323-
<th>write_bytes</th>
324-
<th>native_id</th>
325-
<th>name</th>
326-
<th>module</th>
327-
<th>container</th>
328-
<th>disk</th>
329-
<th>attempt</th>
330-
<th>scratch</th>
331-
<th>workdir</th>
332-
</tr>
333-
</thead>
334-
<tbody></tbody>
335-
</table>
336-
311+
<table class="table small table-striped" id="tasks_table"></table>
312+
</div>
313+
</div>
314+
<div id="no-table-container" class="container">
315+
(tasks table omitted because the dataset is too big)
337316
</div>
338317

339318
<footer>

0 commit comments

Comments
 (0)