index.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  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 curlify = require('request-as-curl');
  7. var mysql = require('mysql');
  8. var connection = mysql.createConnection({
  9. host: 'mysql',
  10. user: 'root',
  11. password: '235r2342gtfsw',
  12. database: 'statsd_db',
  13. multipleStatements: true
  14. });
  15. app.use(morgan('combined'))
  16. app.use(bodyParser.json());
  17. function setCORSHeaders(res) {
  18. res.setHeader("Access-Control-Allow-Origin", "*");
  19. res.setHeader("Access-Control-Allow-Methods", "POST");
  20. res.setHeader("Access-Control-Allow-Headers", "accept, content-type");
  21. }
  22. app.all('/', function(req, res) {
  23. setCORSHeaders(res);
  24. console.log(curlify(req, req.body));
  25. res.send('https://grafana.com/plugins/grafana-simple-json-datasource\n');
  26. res.end();
  27. });
  28. var tables = ['gauges_statistics', 'counters_statistics', 'timers_statistics', 'sets_statistics'];
  29. app.all('/search', function(req, res) {
  30. console.log(curlify(req, req.body));
  31. var mysql_search_result = [];
  32. var target = req.body.target; // metric
  33. var results = tables.map(function(table) {
  34. return new Promise((resolve, reject) => {
  35. connection.query('SELECT DISTINCT(`name`) FROM `' + table + '` WHERE `name` LIKE ("%' + target + '%") ORDER BY `name`', function(err, rows, fields) {
  36. if (err) {
  37. console.log(err);
  38. reject(err);
  39. }
  40. var rtr = [];
  41. for (var i = 0; i < rows.length; i++) {
  42. if (rtr.indexOf(rows[i].name) === -1) { // Se agregan solo los name que no esten en result
  43. rtr.push(rows[i].name);
  44. }
  45. }
  46. resolve(rtr);
  47. });
  48. });
  49. });
  50. Promise.all(results).then(v => {
  51. setCORSHeaders(res);
  52. console.log(v);
  53. for(var i = 0; i < v.length; i++){
  54. mysql_search_result = mysql_search_result.concat(v[i]);
  55. }
  56. res.json(mysql_search_result);
  57. res.end();
  58. }, reason => {
  59. console.log(reason)
  60. res.status(500).send(reason);
  61. });
  62. });
  63. app.all('/query', function(req, res) {
  64. console.log(curlify(req, req.body));
  65. var mysql_query_result = [];
  66. var from = new Date(req.body.range.from);
  67. var to = new Date(req.body.range.to);
  68. var from_str = Math.floor(from.getTime() / 1000);
  69. var to_str = Math.floor(to.getTime() / 1000);
  70. var names = _.map(req.body.targets, function(t) {
  71. return t.target;
  72. });
  73. var results = tables.map(function(table) {
  74. return new Promise((resolve, reject) => {
  75. var interval = req.body.intervalMs / 1000;
  76. var mode = "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ";
  77. var sql = mode + 'SELECT `timestamp`, `name`, `value` FROM `' + table + '` WHERE (`timestamp` BETWEEN ' + from_str + ' AND ' + to_str + ') AND (`name` IN ("' + names.join('", "') + '"))';
  78. var group_by = '';
  79. var order_by = ' ORDER BY `timestamp` ASC';
  80. var maxDataPoints = req.body.maxDataPoints;
  81. var limit = ' LIMIT ' + maxDataPoints + ';';
  82. sql += group_by + order_by + limit;
  83. console.log(sql);
  84. connection.query(sql, function(err, rows, fields) {
  85. if (err) {
  86. console.log(err);
  87. reject(err);
  88. }
  89. var result = [];
  90. var results = rows[1];
  91. for (var i = 0; i < results.length; i++) {
  92. var name = results[i].name;
  93. if (name !== undefined) {
  94. if (result[name] === undefined) {
  95. result[name] = [];
  96. }
  97. result[name].push([results[i].value, 1000 * results[i].timestamp]);
  98. }
  99. }
  100. var keys = _.keys(result);
  101. var return_data = [];
  102. for (var i = 0; i < keys.length; i++) {
  103. if(result[keys[i]].length > 0){
  104. var data = {
  105. target: keys[i],
  106. datapoints: result[keys[i]]
  107. };
  108. return_data.push(data);
  109. }
  110. }
  111. resolve(return_data);
  112. });
  113. });
  114. });
  115. Promise.all(results).then(val => {
  116. var rtr = []
  117. for(var i=0; i<val.length; ++i){
  118. for(var j=0; j<val[i].length; ++j) {
  119. console.log(val[i][j]);
  120. if(val[i][j]){
  121. rtr.push(val[i][j]);
  122. }
  123. }
  124. }
  125. console.log(rtr);
  126. setCORSHeaders(res);
  127. res.json(rtr);
  128. res.end();
  129. }, reason => {
  130. console.log(reason)
  131. res.status(500).send(reason);
  132. });
  133. });
  134. function last(table, req, mysql_query_result, res) {
  135. var names = _.map(req.body.targets, function(t) {
  136. return t.target;
  137. });
  138. var mode = "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ";
  139. var sql = mode + 'SELECT `timestamp`, `name`, `value` FROM `' + table + '` WHERE (`name` IN ("' + names.join('", "') + '"))';
  140. var group_by = '';
  141. var order_by = ' ORDER BY `timestamp` DESC';
  142. var maxDataPoints = req.body.maxDataPoints;
  143. var limit = ' LIMIT ' + maxDataPoints + ';';
  144. sql += group_by + order_by + limit;
  145. connection.query(sql, function(err, rows, fields) {
  146. if (err) {
  147. console.log(err);
  148. throw err;
  149. }
  150. var result = [];
  151. var results = rows[1];
  152. for (var i = 0; i < results.length; i++) {
  153. var name = results[i].name;
  154. if (name !== undefined) {
  155. if (result[name] === undefined) {
  156. result[name] = [];
  157. }
  158. result[name].push([results[i].value, 1000 * results[i].timestamp]);
  159. }
  160. }
  161. var keys = _.keys(result);
  162. for (var i = 0; i < keys.length; i++) {
  163. var data = {
  164. target: keys[i],
  165. datapoints: result[keys[i]]
  166. };
  167. mysql_query_result.push(data);
  168. }
  169. if (res !== undefined) {
  170. setCORSHeaders(res);
  171. res.json(mysql_query_result);
  172. res.end();
  173. }
  174. });
  175. }
  176. app.all('/last', function(req, res) {
  177. var mysql_query_result = [];
  178. last('gauges_statistics', req, mysql_query_result, res);
  179. });
  180. app.listen(8000);
  181. console.log("Server is listening to port 8000");