|
|
@@ -0,0 +1,211 @@
|
|
|
+var ENV = ENV || (function() {
|
|
|
+
|
|
|
+ var first = true;
|
|
|
+ var counter = 0;
|
|
|
+ var data;
|
|
|
+ var _base;
|
|
|
+ (_base = String.prototype).lpad || (_base.lpad = function(padding, toLength) {
|
|
|
+ return padding.repeat((toLength - this.length) / padding.length).concat(this);
|
|
|
+ });
|
|
|
+
|
|
|
+ function formatElapsed(value) {
|
|
|
+ var str = parseFloat(value).toFixed(2);
|
|
|
+ if (value > 60) {
|
|
|
+ minutes = Math.floor(value / 60);
|
|
|
+ comps = (value % 60).toFixed(2).split('.');
|
|
|
+ seconds = comps[0].lpad('0', 2);
|
|
|
+ ms = comps[1];
|
|
|
+ str = minutes + ":" + seconds + "." + ms;
|
|
|
+ }
|
|
|
+ return str;
|
|
|
+ }
|
|
|
+
|
|
|
+ function getElapsedClassName(elapsed) {
|
|
|
+ var className = 'Query elapsed';
|
|
|
+ if (elapsed >= 10.0) {
|
|
|
+ className += ' warn_long';
|
|
|
+ }
|
|
|
+ else if (elapsed >= 1.0) {
|
|
|
+ className += ' warn';
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ className += ' short';
|
|
|
+ }
|
|
|
+ return className;
|
|
|
+ }
|
|
|
+
|
|
|
+ function countClassName(queries) {
|
|
|
+ var countClassName = "label";
|
|
|
+ if (queries >= 20) {
|
|
|
+ countClassName += " label-important";
|
|
|
+ }
|
|
|
+ else if (queries >= 10) {
|
|
|
+ countClassName += " label-warning";
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ countClassName += " label-success";
|
|
|
+ }
|
|
|
+ return countClassName;
|
|
|
+ }
|
|
|
+
|
|
|
+ function updateQuery(object) {
|
|
|
+ if (!object) {
|
|
|
+ object = {};
|
|
|
+ }
|
|
|
+ var elapsed = Math.random() * 15;
|
|
|
+ object.elapsed = elapsed;
|
|
|
+ object.formatElapsed = formatElapsed(elapsed);
|
|
|
+ object.elapsedClassName = getElapsedClassName(elapsed);
|
|
|
+ object.query = "SELECT blah FROM something";
|
|
|
+ object.waiting = Math.random() < 0.5;
|
|
|
+ if (Math.random() < 0.2) {
|
|
|
+ object.query = "<IDLE> in transaction";
|
|
|
+ }
|
|
|
+ if (Math.random() < 0.1) {
|
|
|
+ object.query = "vacuum";
|
|
|
+ }
|
|
|
+ return object;
|
|
|
+ }
|
|
|
+
|
|
|
+ function cleanQuery(value) {
|
|
|
+ if (value) {
|
|
|
+ value.formatElapsed = "";
|
|
|
+ value.elapsedClassName = "";
|
|
|
+ value.query = "";
|
|
|
+ value.elapsed = null;
|
|
|
+ value.waiting = null;
|
|
|
+ } else {
|
|
|
+ return {
|
|
|
+ query: "***",
|
|
|
+ formatElapsed: "",
|
|
|
+ elapsedClassName: ""
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function generateRow(object, keepIdentity, counter) {
|
|
|
+ var nbQueries = Math.floor((Math.random() * 10) + 1);
|
|
|
+ if (!object) {
|
|
|
+ object = {};
|
|
|
+ }
|
|
|
+ object.lastMutationId = counter;
|
|
|
+ object.nbQueries = nbQueries;
|
|
|
+ if (!object.lastSample) {
|
|
|
+ object.lastSample = {};
|
|
|
+ }
|
|
|
+ if (!object.lastSample.topFiveQueries) {
|
|
|
+ object.lastSample.topFiveQueries = [];
|
|
|
+ }
|
|
|
+ if (keepIdentity) {
|
|
|
+ // for Angular optimization
|
|
|
+ if (!object.lastSample.queries) {
|
|
|
+ object.lastSample.queries = [];
|
|
|
+ for (var l = 0; l < 12; l++) {
|
|
|
+ object.lastSample.queries[l] = cleanQuery();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (var j in object.lastSample.queries) {
|
|
|
+ var value = object.lastSample.queries[j];
|
|
|
+ if (j <= nbQueries) {
|
|
|
+ updateQuery(value);
|
|
|
+ } else {
|
|
|
+ cleanQuery(value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ object.lastSample.queries = [];
|
|
|
+ for (var j = 0; j < 12; j++) {
|
|
|
+ if (j < nbQueries) {
|
|
|
+ var value = updateQuery(cleanQuery());
|
|
|
+ object.lastSample.queries.push(value);
|
|
|
+ } else {
|
|
|
+ object.lastSample.queries.push(cleanQuery());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (var i = 0; i < 5; i++) {
|
|
|
+ var source = object.lastSample.queries[i];
|
|
|
+ object.lastSample.topFiveQueries[i] = source;
|
|
|
+ }
|
|
|
+ object.lastSample.nbQueries = nbQueries;
|
|
|
+ object.lastSample.countClassName = countClassName(nbQueries);
|
|
|
+ return object;
|
|
|
+ }
|
|
|
+
|
|
|
+ function getData(keepIdentity) {
|
|
|
+ var oldData = data;
|
|
|
+ if (!keepIdentity) { // reset for each tick when !keepIdentity
|
|
|
+ data = [];
|
|
|
+ for (var i = 1; i <= ENV.rows; i++) {
|
|
|
+ data.push({ dbname: 'cluster' + i, query: "", formatElapsed: "", elapsedClassName: "" });
|
|
|
+ data.push({ dbname: 'cluster' + i + ' slave', query: "", formatElapsed: "", elapsedClassName: "" });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!data) { // first init when keepIdentity
|
|
|
+ data = [];
|
|
|
+ for (var i = 1; i <= ENV.rows; i++) {
|
|
|
+ data.push({ dbname: 'cluster' + i });
|
|
|
+ data.push({ dbname: 'cluster' + i + ' slave' });
|
|
|
+ }
|
|
|
+ oldData = data;
|
|
|
+ }
|
|
|
+ for (var i in data) {
|
|
|
+ var row = data[i];
|
|
|
+ if (!keepIdentity && oldData && oldData[i]) {
|
|
|
+ row.lastSample = oldData[i].lastSample;
|
|
|
+ }
|
|
|
+ if (!row.lastSample || Math.random() < ENV.mutations()) {
|
|
|
+ counter = counter + 1;
|
|
|
+ if (!keepIdentity) {
|
|
|
+ row.lastSample = null;
|
|
|
+ }
|
|
|
+ generateRow(row, keepIdentity, counter);
|
|
|
+ } else {
|
|
|
+ data[i] = oldData[i];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ first = false;
|
|
|
+ return {
|
|
|
+ toArray: function() {
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ var mutationsValue = 0.5;
|
|
|
+
|
|
|
+ function mutations(value) {
|
|
|
+ if (value) {
|
|
|
+ mutationsValue = value;
|
|
|
+ return mutationsValue;
|
|
|
+ } else {
|
|
|
+ return mutationsValue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ var body = document.querySelector('body');
|
|
|
+ var theFirstChild = body.firstChild;
|
|
|
+
|
|
|
+ var sliderContainer = document.createElement( 'div' );
|
|
|
+ sliderContainer.style.cssText = "display: flex";
|
|
|
+ var slider = document.createElement('input');
|
|
|
+ var text = document.createElement('label');
|
|
|
+ text.innerHTML = 'mutations : ' + (mutationsValue * 100).toFixed(0) + '%';
|
|
|
+ text.id = "ratioval";
|
|
|
+ slider.setAttribute("type", "range");
|
|
|
+ slider.style.cssText = 'margin-bottom: 10px; margin-top: 5px';
|
|
|
+ slider.addEventListener('change', function(e) {
|
|
|
+ ENV.mutations(e.target.value / 100);
|
|
|
+ document.querySelector('#ratioval').innerHTML = 'mutations : ' + (ENV.mutations() * 100).toFixed(0) + '%';
|
|
|
+ });
|
|
|
+ sliderContainer.appendChild( text );
|
|
|
+ sliderContainer.appendChild( slider );
|
|
|
+ body.insertBefore( sliderContainer, theFirstChild );
|
|
|
+
|
|
|
+ return {
|
|
|
+ generateData: getData,
|
|
|
+ rows: 50,
|
|
|
+ timeout: 0,
|
|
|
+ mutations: mutations
|
|
|
+ };
|
|
|
+})();
|