0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 var threadDumpEnabled = false;
0019
0020 function setThreadDumpEnabled(val) {
0021 threadDumpEnabled = val;
0022 }
0023
0024 function getThreadDumpEnabled() {
0025 return threadDumpEnabled;
0026 }
0027
0028 function formatStatus(status, type, row) {
0029 if (row.isBlacklisted) {
0030 return "Blacklisted";
0031 }
0032
0033 if (status) {
0034 if (row.blacklistedInStages.length == 0) {
0035 return "Active"
0036 }
0037 return "Active (Blacklisted in Stages: [" + row.blacklistedInStages.join(", ") + "])";
0038 }
0039 return "Dead"
0040 }
0041
0042 function formatResourceCells(resources) {
0043 var result = ""
0044 var count = 0
0045 $.each(resources, function (name, resInfo) {
0046 if (count > 0) {
0047 result += ", "
0048 }
0049 result += name + ': [' + resInfo.addresses.join(", ") + ']'
0050 count += 1
0051 });
0052 return result
0053 }
0054
0055 jQuery.extend(jQuery.fn.dataTableExt.oSort, {
0056 "title-numeric-pre": function (a) {
0057 var x = a.match(/title="*(-?[0-9\.]+)/)[1];
0058 return parseFloat(x);
0059 },
0060
0061 "title-numeric-asc": function (a, b) {
0062 return ((a < b) ? -1 : ((a > b) ? 1 : 0));
0063 },
0064
0065 "title-numeric-desc": function (a, b) {
0066 return ((a < b) ? 1 : ((a > b) ? -1 : 0));
0067 }
0068 });
0069
0070 $(document).ajaxStop($.unblockUI);
0071 $(document).ajaxStart(function () {
0072 $.blockUI({message: '<h3>Loading Executors Page...</h3>'});
0073 });
0074
0075 function logsExist(execs) {
0076 return execs.some(function(exec) {
0077 return !($.isEmptyObject(exec["executorLogs"]));
0078 });
0079 }
0080
0081 // Determine Color Opacity from 0.5-1
0082 // activeTasks range from 0 to maxTasks
0083 function activeTasksAlpha(activeTasks, maxTasks) {
0084 return maxTasks > 0 ? ((activeTasks / maxTasks) * 0.5 + 0.5) : 1;
0085 }
0086
0087 function activeTasksStyle(activeTasks, maxTasks) {
0088 return activeTasks > 0 ? ("hsla(240, 100%, 50%, " + activeTasksAlpha(activeTasks, maxTasks) + ")") : "";
0089 }
0090
0091 // failedTasks range max at 10% failure, alpha max = 1
0092 function failedTasksAlpha(failedTasks, totalTasks) {
0093 return totalTasks > 0 ?
0094 (Math.min(10 * failedTasks / totalTasks, 1) * 0.5 + 0.5) : 1;
0095 }
0096
0097 function failedTasksStyle(failedTasks, totalTasks) {
0098 return failedTasks > 0 ?
0099 ("hsla(0, 100%, 50%, " + failedTasksAlpha(failedTasks, totalTasks) + ")") : "";
0100 }
0101
0102 // totalDuration range from 0 to 50% GC time, alpha max = 1
0103 function totalDurationAlpha(totalGCTime, totalDuration) {
0104 return totalDuration > 0 ?
0105 (Math.min(totalGCTime / totalDuration + 0.5, 1)) : 1;
0106 }
0107
0108 // When GCTimePercent is edited change ToolTips.TASK_TIME to match
0109 var GCTimePercent = 0.1;
0110
0111 function totalDurationStyle(totalGCTime, totalDuration) {
0112 // Red if GC time over GCTimePercent of total time
0113 return (totalGCTime > GCTimePercent * totalDuration) ?
0114 ("hsla(0, 100%, 50%, " + totalDurationAlpha(totalGCTime, totalDuration) + ")") : "";
0115 }
0116
0117 function totalDurationColor(totalGCTime, totalDuration) {
0118 return (totalGCTime > GCTimePercent * totalDuration) ? "white" : "black";
0119 }
0120
0121 var sumOptionalColumns = [3, 4];
0122 var execOptionalColumns = [5, 6, 9];
0123 var execDataTable;
0124 var sumDataTable;
0125
0126 function reselectCheckboxesBasedOnTaskTableState() {
0127 var allChecked = true;
0128 if (typeof execDataTable !== "undefined") {
0129 for (var k = 0; k < execOptionalColumns.length; k++) {
0130 if (execDataTable.column(execOptionalColumns[k]).visible()) {
0131 $("[data-exec-col-idx=" + execOptionalColumns[k] + "]").prop("checked", true);
0132 } else {
0133 allChecked = false;
0134 }
0135 }
0136 }
0137 if (allChecked) {
0138 $("#select-all-box").prop("checked", true);
0139 }
0140 }
0141
0142 $(document).ready(function () {
0143 setDataTableDefaults();
0144
0145 var executorsSummary = $("#active-executors");
0146
0147 getStandAloneAppId(function (appId) {
0148
0149 var endPoint = createRESTEndPointForExecutorsPage(appId);
0150 $.getJSON(endPoint, function (response, status, jqXHR) {
0151 var allExecCnt = 0;
0152 var allRDDBlocks = 0;
0153 var allMemoryUsed = 0;
0154 var allMaxMemory = 0;
0155 var allOnHeapMemoryUsed = 0;
0156 var allOnHeapMaxMemory = 0;
0157 var allOffHeapMemoryUsed = 0;
0158 var allOffHeapMaxMemory = 0;
0159 var allDiskUsed = 0;
0160 var allTotalCores = 0;
0161 var allMaxTasks = 0;
0162 var allActiveTasks = 0;
0163 var allFailedTasks = 0;
0164 var allCompletedTasks = 0;
0165 var allTotalTasks = 0;
0166 var allTotalDuration = 0;
0167 var allTotalGCTime = 0;
0168 var allTotalInputBytes = 0;
0169 var allTotalShuffleRead = 0;
0170 var allTotalShuffleWrite = 0;
0171 var allTotalBlacklisted = 0;
0172
0173 var activeExecCnt = 0;
0174 var activeRDDBlocks = 0;
0175 var activeMemoryUsed = 0;
0176 var activeMaxMemory = 0;
0177 var activeOnHeapMemoryUsed = 0;
0178 var activeOnHeapMaxMemory = 0;
0179 var activeOffHeapMemoryUsed = 0;
0180 var activeOffHeapMaxMemory = 0;
0181 var activeDiskUsed = 0;
0182 var activeTotalCores = 0;
0183 var activeMaxTasks = 0;
0184 var activeActiveTasks = 0;
0185 var activeFailedTasks = 0;
0186 var activeCompletedTasks = 0;
0187 var activeTotalTasks = 0;
0188 var activeTotalDuration = 0;
0189 var activeTotalGCTime = 0;
0190 var activeTotalInputBytes = 0;
0191 var activeTotalShuffleRead = 0;
0192 var activeTotalShuffleWrite = 0;
0193 var activeTotalBlacklisted = 0;
0194
0195 var deadExecCnt = 0;
0196 var deadRDDBlocks = 0;
0197 var deadMemoryUsed = 0;
0198 var deadMaxMemory = 0;
0199 var deadOnHeapMemoryUsed = 0;
0200 var deadOnHeapMaxMemory = 0;
0201 var deadOffHeapMemoryUsed = 0;
0202 var deadOffHeapMaxMemory = 0;
0203 var deadDiskUsed = 0;
0204 var deadTotalCores = 0;
0205 var deadMaxTasks = 0;
0206 var deadActiveTasks = 0;
0207 var deadFailedTasks = 0;
0208 var deadCompletedTasks = 0;
0209 var deadTotalTasks = 0;
0210 var deadTotalDuration = 0;
0211 var deadTotalGCTime = 0;
0212 var deadTotalInputBytes = 0;
0213 var deadTotalShuffleRead = 0;
0214 var deadTotalShuffleWrite = 0;
0215 var deadTotalBlacklisted = 0;
0216
0217 response.forEach(function (exec) {
0218 var memoryMetrics = {
0219 usedOnHeapStorageMemory: 0,
0220 usedOffHeapStorageMemory: 0,
0221 totalOnHeapStorageMemory: 0,
0222 totalOffHeapStorageMemory: 0
0223 };
0224
0225 exec.memoryMetrics = exec.hasOwnProperty('memoryMetrics') ? exec.memoryMetrics : memoryMetrics;
0226 });
0227
0228 response.forEach(function (exec) {
0229 allExecCnt += 1;
0230 allRDDBlocks += exec.rddBlocks;
0231 allMemoryUsed += exec.memoryUsed;
0232 allMaxMemory += exec.maxMemory;
0233 allOnHeapMemoryUsed += exec.memoryMetrics.usedOnHeapStorageMemory;
0234 allOnHeapMaxMemory += exec.memoryMetrics.totalOnHeapStorageMemory;
0235 allOffHeapMemoryUsed += exec.memoryMetrics.usedOffHeapStorageMemory;
0236 allOffHeapMaxMemory += exec.memoryMetrics.totalOffHeapStorageMemory;
0237 allDiskUsed += exec.diskUsed;
0238 allTotalCores += exec.totalCores;
0239 allMaxTasks += exec.maxTasks;
0240 allActiveTasks += exec.activeTasks;
0241 allFailedTasks += exec.failedTasks;
0242 allCompletedTasks += exec.completedTasks;
0243 allTotalTasks += exec.totalTasks;
0244 allTotalDuration += exec.totalDuration;
0245 allTotalGCTime += exec.totalGCTime;
0246 allTotalInputBytes += exec.totalInputBytes;
0247 allTotalShuffleRead += exec.totalShuffleRead;
0248 allTotalShuffleWrite += exec.totalShuffleWrite;
0249 allTotalBlacklisted += exec.isBlacklisted ? 1 : 0;
0250 if (exec.isActive) {
0251 activeExecCnt += 1;
0252 activeRDDBlocks += exec.rddBlocks;
0253 activeMemoryUsed += exec.memoryUsed;
0254 activeMaxMemory += exec.maxMemory;
0255 activeOnHeapMemoryUsed += exec.memoryMetrics.usedOnHeapStorageMemory;
0256 activeOnHeapMaxMemory += exec.memoryMetrics.totalOnHeapStorageMemory;
0257 activeOffHeapMemoryUsed += exec.memoryMetrics.usedOffHeapStorageMemory;
0258 activeOffHeapMaxMemory += exec.memoryMetrics.totalOffHeapStorageMemory;
0259 activeDiskUsed += exec.diskUsed;
0260 activeTotalCores += exec.totalCores;
0261 activeMaxTasks += exec.maxTasks;
0262 activeActiveTasks += exec.activeTasks;
0263 activeFailedTasks += exec.failedTasks;
0264 activeCompletedTasks += exec.completedTasks;
0265 activeTotalTasks += exec.totalTasks;
0266 activeTotalDuration += exec.totalDuration;
0267 activeTotalGCTime += exec.totalGCTime;
0268 activeTotalInputBytes += exec.totalInputBytes;
0269 activeTotalShuffleRead += exec.totalShuffleRead;
0270 activeTotalShuffleWrite += exec.totalShuffleWrite;
0271 activeTotalBlacklisted += exec.isBlacklisted ? 1 : 0;
0272 } else {
0273 deadExecCnt += 1;
0274 deadRDDBlocks += exec.rddBlocks;
0275 deadMemoryUsed += exec.memoryUsed;
0276 deadMaxMemory += exec.maxMemory;
0277 deadOnHeapMemoryUsed += exec.memoryMetrics.usedOnHeapStorageMemory;
0278 deadOnHeapMaxMemory += exec.memoryMetrics.totalOnHeapStorageMemory;
0279 deadOffHeapMemoryUsed += exec.memoryMetrics.usedOffHeapStorageMemory;
0280 deadOffHeapMaxMemory += exec.memoryMetrics.totalOffHeapStorageMemory;
0281 deadDiskUsed += exec.diskUsed;
0282 deadTotalCores += exec.totalCores;
0283 deadMaxTasks += exec.maxTasks;
0284 deadActiveTasks += exec.activeTasks;
0285 deadFailedTasks += exec.failedTasks;
0286 deadCompletedTasks += exec.completedTasks;
0287 deadTotalTasks += exec.totalTasks;
0288 deadTotalDuration += exec.totalDuration;
0289 deadTotalGCTime += exec.totalGCTime;
0290 deadTotalInputBytes += exec.totalInputBytes;
0291 deadTotalShuffleRead += exec.totalShuffleRead;
0292 deadTotalShuffleWrite += exec.totalShuffleWrite;
0293 deadTotalBlacklisted += exec.isBlacklisted ? 1 : 0;
0294 }
0295 });
0296
0297 var totalSummary = {
0298 "execCnt": ( "Total(" + allExecCnt + ")"),
0299 "allRDDBlocks": allRDDBlocks,
0300 "allMemoryUsed": allMemoryUsed,
0301 "allMaxMemory": allMaxMemory,
0302 "allOnHeapMemoryUsed": allOnHeapMemoryUsed,
0303 "allOnHeapMaxMemory": allOnHeapMaxMemory,
0304 "allOffHeapMemoryUsed": allOffHeapMemoryUsed,
0305 "allOffHeapMaxMemory": allOffHeapMaxMemory,
0306 "allDiskUsed": allDiskUsed,
0307 "allTotalCores": allTotalCores,
0308 "allMaxTasks": allMaxTasks,
0309 "allActiveTasks": allActiveTasks,
0310 "allFailedTasks": allFailedTasks,
0311 "allCompletedTasks": allCompletedTasks,
0312 "allTotalTasks": allTotalTasks,
0313 "allTotalDuration": allTotalDuration,
0314 "allTotalGCTime": allTotalGCTime,
0315 "allTotalInputBytes": allTotalInputBytes,
0316 "allTotalShuffleRead": allTotalShuffleRead,
0317 "allTotalShuffleWrite": allTotalShuffleWrite,
0318 "allTotalBlacklisted": allTotalBlacklisted
0319 };
0320 var activeSummary = {
0321 "execCnt": ( "Active(" + activeExecCnt + ")"),
0322 "allRDDBlocks": activeRDDBlocks,
0323 "allMemoryUsed": activeMemoryUsed,
0324 "allMaxMemory": activeMaxMemory,
0325 "allOnHeapMemoryUsed": activeOnHeapMemoryUsed,
0326 "allOnHeapMaxMemory": activeOnHeapMaxMemory,
0327 "allOffHeapMemoryUsed": activeOffHeapMemoryUsed,
0328 "allOffHeapMaxMemory": activeOffHeapMaxMemory,
0329 "allDiskUsed": activeDiskUsed,
0330 "allTotalCores": activeTotalCores,
0331 "allMaxTasks": activeMaxTasks,
0332 "allActiveTasks": activeActiveTasks,
0333 "allFailedTasks": activeFailedTasks,
0334 "allCompletedTasks": activeCompletedTasks,
0335 "allTotalTasks": activeTotalTasks,
0336 "allTotalDuration": activeTotalDuration,
0337 "allTotalGCTime": activeTotalGCTime,
0338 "allTotalInputBytes": activeTotalInputBytes,
0339 "allTotalShuffleRead": activeTotalShuffleRead,
0340 "allTotalShuffleWrite": activeTotalShuffleWrite,
0341 "allTotalBlacklisted": activeTotalBlacklisted
0342 };
0343 var deadSummary = {
0344 "execCnt": ( "Dead(" + deadExecCnt + ")" ),
0345 "allRDDBlocks": deadRDDBlocks,
0346 "allMemoryUsed": deadMemoryUsed,
0347 "allMaxMemory": deadMaxMemory,
0348 "allOnHeapMemoryUsed": deadOnHeapMemoryUsed,
0349 "allOnHeapMaxMemory": deadOnHeapMaxMemory,
0350 "allOffHeapMemoryUsed": deadOffHeapMemoryUsed,
0351 "allOffHeapMaxMemory": deadOffHeapMaxMemory,
0352 "allDiskUsed": deadDiskUsed,
0353 "allTotalCores": deadTotalCores,
0354 "allMaxTasks": deadMaxTasks,
0355 "allActiveTasks": deadActiveTasks,
0356 "allFailedTasks": deadFailedTasks,
0357 "allCompletedTasks": deadCompletedTasks,
0358 "allTotalTasks": deadTotalTasks,
0359 "allTotalDuration": deadTotalDuration,
0360 "allTotalGCTime": deadTotalGCTime,
0361 "allTotalInputBytes": deadTotalInputBytes,
0362 "allTotalShuffleRead": deadTotalShuffleRead,
0363 "allTotalShuffleWrite": deadTotalShuffleWrite,
0364 "allTotalBlacklisted": deadTotalBlacklisted
0365 };
0366
0367 var data = {executors: response, "execSummary": [activeSummary, deadSummary, totalSummary]};
0368 $.get(createTemplateURI(appId, "executorspage"), function (template) {
0369
0370 executorsSummary.append(Mustache.render($(template).filter("#executors-summary-template").html(), data));
0371 var selector = "#active-executors-table";
0372 var conf = {
0373 "data": response,
0374 "columns": [
0375 {
0376 data: function (row, type) {
0377 return type !== 'display' ? (isNaN(row.id) ? 0 : row.id ) : row.id;
0378 }
0379 },
0380 {data: 'hostPort'},
0381 {
0382 data: 'isActive',
0383 render: function (data, type, row) {
0384 return formatStatus (data, type, row);
0385 }
0386 },
0387 {data: 'rddBlocks'},
0388 {
0389 data: function (row, type) {
0390 if (type !== 'display')
0391 return row.memoryUsed;
0392 else
0393 return (formatBytes(row.memoryUsed, type) + ' / ' +
0394 formatBytes(row.maxMemory, type));
0395 }
0396 },
0397 {
0398 data: function (row, type) {
0399 if (type !== 'display')
0400 return row.memoryMetrics.usedOnHeapStorageMemory;
0401 else
0402 return (formatBytes(row.memoryMetrics.usedOnHeapStorageMemory, type) + ' / ' +
0403 formatBytes(row.memoryMetrics.totalOnHeapStorageMemory, type));
0404 }
0405 },
0406 {
0407 data: function (row, type) {
0408 if (type !== 'display')
0409 return row.memoryMetrics.usedOffHeapStorageMemory;
0410 else
0411 return (formatBytes(row.memoryMetrics.usedOffHeapStorageMemory, type) + ' / ' +
0412 formatBytes(row.memoryMetrics.totalOffHeapStorageMemory, type));
0413 }
0414 },
0415 {data: 'diskUsed', render: formatBytes},
0416 {data: 'totalCores'},
0417 {name: 'resourcesCol', data: 'resources', render: formatResourceCells, orderable: false},
0418 {
0419 data: 'activeTasks',
0420 "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
0421 if (sData > 0) {
0422 $(nTd).css('color', 'white');
0423 $(nTd).css('background', activeTasksStyle(oData.activeTasks, oData.maxTasks));
0424 }
0425 }
0426 },
0427 {
0428 data: 'failedTasks',
0429 "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
0430 if (sData > 0) {
0431 $(nTd).css('color', 'white');
0432 $(nTd).css('background', failedTasksStyle(oData.failedTasks, oData.totalTasks));
0433 }
0434 }
0435 },
0436 {data: 'completedTasks'},
0437 {data: 'totalTasks'},
0438 {
0439 data: function (row, type) {
0440 return type === 'display' ? (formatDuration(row.totalDuration) + ' (' + formatDuration(row.totalGCTime) + ')') : row.totalDuration
0441 },
0442 "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
0443 if (oData.totalDuration > 0) {
0444 $(nTd).css('color', totalDurationColor(oData.totalGCTime, oData.totalDuration));
0445 $(nTd).css('background', totalDurationStyle(oData.totalGCTime, oData.totalDuration));
0446 }
0447 }
0448 },
0449 {data: 'totalInputBytes', render: formatBytes},
0450 {data: 'totalShuffleRead', render: formatBytes},
0451 {data: 'totalShuffleWrite', render: formatBytes},
0452 {name: 'executorLogsCol', data: 'executorLogs', render: formatLogsCells},
0453 {
0454 name: 'threadDumpCol',
0455 data: 'id', render: function (data, type) {
0456 return type === 'display' ? ("<a href='threadDump/?executorId=" + data + "'>Thread Dump</a>" ) : data;
0457 }
0458 }
0459 ],
0460 "order": [[0, "asc"]],
0461 "columnDefs": [
0462 {"visible": false, "targets": 5},
0463 {"visible": false, "targets": 6},
0464 {"visible": false, "targets": 9}
0465 ],
0466 "deferRender": true
0467 };
0468
0469 execDataTable = $(selector).DataTable(conf);
0470 execDataTable.column('executorLogsCol:name').visible(logsExist(response));
0471 execDataTable.column('threadDumpCol:name').visible(getThreadDumpEnabled());
0472 $('#active-executors [data-toggle="tooltip"]').tooltip();
0473
0474 var sumSelector = "#summary-execs-table";
0475 var sumConf = {
0476 "data": [activeSummary, deadSummary, totalSummary],
0477 "columns": [
0478 {
0479 data: 'execCnt',
0480 "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
0481 $(nTd).css('font-weight', 'bold');
0482 }
0483 },
0484 {data: 'allRDDBlocks'},
0485 {
0486 data: function (row, type) {
0487 if (type !== 'display')
0488 return row.allMemoryUsed
0489 else
0490 return (formatBytes(row.allMemoryUsed, type) + ' / ' +
0491 formatBytes(row.allMaxMemory, type));
0492 }
0493 },
0494 {
0495 data: function (row, type) {
0496 if (type !== 'display')
0497 return row.allOnHeapMemoryUsed;
0498 else
0499 return (formatBytes(row.allOnHeapMemoryUsed, type) + ' / ' +
0500 formatBytes(row.allOnHeapMaxMemory, type));
0501 }
0502 },
0503 {
0504 data: function (row, type) {
0505 if (type !== 'display')
0506 return row.allOffHeapMemoryUsed;
0507 else
0508 return (formatBytes(row.allOffHeapMemoryUsed, type) + ' / ' +
0509 formatBytes(row.allOffHeapMaxMemory, type));
0510 }
0511 },
0512 {data: 'allDiskUsed', render: formatBytes},
0513 {data: 'allTotalCores'},
0514 {
0515 data: 'allActiveTasks',
0516 "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
0517 if (sData > 0) {
0518 $(nTd).css('color', 'white');
0519 $(nTd).css('background', activeTasksStyle(oData.allActiveTasks, oData.allMaxTasks));
0520 }
0521 }
0522 },
0523 {
0524 data: 'allFailedTasks',
0525 "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
0526 if (sData > 0) {
0527 $(nTd).css('color', 'white');
0528 $(nTd).css('background', failedTasksStyle(oData.allFailedTasks, oData.allTotalTasks));
0529 }
0530 }
0531 },
0532 {data: 'allCompletedTasks'},
0533 {data: 'allTotalTasks'},
0534 {
0535 data: function (row, type) {
0536 return type === 'display' ? (formatDuration(row.allTotalDuration) + ' (' + formatDuration(row.allTotalGCTime) + ')') : row.allTotalDuration
0537 },
0538 "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
0539 if (oData.allTotalDuration > 0) {
0540 $(nTd).css('color', totalDurationColor(oData.allTotalGCTime, oData.allTotalDuration));
0541 $(nTd).css('background', totalDurationStyle(oData.allTotalGCTime, oData.allTotalDuration));
0542 }
0543 }
0544 },
0545 {data: 'allTotalInputBytes', render: formatBytes},
0546 {data: 'allTotalShuffleRead', render: formatBytes},
0547 {data: 'allTotalShuffleWrite', render: formatBytes},
0548 {data: 'allTotalBlacklisted'}
0549 ],
0550 "paging": false,
0551 "searching": false,
0552 "info": false,
0553 "columnDefs": [
0554 {"visible": false, "targets": 3},
0555 {"visible": false, "targets": 4}
0556 ]
0557
0558 };
0559
0560 sumDataTable = $(sumSelector).DataTable(sumConf);
0561 $('#execSummary [data-toggle="tooltip"]').tooltip();
0562
0563 $("#showAdditionalMetrics").append(
0564 "<div><a id='additionalMetrics'>" +
0565 "<span class='expand-input-rate-arrow arrow-closed' id='arrowtoggle-optional-metrics'></span>" +
0566 "Show Additional Metrics" +
0567 "</a></div>" +
0568 "<div class='container-fluid container-fluid-div' id='toggle-metrics' hidden>" +
0569 "<div><input type='checkbox' class='toggle-vis' id='select-all-box'>Select All</div>" +
0570 "<div id='on_heap_memory' class='on-heap-memory-checkbox-div'><input type='checkbox' class='toggle-vis' data-sum-col-idx='3' data-exec-col-idx='5'>On Heap Memory</div>" +
0571 "<div id='off_heap_memory' class='off-heap-memory-checkbox-div'><input type='checkbox' class='toggle-vis' data-sum-col-idx='4' data-exec-col-idx='6'>Off Heap Memory</div>" +
0572 "<div id='extra_resources' class='resources-checkbox-div'><input type='checkbox' class='toggle-vis' data-sum-col-idx='' data-exec-col-idx='9'>Resources</div>" +
0573 "</div>");
0574
0575 reselectCheckboxesBasedOnTaskTableState();
0576
0577 $("#additionalMetrics").click(function() {
0578 $("#arrowtoggle-optional-metrics").toggleClass("arrow-open arrow-closed");
0579 $("#toggle-metrics").toggle();
0580 if (window.localStorage) {
0581 window.localStorage.setItem("arrowtoggle-optional-metrics-class", $("#arrowtoggle-optional-metrics").attr('class'));
0582 }
0583 });
0584
0585 $(".toggle-vis").on("click", function() {
0586 var thisBox = $(this);
0587 if (thisBox.is("#select-all-box")) {
0588 var sumColumn = sumDataTable.columns(sumOptionalColumns);
0589 var execColumn = execDataTable.columns(execOptionalColumns);
0590 if (thisBox.is(":checked")) {
0591 $(".toggle-vis").prop("checked", true);
0592 sumColumn.visible(true);
0593 execColumn.visible(true);
0594 } else {
0595 $(".toggle-vis").prop("checked", false);
0596 sumColumn.visible(false);
0597 execColumn.visible(false);
0598 }
0599 } else {
0600 var execColIdx = thisBox.attr("data-exec-col-idx");
0601 var execCol = execDataTable.column(execColIdx);
0602 execCol.visible(!execCol.visible());
0603 var sumColIdx = thisBox.attr("data-sum-col-idx");
0604 if (sumColIdx) {
0605 var sumCol = sumDataTable.column(sumColIdx);
0606 sumCol.visible(!sumCol.visible());
0607 }
0608 }
0609 });
0610
0611 if (window.localStorage) {
0612 if (window.localStorage.getItem("arrowtoggle-optional-metrics-class") != null &&
0613 window.localStorage.getItem("arrowtoggle-optional-metrics-class").includes("arrow-open")) {
0614 $("#arrowtoggle-optional-metrics").toggleClass("arrow-open arrow-closed");
0615 $("#toggle-metrics").toggle();
0616 }
0617 }
0618 });
0619 });
0620 });
0621 });