index.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. var express = require('express');
  2. var morgan = require('morgan');
  3. var bodyParser = require('body-parser');
  4. var _ = require('lodash');
  5. var app = express();
  6. var mysql = require('mysql');
  7. var connection = mysql.createConnection({
  8. host : 'mysql',
  9. user : 'root',
  10. password : '235r2342gtfsw',
  11. database : 'statsd_db'
  12. });
  13. app.use(morgan('combined'))
  14. app.use(bodyParser.json());
  15. var timeserie = [
  16. {'target': 's1', 'datapoints': [ [0,0], [1,0], [2,0], [3,0], [4,0] , [5,0], [6,0] , [7,0], [8,0], [9,0], [10,0], [11,0], [12,0], [13,0], [14,0], [15,0]]},
  17. {'target': 's2', 'datapoints': [ [15,0], [14,0], [13,0], [12,0], [11,0] , [10,0], [9,0] , [8,0], [7,0], [6,0], [5,0], [4,0], [3,0], [2,0], [1,0], [0,0]]},
  18. {'target': 's3', 'datapoints': [ [0,0], [1,0], [2,0], [3,0], [4,0] , [5,0], [6,0] , [7,0], [8,0], [9,0], [10,0], [11,0], [12,0], [13,0], [14,0], [15,0]]},
  19. {'target': 's4', 'datapoints': [ [15,0], [14,0], [13,0], [12,0], [11,0] , [10,0], [9,0] , [8,0], [7,0], [6,0], [5,0], [4,0], [3,0], [2,0], [1,0], [0,0]]},
  20. {'target': 's5', 'datapoints': [ [0,0], [1,0], [2,0], [3,0], [4,0] , [5,0], [6,0] , [7,0], [8,0], [9,0], [10,0], [11,0], [12,0], [13,0], [14,0], [15,0]]},
  21. {'target': 's6', 'datapoints': [ [15,0], [14,0], [13,0], [12,0], [11,0] , [10,0], [9,0] , [8,0], [7,0], [6,0], [5,0], [4,0], [3,0], [2,0], [1,0], [0,0]]}
  22. ]; //require('./series');
  23. var now = Date.now();
  24. for (var i = timeserie.length -1; i >= 0; i--) {
  25. var series = timeserie[i];
  26. var decreaser = 0;
  27. for (var y = series.datapoints.length -1; y >= 0; y--) {
  28. series.datapoints[y][1] = Math.round((now - decreaser) /1000) * 1000;
  29. decreaser += 50000;
  30. }
  31. }
  32. var annotation = {
  33. name : "annotation name",
  34. enabled: true,
  35. datasource: "generic datasource",
  36. showLine: true,
  37. }
  38. var annotations = [
  39. { annotation: annotation, "title": "Donlad trump is kinda funny", "time": 1450754160000, text: "teeext", tags: "taaags" },
  40. { annotation: annotation, "title": "Wow he really won", "time": 1450754160000, text: "teeext", tags: "taaags" },
  41. { annotation: annotation, "title": "When is the next ", "time": 1450754160000, text: "teeext", tags: "taaags" }
  42. ];
  43. var now = Date.now();
  44. var decreaser = 0;
  45. for (var i = 0;i < annotations.length; i++) {
  46. var anon = annotations[i];
  47. anon.time = (now - decreaser);
  48. decreaser += 1000000
  49. }
  50. var table =
  51. {
  52. columns: [{text: 'Time', type: 'time'}, {text: 'Country', type: 'string'}, {text: 'Number', type: 'number'}],
  53. values: [
  54. [ 1234567, 'SE', 123 ],
  55. [ 1234567, 'DE', 231 ],
  56. [ 1234567, 'US', 321 ],
  57. ]
  58. };
  59. function setCORSHeaders(res) {
  60. res.setHeader("Access-Control-Allow-Origin", "*");
  61. res.setHeader("Access-Control-Allow-Methods", "POST");
  62. res.setHeader("Access-Control-Allow-Headers", "accept, content-type");
  63. }
  64. var now = Date.now();
  65. var decreaser = 0;
  66. for (var i = 0;i < table.values.length; i++) {
  67. var anon = table.values[i];
  68. anon[0] = (now - decreaser);
  69. decreaser += 1000000
  70. }
  71. app.all('/', function(req, res) {
  72. setCORSHeaders(res);
  73. res.send('https://grafana.com/plugins/grafana-simple-json-datasource\n');
  74. res.end();
  75. });
  76. var result = [];
  77. function search(table)
  78. {
  79. connection.query('SELECT `name` FROM `' + table + '` GROUP BY `name` ORDER BY `name`', function (err, rows, fields) {
  80. if (err)
  81. throw err;
  82. _.each(rows, function (ts) {
  83. if (result.indexOf(ts.name) === -1) { // Se agregan solo los name que no esten en result
  84. result.push(ts.name);
  85. }
  86. });
  87. });
  88. }
  89. app.all('/search', function (req, res) {
  90. setCORSHeaders(res);
  91. search('gauges_statistics');
  92. search('counters_statistics');
  93. search('timers_statistics');
  94. search('sets_statistics');
  95. res.json(result);
  96. res.end();
  97. });
  98. /**
  99. * Este metodo no esta implementado.
  100. */
  101. //app.all('/annotations', function(req, res) {
  102. // setCORSHeaders(res);
  103. // console.log(req.url);
  104. // console.log(req.body);
  105. //
  106. // res.json(annotations);
  107. // res.end();
  108. //})
  109. /**
  110. * @todo : intervalMs: 500,
  111. * targets: [ {
  112. * type: 'timeserie'
  113. * }]
  114. * maxDataPoints: 1920,
  115. *
  116. */
  117. var tsResult = [];
  118. function query(table, req)
  119. {
  120. var from = new Date(req.body.range.from);
  121. var to = new Date(req.body.range.to);
  122. var from_str = Math.floor(from.getTime() / 1000);
  123. var to_str = Math.floor(to.getTime() / 1000);
  124. var names = _.map(req.body.targets, function (t) {
  125. return t.target
  126. console.log(t);
  127. });
  128. var sql = 'SELECT timestamp, name, AVG(value) as value FROM `' + table + '` WHERE (timestamp BETWEEN ' + from_str + ' AND ' + to_str + ') AND (`name` IN ("' + names.join('", "') + '")) ORDER BY timestamp ASC';
  129. var interval = req.body.intervalMs / 1000;
  130. var group_by = ' GROUP BY UNIX_TIMESTAMP(timestamp) DIV ' + interval;
  131. var maxDataPoints = req.body.maxDataPoints;
  132. var limit = ' LIMIT ' + maxDataPoints;
  133. sql += group_by + limit;
  134. console.log(sql);
  135. connection.query(sql, function (err, rows, fields) {
  136. var result = {};
  137. _.each(rows, function (d) {
  138. if (!(d.name in result)) {
  139. result[d.name] = new Array();
  140. }
  141. (result[d.name]).push([d.value, 1000 * d.timestamp]);
  142. });
  143. _.each(_.keys(result), function (d) {
  144. var data = {target: d};
  145. data['datapoints'] = result[d];
  146. tsResult.push(data);
  147. });
  148. });
  149. }
  150. app.all('/query', function (req, res) {
  151. setCORSHeaders(res);
  152. console.log(req.url);
  153. console.log(req.body);
  154. query('gauges_statistics', req);
  155. query('counters_statistics', req);
  156. query('timers_statistics', req);
  157. query('sets_statistics', req);
  158. res.json(tsResult);
  159. res.end();
  160. });
  161. app.listen(8000);
  162. console.log("Server is listening to port 8000");