stats.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. window.addEvent('domready', function() {
  2. 'use strict';
  3. Rickshaw.Graph.Axis.Y.Base1024KMGTP = Rickshaw.Class.create(Rickshaw.Graph.Axis.Y, {
  4. '_drawAxis': function($super, scale) {
  5. var axis = d3.svg.axis().scale(scale).orient(this.orientation);
  6. var domain = axis.scale().domain();
  7. var tickSpacing = 1;
  8. while (tickSpacing * 1024 < domain[1])
  9. tickSpacing *= 1024;
  10. while (tickSpacing * 20 < domain[1])
  11. tickSpacing *= 10;
  12. while (tickSpacing * 5 < domain[1])
  13. tickSpacing *= 2;
  14. var min = Math.ceil(domain[0] / tickSpacing);
  15. var max = Math.floor(domain[1] / tickSpacing) + 1;
  16. var tickValues = [];
  17. for (var i = min * tickSpacing; i < max; i += 1)
  18. tickValues.push(i * tickSpacing);
  19. axis.tickValues(tickValues);
  20. axis.tickFormat(this.tickFormat);
  21. if (this.orientation == 'left') {
  22. var berth = this.height * berthRate;
  23. var transform = 'translate(' + this.width + ', ' + berth + ')';
  24. }
  25. if (this.element)
  26. this.vis.selectAll('*').remove();
  27. this.vis
  28. .append('svg:g')
  29. .attr('class', ['y_ticks', this.ticksTreatment].join(' '))
  30. .attr('transform', transform)
  31. .call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(this.tickSize));
  32. return axis;
  33. },
  34. });
  35. var split = document.location.pathname.split('/');
  36. var url = window.sysvitals.api_host + '/v1/' + split[2] + '/stats/' + split[3];
  37. function get_stats(start, end, interval) {
  38. new Request.JSON({
  39. 'url': url + '?start=' + start + '&end=' + end + '&interval=' + interval,
  40. 'headers': {'Authorization': window.sysvitals.api_key},
  41. 'onSuccess': function(data) {
  42. Object.each(data, function(subfields, field) {
  43. graph_stat(field, subfields, interval);
  44. });
  45. },
  46. }).get();
  47. }
  48. var intervals = {
  49. 1: 15,
  50. 7: 60,
  51. 30: 360,
  52. 90: 1440,
  53. }
  54. function change_res() {
  55. var days = $('resolution').get('value');
  56. var start = moment.utc().subtract('days', days - 1).format('YYYY-MM-DD');
  57. var end = moment.utc().format('YYYY-MM-DD');
  58. get_stats(start, end, intervals[days]);
  59. }
  60. $('resolution').addEvent('change', change_res);
  61. change_res();
  62. var colors = {
  63. 'cpu': [
  64. ['user', '#33a'],
  65. ['nice', '#55c'],
  66. ['iowait', '#a33'],
  67. ['system', '#aa3'],
  68. ['irq', '#711'],
  69. ['softirq', '#771'],
  70. ['guest', '#555'],
  71. ['guest_nice', '#777'],
  72. ['steal', '#a71'],
  73. ['idle', '#3aa'],
  74. ],
  75. 'mem': [
  76. ['used', '#a33'],
  77. ['buffers', '#3aa'],
  78. ['cached', '#33a'],
  79. ['free', '#3a3'],
  80. ],
  81. 'net': [
  82. ['err_in', '#a33', 'line'],
  83. ['err_out', '#aa3', 'line'],
  84. ['drop_in', '#711', 'line'],
  85. ['drop_out', '#a71', 'line'],
  86. ['bit/s_in', '#33a', 'area'],
  87. ['bit/s_out', '#3a3', 'area'],
  88. ],
  89. };
  90. function graph_stat(field, subfields, interval) {
  91. var subfield_metas = colors[field];
  92. if (field == 'disk') {
  93. var subfield_names = Object.keys(subfields);
  94. subfield_names.sort(function(a, b) { // reverse sort
  95. if (a > b) return -1;
  96. if (a < b) return 1;
  97. return 0;
  98. });
  99. subfield_metas = subfield_names.map(function(subfield) {
  100. if (subfield.substr(-5) == '_used')
  101. return [subfield, '#a33'];
  102. else
  103. return [subfield, '#3a3'];
  104. });
  105. }
  106. var series = [];
  107. subfield_metas.each(function(subfield_meta) {
  108. var subfield = subfield_meta[0];
  109. var color = subfield_meta[1];
  110. var days = Object.keys(subfields[subfield]).sort();
  111. var array = [];
  112. var index_start = moment.utc(days[0], 'YYYY-MM-DD').unix();
  113. days.each(function(day) {
  114. var day_array = subfields[subfield][day];
  115. if (day_array != null) {
  116. array = array.append(day_array.map(function(val, i) {
  117. return {'x': index_start + i * interval * 60, 'y': val};
  118. }));
  119. }
  120. index_start += 1440 * 60;
  121. });
  122. series.push({
  123. 'name': field + '.' + subfield,
  124. 'data': array,
  125. 'color': color,
  126. 'renderer': subfield_meta[2],
  127. });
  128. });
  129. var graph_div = new Element('div');
  130. var legend_div = new Element('div');
  131. var graph = new Rickshaw.Graph({
  132. 'element': graph_div,
  133. 'width': 400,
  134. 'height': 200,
  135. 'renderer': field == 'net' ? 'multi' : 'area',
  136. 'stroke': true,
  137. 'series': series,
  138. 'interpolation': 'step-after',
  139. });
  140. new Rickshaw.Graph.Legend({
  141. 'graph': graph,
  142. 'element': legend_div,
  143. });
  144. new Rickshaw.Graph.HoverDetail({
  145. 'graph': graph,
  146. });
  147. new Rickshaw.Graph.Axis.Time({
  148. 'graph': graph,
  149. });
  150. new Rickshaw.Graph.Axis.Y.Base1024KMGTP({
  151. 'graph': graph,
  152. 'tickFormat': Rickshaw.Fixtures.Number.formatBase1024KMGTP,
  153. });
  154. graph.render();
  155. $(field).empty().adopt(graph_div, legend_div);
  156. }
  157. });