<!--
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.

Example of json received from the impala server
"resource_pools_plain_json": <..the whole json below in text.>
"resource_pools": [
        {
            "pool_name": "default-pool",
            "agg_num_running": 1,
            "agg_num_queued": 4,
            "agg_mem_reserved": 10382760,
            "local_mem_admitted": 10382760,
            "local_num_admitted_running": 1,
            "local_num_queued": 4,
            "local_backend_mem_reserved": 10382760,
            "local_backend_mem_usage": 16384,
            "pool_max_mem_resources": 10485760,
            "pool_max_requests": 10,
            "pool_max_queued": 10,
            "pool_queue_timeout": 60000,
            "max_query_mem_limit": 0,
            "min_query_mem_limit": 0,
            "clamp_mem_limit_query_option": true,
            "wait_time_ms_EMA": 0.0,
            "histogram": [
                [
                    0,
                    0
                ],
                .
                .
                .
                [
                    127,
                    0
                ]
            ],
            "queued_queries": [
                {
                    "query_id": "6f49e509bfa5b347:207d8ef900000000",
                    "mem_limit": 10382760,
                    "mem_limit_to_admit": 10382760,
                    "num_backends": 1
                },
                {
                    "query_id": "854f954e79f79d87:18483b9400000000",
                    "mem_limit": 10382760,
                    "mem_limit_to_admit": 10382760,
                    "num_backends": 1
                },
                {
                    "query_id": "45421dce8bf5664f:6865a45200000000",
                    "mem_limit": 10382760,
                    "mem_limit_to_admit": 10382760,
                    "num_backends": 1
                },
                {
                    "query_id": "e249aecff1bf3372:d5527a2700000000",
                    "mem_limit": 10382760,
                    "mem_limit_to_admit": 10382760,
                    "num_backends": 1
                }
            ],
            "head_queued_reason": "Not enough aggregate memory available in pool default-pool with max mem resources 10.00 MB. Needed 9.90 MB but only 100.59 KB was available.",
            "running_queries": [
                {
                    "query_id": "b94cf355d6df041c:ba3b91400000000",
                    "mem_limit": 10382760,
                    "mem_limit_to_admit": 10382760,
                    "num_backends": 1
                }
            ]
        }
    ],
    "statestore_admission_control_time_since_last_update_ms": 745,
    "statestore_update_staleness_detail": "Warning: admission control information from statestore is stale: 745ms since last update was received.",
    "get_all_pools": true
-->
{{> www/common-header.tmpl }}
{{?statestore_update_staleness_detail}}
<div class="alert alert-danger" role="alert">
<strong>{{statestore_update_staleness_detail}}</strong>
</div>
{{/statestore_update_staleness_detail}}
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.min.js" type="text/javascript"></script>
<script type="text/javascript">
window.onload = function() {
  renderGraph();
  formatMemoryColumns();
};

// Picks up all the canvas elements associated with each resource pool and renders its
// peak memory usage histogram.
function renderGraph() {
  var plainJson = document.getElementById("resource_pools_plain_json");
  var json = JSON.parse(plainJson.innerText);
  var canvases = document.getElementsByTagName("canvas");

  for (var pool_idx = 0; pool_idx < json.length; pool_idx++){
    var histogram = json[pool_idx]["peak_mem_usage_histogram"]
    var pool_name = json[pool_idx]['pool_name'];
    var hist_labels = new Array();
    var hist_values = new Array();
    for (var i = 0; i < histogram.length; i++) {
      var hist_elem = histogram[i];
      //hist_labels.push((hist_elem[0]-1) + " - " + hist_elem[0] + " GB");
      hist_labels.push((hist_elem[0]+1) + " GB");
      hist_values.push(hist_elem[1]);
    }
    hist_labels[hist_labels.length-1] += " and above"
    // Render the bar chart now.
    var chart_Data = {
            labels: hist_labels,
            datasets: [{
                label: 'Number of Queries',
                backgroundColor: '#2E6595', // Impala logo's color
                data: hist_values
            }],
      };

    var ctx = canvases[pool_name].getContext('2d');
      window.myBar = new Chart(ctx, {
          type: 'bar',
          data: chart_Data,
          options: {
              responsive: true,
              legend: {
                  position: 'top',
              },
              title: {
                  display: true,
                  text: 'Peak Memory per Host'
              }
          }
      });
  }
}

// Picks up all the elemets classified as memory and replaces it with pretty printed
// value.
function formatMemoryColumns() {
  var cols = document.getElementsByClassName("memory");
  for (var idx = 0; idx < cols.length; idx++) {
    cols[idx].innerText = formatMemory(cols[idx].innerText);
  }
}

var memory_key = [
  {'unit': 'B', 'val': 1},
  {'unit': 'KB', 'val': 1024},
  {'unit': 'MB', 'val': 1048576},
  {'unit': 'GB', 'val': 1073741824}
]

// Helper method that takes in a value (in bytes) and outputs its pretty printed value.
function formatMemory(val) {
  var mem_bytes = parseInt(val);
  for (var idx = memory_key.length - 1; idx >= 0; idx--) {
    var result = parseFloat(mem_bytes / memory_key[idx].val);
    if (result < 1) continue;
    return result.toFixed(2) + " " + memory_key[idx].unit;
  }
  return "0 B";
}

function reset_all() {
  if (!confirm('Are you sure you want to reset stats for all resource pools ?')) return;
  var xhr = new XMLHttpRequest();
  xhr.onload = function(ignored_arg) {
    window.location.reload(true);
  }
  xhr.open('GET', make_url("/resource_pool_reset"), true);
  xhr.send();
}

function reset_method(pool_name) {
  if (!confirm('Are you sure you want to reset stats for ' + pool_name +' ?')) return;
  var xhr = new XMLHttpRequest();
  xhr.onload = function(ignored_arg) {
    window.location.reload(true);
  }
  xhr.open('GET', make_url("/resource_pool_reset?pool_name=" + pool_name), true);
  xhr.send();
}
</script>

<h2>Admission Controller
  {{?get_all_pools}}
  <button class="btn btn-warning btn-xs" onClick="reset_all();">
    Reset informational stats for all pools
  </button>
  {{/get_all_pools}}
</h2>
{{^get_all_pools}}
<p id="show_all_pools" class="lead">
  <a href='{{ __common__.host-url }}/admission'> < Show all Resource Pools</a>
</p>
{{/get_all_pools}}
<p class="lead">
  This page lists all resource pools to which queries have been submitted
  at least once and their corresponding state and statistics.<br>See the
  <a href='{{ __common__.host-url }}/backends'>backends</a> debug page for memory admitted and reserved per
  backend.
</p>
<p class="lead">
<strong>
Time since last statestore update containing admission control topic state (ms):
</strong>
{{statestore_admission_control_time_since_last_update_ms}}
</p>
{{#resource_pools}}
<div class="container-fluid">
  <h3><a href='{{ __common__.host-url }}/admission?pool_name={{pool_name}}'>{{pool_name}}</a></h3>

  <h4>Pool Config</h4>
  <table class='table table-hover table-border'>
    <tr>
      <th>Property</th>
      <th>Value</th>
    </tr>
    <tr>
      <td>Max memory (cluster wide)</td>
      <td class='memory'>{{pool_max_mem_resources}}</td>
    </tr>
    <tr>
      <td>Max concurrent queries</td>
      <td>{{pool_max_requests}}</td>
    </tr>
    <tr>
      <td>Max queue size</td>
      <td>{{pool_max_queued}}</td>
    </tr>
    <tr>
      <td>Queue Timeout (ms)</td>
      <td>{{pool_queue_timeout}}</td>
    </tr>
    <tr>
      <td><b>Min</b> Query MEM_LIMIT range</td>
      <td class='memory'>{{min_query_mem_limit}}</td>
    </tr>
    <tr>
      <td><b>Max</b> Query MEM_LIMIT range</td>
      <td class='memory'>{{max_query_mem_limit}}</td>
    </tr>
    <tr>
      <td>Clamp MEM_LIMIT query option</td>
      <td>{{clamp_mem_limit_query_option}}</td>
    </tr>
    <tr>
      <td>Max Running Queries Multiple</td>
      <td>{{max_running_queries_multiple}}</td>
    </tr>
    <tr>
      <td>Max Queued Queries Multiple</td>
      <td>{{max_queued_queries_multiple}}</td>
    </tr>
    <tr>
      <td>Max Memory Multiple</td>
      <td class='memory'>{{max_memory_multiple}}</td>
    </tr>
  </table>

  <h4>Queued queries in order of being queued (submitted to this coordinator)</h4>
  <table class='table table-hover table-border'>
    <tr>
      <th>Query ID</th>
      <th>Memory limit for the executors</th>
      <th>Memory admitted on the executors</th>
      <th>Memory limit for the coordinator</th>
      <th>Memory admitted on the coordinator</th>
      <th>Num of backends it will run on</th>
      <th>Details</th>
    </tr>
    {{#queued_queries}}
    <tr>
      <td>{{query_id}}</td>
      <td class='memory'>{{mem_limit}}</td>
      <td class='memory'>{{mem_limit_to_admit}}</td>
      <td class='memory'>{{coord_mem_limit}}</td>
      <td class='memory'>{{coord_mem_to_admit}}</td>
      <td>{{num_backends}}</td>
      <td><a href='{{ __common__.host-url }}/query_plan?query_id={{query_id}}'>Details</a></td>
    </tr>
    {{/queued_queries}}
  </table>

  <h4>Running queries (submitted to this coordinator)</h4>
  <table class='table table-hover table-border'>
    <tr>
      <th>Query ID</th>
      <th>Memory limit for the executors</th>
      <th>Memory admitted on the executors</th>
      <th>Memory limit for the coordinator</th>
      <th>Memory admitted on the coordinator</th>
      <th>Num of backends it will run on</th>
      <th>Details</th>
    </tr>
    {{#running_queries}}
    <tr>
      <td>{{query_id}}</td>
      <td class='memory'>{{mem_limit}}</td>
      <td class='memory'>{{mem_limit_to_admit}}</td>
      <td class='memory'>{{coord_mem_limit}}</td>
      <td class='memory'>{{coord_mem_to_admit}}</td>
      <td>{{num_backends}}</td>
      <td><a href='{{ __common__.host-url }}/query_plan?query_id={{query_id}}'>Details</a></td>
    </tr>
    {{/running_queries}}
  </table>

  <h4>Pool stats
    <button class="btn btn-warning btn-xs" onClick="reset_method('{{pool_name}}');">
      Reset informational stats
    </button>
  </h4>
  <table class='table table-hover table-border'>
    <tr>
      <th>Property</th>
      <th>Value</th>
      <th>Limit / Max value</th>
    </tr>
    <tr>
      <td>Total queries <b>admitted</b> by this coordinator</td>
      <td colspan='2'>{{total_admitted}}</td>
    </tr>
    <tr>
      <td>Total queries <b>rejected</b> by this coordinator</td>
      <td colspan='2'>{{total_rejected}}</td>
    </tr>
    <tr>
      <td>Total queries <b>timed out</b> on this coordinator</td>
      <td colspan='2'>{{total_timed_out}}</td>
    </tr>
    <tr>
      <td>Queries currently running</td>
      <td>{{agg_num_running}}</td>
      <td>{{max_running_queries_derived}}</td>
    </tr>
    <tr>
      <td>Queries currently queued</td>
      <td>{{agg_num_queued}}</td>
      <td>{{max_queued_queries_derived}}</td>
    </tr>
    <tr>
      <td>Total memory reserved across cluster</td>
      <td class='memory'>{{agg_mem_reserved}}</td>
      <td class='memory'>{{max_memory_derived}}</td>
    </tr>
    <tr>
      <td>Memory admitted on this coordinator</td>
      <td class='memory'>{{local_mem_admitted}}</td>
      <td class='memory'>{{max_memory_derived}}</td>
    </tr>
    <tr>
      <td>Queued reason of query at the head of the queue</td>
      <td colspan='2'>{{head_queued_reason}}</td>
    </tr>
    <tr>
      <td>Time in queue (exponential moving average)</td>
      <td colspan='2'>{{wait_time_ms_ema}} ms</td>
    </tr>
    <tr>
      <td colspan='3'>
        <canvas id="{{pool_name}}" style="border:1px solid"></canvas>
      </td>
    </tr>
  </table>
</div>
{{/resource_pools}}


<div id="resource_pools_plain_json" style="display: none;">
    {{resource_pools_plain_json}}
</div>
{{> www/common-footer.tmpl }}
