ENV.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. var ENV = ENV || (function() {
  2. var first = true;
  3. var counter = 0;
  4. var data;
  5. var _base;
  6. (_base = String.prototype).lpad || (_base.lpad = function(padding, toLength) {
  7. return padding.repeat((toLength - this.length) / padding.length).concat(this);
  8. });
  9. function formatElapsed(value) {
  10. var str = parseFloat(value).toFixed(2);
  11. if (value > 60) {
  12. minutes = Math.floor(value / 60);
  13. comps = (value % 60).toFixed(2).split('.');
  14. seconds = comps[0].lpad('0', 2);
  15. ms = comps[1];
  16. str = minutes + ":" + seconds + "." + ms;
  17. }
  18. return str;
  19. }
  20. function getElapsedClassName(elapsed) {
  21. var className = 'Query elapsed';
  22. if (elapsed >= 10.0) {
  23. className += ' warn_long';
  24. }
  25. else if (elapsed >= 1.0) {
  26. className += ' warn';
  27. }
  28. else {
  29. className += ' short';
  30. }
  31. return className;
  32. }
  33. function countClassName(queries) {
  34. var countClassName = "label";
  35. if (queries >= 20) {
  36. countClassName += " label-important";
  37. }
  38. else if (queries >= 10) {
  39. countClassName += " label-warning";
  40. }
  41. else {
  42. countClassName += " label-success";
  43. }
  44. return countClassName;
  45. }
  46. function updateQuery(object) {
  47. if (!object) {
  48. object = {};
  49. }
  50. var elapsed = Math.random() * 15;
  51. object.elapsed = elapsed;
  52. object.formatElapsed = formatElapsed(elapsed);
  53. object.elapsedClassName = getElapsedClassName(elapsed);
  54. object.query = "SELECT blah FROM something";
  55. object.waiting = Math.random() < 0.5;
  56. if (Math.random() < 0.2) {
  57. object.query = "<IDLE> in transaction";
  58. }
  59. if (Math.random() < 0.1) {
  60. object.query = "vacuum";
  61. }
  62. return object;
  63. }
  64. function cleanQuery(value) {
  65. if (value) {
  66. value.formatElapsed = "";
  67. value.elapsedClassName = "";
  68. value.query = "";
  69. value.elapsed = null;
  70. value.waiting = null;
  71. } else {
  72. return {
  73. query: "***",
  74. formatElapsed: "",
  75. elapsedClassName: ""
  76. };
  77. }
  78. }
  79. function generateRow(object, keepIdentity, counter) {
  80. var nbQueries = Math.floor((Math.random() * 10) + 1);
  81. if (!object) {
  82. object = {};
  83. }
  84. object.lastMutationId = counter;
  85. object.nbQueries = nbQueries;
  86. if (!object.lastSample) {
  87. object.lastSample = {};
  88. }
  89. if (!object.lastSample.topFiveQueries) {
  90. object.lastSample.topFiveQueries = [];
  91. }
  92. if (keepIdentity) {
  93. // for Angular optimization
  94. if (!object.lastSample.queries) {
  95. object.lastSample.queries = [];
  96. for (var l = 0; l < 12; l++) {
  97. object.lastSample.queries[l] = cleanQuery();
  98. }
  99. }
  100. for (var j in object.lastSample.queries) {
  101. var value = object.lastSample.queries[j];
  102. if (j <= nbQueries) {
  103. updateQuery(value);
  104. } else {
  105. cleanQuery(value);
  106. }
  107. }
  108. } else {
  109. object.lastSample.queries = [];
  110. for (var j = 0; j < 12; j++) {
  111. if (j < nbQueries) {
  112. var value = updateQuery(cleanQuery());
  113. object.lastSample.queries.push(value);
  114. } else {
  115. object.lastSample.queries.push(cleanQuery());
  116. }
  117. }
  118. }
  119. for (var i = 0; i < 5; i++) {
  120. var source = object.lastSample.queries[i];
  121. object.lastSample.topFiveQueries[i] = source;
  122. }
  123. object.lastSample.nbQueries = nbQueries;
  124. object.lastSample.countClassName = countClassName(nbQueries);
  125. return object;
  126. }
  127. function getData(keepIdentity) {
  128. var oldData = data;
  129. if (!keepIdentity) { // reset for each tick when !keepIdentity
  130. data = [];
  131. for (var i = 1; i <= ENV.rows; i++) {
  132. data.push({ dbname: 'cluster' + i, query: "", formatElapsed: "", elapsedClassName: "" });
  133. data.push({ dbname: 'cluster' + i + ' slave', query: "", formatElapsed: "", elapsedClassName: "" });
  134. }
  135. }
  136. if (!data) { // first init when keepIdentity
  137. data = [];
  138. for (var i = 1; i <= ENV.rows; i++) {
  139. data.push({ dbname: 'cluster' + i });
  140. data.push({ dbname: 'cluster' + i + ' slave' });
  141. }
  142. oldData = data;
  143. }
  144. for (var i in data) {
  145. var row = data[i];
  146. if (!keepIdentity && oldData && oldData[i]) {
  147. row.lastSample = oldData[i].lastSample;
  148. }
  149. if (!row.lastSample || Math.random() < ENV.mutations()) {
  150. counter = counter + 1;
  151. if (!keepIdentity) {
  152. row.lastSample = null;
  153. }
  154. generateRow(row, keepIdentity, counter);
  155. } else {
  156. data[i] = oldData[i];
  157. }
  158. }
  159. first = false;
  160. return {
  161. toArray: function() {
  162. return data;
  163. }
  164. };
  165. }
  166. var mutationsValue = 0.5;
  167. function mutations(value) {
  168. if (value) {
  169. mutationsValue = value;
  170. return mutationsValue;
  171. } else {
  172. return mutationsValue;
  173. }
  174. }
  175. var body = document.querySelector('body');
  176. var theFirstChild = body.firstChild;
  177. var sliderContainer = document.createElement( 'div' );
  178. sliderContainer.style.cssText = "display: flex";
  179. var slider = document.createElement('input');
  180. var text = document.createElement('label');
  181. text.innerHTML = 'mutations : ' + (mutationsValue * 100).toFixed(0) + '%';
  182. text.id = "ratioval";
  183. slider.setAttribute("type", "range");
  184. slider.style.cssText = 'margin-bottom: 10px; margin-top: 5px';
  185. slider.addEventListener('change', function(e) {
  186. ENV.mutations(e.target.value / 100);
  187. document.querySelector('#ratioval').innerHTML = 'mutations : ' + (ENV.mutations() * 100).toFixed(0) + '%';
  188. });
  189. sliderContainer.appendChild( text );
  190. sliderContainer.appendChild( slider );
  191. body.insertBefore( sliderContainer, theFirstChild );
  192. return {
  193. generateData: getData,
  194. rows: 50,
  195. timeout: 0,
  196. mutations: mutations
  197. };
  198. })();