Autoscaling Recommendation

https://github.com/pivotal-cf/cf-autoscaling-release/blob/03116cde866c07a109623294f4599f128ff1ff30/doc/max_per_source.md

HTML

<h2>Loggregator Settings</h2>
<div class="row">
  <div class="column">
    <label for="log_cache_request_time">Log Cache Request Time</label>
  </div>
  <div class="column">
    <input type="text" id="log_cache_request_time" />
  </div>
</div>
<div class="row">
  <div class="column">
    <label for="max_per_source">Max Per Source</label>
  </div>
  <div class="column">
    <input type="text" id="max_per_source" />
  </div>
</div>

<h2>Autoscaler Settings</h2>
<div class="row">
  <div class="column">
    <label for="metric_collection_interval">Metric Collection Interval</label>
  </div>
  <div class="column">
    <input type="text" id="metric_collection_interval" />
  </div>
</div>
<div class="row">
  <div class="column">
    <label for="scaling_interval">Scaling Interval</label>
  </div>
  <div class="column">
    <input type="text" id="scaling_interval" />
  </div>
</div>

<h2>Application Settings</h2>
<div class="row">
  <div class="column">
    <label for="metrics_per_request">Metrics per Request</label>
  </div>
  <div class="column">
    <input type="text" id="metrics_per_request" />
  </div>
</div>
<div class="row">
  <div class="column">
    <label for="application_requests_per_second">Application Requests per Second</label>
  </div>
  <div class="column">
    <input type="text" id="application_requests_per_second" />
  </div>
</div>

<div class="row">
  <div class="column"></div>
  <div class="column">
    <button id="run" onclick="run()">Calculate</button>
  </div>
</div>

<div class="row">
  <div class="column"><label for="answer">Answer</label></div>
  <div class="column">
    <input id="answer" />
  </div>
</div>

CSS

.row {
  display: flex;
  padding-top: 0.5em;
  padding-bottom: 0.25em;
}

.column {
  flex: 50%;
}

label {
  font-weight: bold;
}

input {
  width: 300px;
}

JavaScript

function run() {
  var log_cache_request_time = document.getElementById("log_cache_request_time").value;
  var max_per_source = document.getElementById("max_per_source").value;

  var metric_collection_interval = document.getElementById("metric_collection_interval").value;
  var scaling_interval = document.getElementById("scaling_interval").value;

  var metrics_per_request = document.getElementById("metrics_per_request").value;
  var application_requests_per_second = document.getElementById("application_requests_per_second").value;

  var answer = document.getElementById("answer");

  if (!log_cache_request_time || !max_per_source) {
    answer.value = "Loggregator Settings are required";
    return;
  }

  if (!metric_collection_interval || !scaling_interval) {
    answer.value = "Autoscaler Settings are required";
    return;
  }

  if (!metrics_per_request || !application_requests_per_second) {
    answer.value = "Application Settings are required";
    return;
  }

  var remove_up_to_pos = (max_per_source - (application_requests_per_second * metrics_per_request * (scaling_interval - 5)));
  var pos_read_up_to = (Math.min(application_requests_per_second * metrics_per_request * metric_collection_interval, max_per_source) -
    round(((scaling_interval - 5) / log_cache_request_time) * 1000));

  answer.value = remove_up_to_pos + " > " + pos_read_up_to + " == " + (remove_up_to_pos > pos_read_up_to);
}

function round(value) {
  return Math.floor(value / 1000) * 1000;
}