| <html> |
| |
| <head> |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <title>Storm UI</title> |
| <link href="/css/bootstrap-3.3.1.min.css" rel="stylesheet" type="text/css"> |
| <link href="/css/jquery.dataTables.1.10.4.min.css" rel="stylesheet" type="text/css"> |
| <link href="/css/dataTables.bootstrap.css" rel="stylesheet" type="text/css"> |
| <link href="/css/jsonFormatter.min.css" rel="stylesheet" type="text/css"> |
| <link href="/css/style.css?_ts=${packageTimestamp}" rel="stylesheet" type="text/css"> |
| <script src="/js/jquery-1.11.1.min.js" type="text/javascript"></script> |
| <script src="/js/jquery.dataTables.1.10.4.min.js" type="text/javascript"></script> |
| <script src="/js/jquery.cookies.2.2.0.min.js" type="text/javascript"></script> |
| <script src="/js/jquery.mustache.js" type="text/javascript"></script> |
| <script src="/js/url.min.js" type="text/javascript"></script> |
| <script src="/js/bootstrap-3.3.1.min.js" type="text/javascript"></script> |
| <script src="/js/jquery.blockUI.min.js" type="text/javascript"></script> |
| <script src="/js/jsonFormatter.min.js" type="text/javascript"></script> |
| <script src="/js/script.js?_ts=${packageTimestamp}" type="text/javascript"></script> |
| </head> |
| |
| <body> |
| <div class="warning" id="ras-warning-fixed-buffer"> |
| <H1>This user's topologies are in danger of being unscheduled due to the owner's over-use of cluster resources.</H1> |
| <p>Please keep this user's resource consumption within guaranteed bounds to ensure topologies for this user will continue to run.</p> |
| </div> |
| <div class="warning" id="ras-warning-top-buffer"></div> |
| <div class="container-fluid"> |
| <div class="row"> |
| <div class="col-md-11"> |
| <h1><a href="/">Storm UI</a></h1> |
| </div> |
| <div id="ui-user" class="col-md-1"></div> |
| </div> |
| <div class="row"> |
| <div class="col-md-12" id="search-form"> |
| </div> |
| </div> |
| <div class="row"> |
| <div class="col-md-12"> |
| <h2>Owner Summary</h2> |
| <div id="owner-summary"></div> |
| </div> |
| </div> |
| <div class="row"> |
| <div class="col-md-12"> |
| <h2 id="owner-resource-usage-summary-header">Owner Resource Usage</h2> |
| <div id="owner-resource-usage-summary"></div> |
| </div> |
| </div> |
| <div class="row"> |
| <div class="col-md-12"> |
| <h2 id="owner-resource-guarantee-summary-header">Owner Resource Guarantees (RAS Topologies Only)</h2> |
| <div id="owner-resource-guarantee-summary"></div> |
| </div> |
| </div> |
| <div class="row"> |
| <div class="col-md-12"> |
| <h2>Owner Topologies</h2> |
| <div id="topology-summary"></div> |
| </div> |
| </div> |
| <div class="row"> |
| <div id="json-response-error" class="col-md-12"></div> |
| </div> |
| <div> |
| <p id="page-rendered-at-timestamp"></p> |
| </div> |
| </div> |
| </body> |
| <script> |
| $(document).ajaxStop($.unblockUI); |
| $(document).ajaxStart(function() { |
| $.blockUI({ |
| message: '<img src="images/spinner.gif" /> <h3>Loading summary...</h3>' |
| }); |
| }); |
| $(document).ready(function() { |
| |
| var owner = $.url("?id"); |
| if (!owner) { |
| // this page is designed to be per owner, handle the case where the URL is malformed |
| getStatic("/templates/json-error-template.html", function(template) { |
| $("#json-response-error").append(Mustache.render($(template).filter("#json-error-template").html(), { |
| "error": "Invalid owner", |
| "errorMessage": "Please pass an owner id with the id URL parameter" |
| })); |
| }); |
| return; |
| } |
| var url = "/api/v1/owner-resources/" + owner; |
| |
| $.extend($.fn.dataTable.defaults, { |
| stateSave: true, |
| lengthMenu: [ |
| [20, 40, 60, 100, -1], |
| [20, 40, 60, 100, "All"] |
| ], |
| pageLength: 20 |
| }); |
| |
| $.ajaxSetup({ |
| "error": function(jqXHR, textStatus, response) { |
| var errorJson = jQuery.parseJSON(jqXHR.responseText); |
| getStatic("/templates/json-error-template.html", function(template) { |
| $("#json-response-error").append(Mustache.render($(template).filter("#json-error-template").html(), errorJson)); |
| }); |
| } |
| }); |
| |
| function jsError(other) { |
| try { |
| other(); |
| } catch (err) { |
| getStatic("/templates/json-error-template.html", function(template) { |
| $("#json-response-error").append(Mustache.render($(template).filter("#json-error-template").html(), { |
| error: "JS Error", |
| errorMessage: err |
| })); |
| }); |
| } |
| } |
| |
| var topologySummary = $("#topology-summary"); |
| var ownerResourceUsage = $("#owner-resource-usage-summary"); |
| var ownerSummary = $("#owner-summary"); |
| var ownerResourceGuarantee = $("#owner-resource-guarantee-summary"); |
| $.getJSON(url, function(response, status, jqXHR) { |
| getStatic("/templates/owner-page-template.html", function(template) { |
| jsError(function() { |
| //owner,totalTopologies,totalTasks,totalExecutors,totalWorkers |
| ownerSummary.append( |
| Mustache.render($(template).filter("#owner-summary-template").html(), response)); |
| |
| //totalReqOnHeapMem,totalReqOffHeapMem,totalReqMem,totalReqCpu,totalAssignedOnHeapMem,totalAssignedOffHeapMem,totalAssignedMem,totalAssignedCpu |
| ownerResourceUsage.append( |
| Mustache.render($(template).filter("#owner-resource-usage-template").html(), response)); |
| $('#owner-resource-usage-summary [data-toggle="tooltip"]').tooltip(); |
| |
| if (response["cpuGuarantee"] != "N/A" || response["memoryGuarantee"] != "N/A") { |
| ownerResourceGuarantee.append( |
| Mustache.render($(template).filter("#owner-resource-guarantee-template").html(), response)); |
| $('#owner-resource-guarantee-summary [data-toggle="tooltip"]').tooltip(); |
| |
| $('#mem-guarantee-util').html(getResourceGuaranteeRemainingFormat("display", response["memoryGuaranteeRemaining"])); |
| |
| $('#cpu-guarantee-util').html(getResourceGuaranteeRemainingFormat("display", response["cpuGuaranteeRemaining"])); |
| |
| } else { |
| $('#owner-resource-guarantee-summary-header').hide(); |
| $('#owner-resource-guarantee-summary').hide(); |
| } |
| |
| var displayResource = response["schedulerDisplayResource"]; |
| if (!displayResource) { |
| $('#owner-resource-usage-summary-header').hide(); |
| $('#owner-resource-usage-summary').hide(); |
| $('#owner-resource-guarantee-summary-header').hide(); |
| $('#owner-resource-guarantee-summary').hide(); |
| } |
| |
| if(response && (response["memoryGuaranteeRemaining"] < 0 || response["cpuGuaranteeRemaining"] < 0 |
| || response["memoryGuaranteeRemaining"] == "N/A" || response["cpuGuaranteeRemaining"] == "N/A")) { |
| $(".warning").show(); |
| } else { |
| $(".warning").hide(); |
| } |
| |
| $('#owner-resource-usage-summary [data-toggle="tooltip"]').tooltip(); |
| |
| topologySummary.append( |
| Mustache.render($(template).filter("#owner-topology-summary-template").html(), response)); |
| //name, owner, status, uptime, num workers, num executors, num tasks, assigned total mem, assigned total cpu, scheduler info |
| dtAutoPage("#owner-topology-summary-table", { |
| columnDefs: [{ |
| type: "num", |
| targets: [4, 5, 6, 7, 8] |
| }, { |
| type: "time-str", |
| targets: [3] |
| }] |
| }); |
| $('#topology-summary [data-toggle="tooltip"]').tooltip(); |
| |
| }); |
| }); |
| }); |
| }); |
| |
| getPageRenderedTimestamp("page-rendered-at-timestamp"); |
| |
| </script> |
| |
| </html> |