index.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. multipleStatements: true
  13. });
  14. app.use(morgan('combined'))
  15. app.use(bodyParser.json());
  16. function setCORSHeaders(res) {
  17. res.setHeader("Access-Control-Allow-Origin", "*");
  18. res.setHeader("Access-Control-Allow-Methods", "POST");
  19. res.setHeader("Access-Control-Allow-Headers", "accept, content-type");
  20. }
  21. app.all('/', function(req, res) {
  22. setCORSHeaders(res);
  23. res.send('https://grafana.com/plugins/grafana-simple-json-datasource\n');
  24. res.end();
  25. });
  26. function search(table, mysql_search_result, value, res)
  27. {
  28. // connection.query('SELECT DISTINCT(`name`) FROM `' + table + '` WHERE `name` NOT IN ("' + mysql_search_result.join('", "') + '") ORDER BY `name`', function (err, rows, fields) {
  29. connection.query('SELECT DISTINCT(`name`) FROM `' + table + '` WHERE `name` LIKE ("%' + value + '%") ORDER BY `name`', function (err, rows, fields) {
  30. if (err) {
  31. console.log(err);
  32. throw err;
  33. }
  34. for (var i = 0; i < rows.length; i++) {
  35. if (mysql_search_result.indexOf(rows[i].name) === -1) { // Se agregan solo los name que no esten en result
  36. mysql_search_result.push(rows[i].name);
  37. }
  38. }
  39. if (res) {
  40. setCORSHeaders(res);
  41. res.json(mysql_search_result);
  42. res.end();
  43. }
  44. });
  45. }
  46. app.all('/search', function (req, res) {
  47. var mysql_search_result = [];
  48. var target = req.body.target; // metric
  49. search('gauges_statistics', mysql_search_result, target);
  50. search('counters_statistics', mysql_search_result, target);
  51. search('timers_statistics', mysql_search_result, target);
  52. search('sets_statistics', mysql_search_result, target, res);
  53. });
  54. function query(table, req, mysql_query_result, res)
  55. {
  56. var from = new Date(req.body.range.from);
  57. var to = new Date(req.body.range.to);
  58. var from_str = Math.floor(from.getTime() / 1000);
  59. var to_str = Math.floor(to.getTime() / 1000);
  60. var names = _.map(req.body.targets, function (t) {
  61. return t.target;
  62. });
  63. //var sql = mode + 'SELECT `timestamp`, `name`, AVG(`value`) AS `value` FROM `' + table + '` WHERE (`timestamp` BETWEEN ' + from_str + ' AND ' + to_str + ') AND (`name` IN ("' + names.join('", "') + '"))';
  64. //var group_by = ' GROUP BY UNIX_TIMESTAMP(`timestamp`) DIV ' + interval;
  65. var interval = req.body.intervalMs / 1000;
  66. var mode = "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ";
  67. var sql = mode + 'SELECT `timestamp`, `name`, `value` FROM `' + table + '` WHERE (`timestamp` BETWEEN ' + from_str + ' AND ' + to_str + ') AND (`name` IN ("' + names.join('", "') + '"))';
  68. var group_by = '';
  69. var order_by = ' ORDER BY `timestamp` ASC';
  70. var maxDataPoints = req.body.maxDataPoints;
  71. var limit = ' LIMIT ' + maxDataPoints + ';';
  72. sql += group_by + order_by + limit;
  73. connection.query(sql, function (err, rows, fields) {
  74. if (err) {
  75. console.log(err);
  76. throw err;
  77. }
  78. var result = [];
  79. var results = rows[1];
  80. for (var i = 0; i < results.length; i++) {
  81. var name = results[i].name;
  82. if (name !== undefined) {
  83. if (result[name] === undefined) {
  84. result[name] = [];
  85. }
  86. result[name].push([results[i].value, 1000 * results[i].timestamp]);
  87. }
  88. }
  89. var keys = _.keys(result);
  90. for (var i = 0; i < keys.length; i++) {
  91. var data = {
  92. target: keys[i],
  93. datapoints: result[keys[i]]
  94. };
  95. mysql_query_result.push(data);
  96. }
  97. if (res !== undefined) {
  98. setCORSHeaders(res);
  99. res.json(mysql_query_result);
  100. res.end();
  101. }
  102. });
  103. }
  104. app.all('/query', function (req, res) {
  105. var mysql_query_result = [];
  106. query('gauges_statistics', req, mysql_query_result);
  107. query('counters_statistics', req, mysql_query_result);
  108. query('timers_statistics', req, mysql_query_result);
  109. query('sets_statistics', req, mysql_query_result, res);
  110. });
  111. app.listen(8000);
  112. console.log("Server is listening to port 8000");