var express = require('express'); var morgan = require('morgan'); var bodyParser = require('body-parser'); var _ = require('lodash'); var app = express(); var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'mysql', user : 'root', password : '235r2342gtfsw', database : 'statsd_db', multipleStatements: true }); app.use(morgan('combined')) app.use(bodyParser.json()); function setCORSHeaders(res) { res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Methods", "POST"); res.setHeader("Access-Control-Allow-Headers", "accept, content-type"); } app.all('/', function(req, res) { setCORSHeaders(res); res.send('https://grafana.com/plugins/grafana-simple-json-datasource\n'); res.end(); }); function search(table, res) { connection.query('SELECT DISTINCT(`name`) FROM `' + table + '` WHERE `name` NOT IN ("' + mysql_search_result.join('", "') + '") ORDER BY `name`', function (err, rows, fields) { if (err) { console.log(err); throw err; } for (var i = 0; i < rows.length; i++) { if (mysql_search_result.indexOf(rows[i].name) === -1) { // Se agregan solo los name que no esten en result mysql_search_result.push(rows[i].name); } } }); } var mysql_search_result = []; search('gauges_statistics'); search('counters_statistics'); search('timers_statistics'); search('sets_statistics'); app.all('/search', function (req, res) { setCORSHeaders(res); res.json(mysql_search_result); res.end(); search('gauges_statistics'); search('counters_statistics'); search('timers_statistics'); search('sets_statistics'); }); function query(table, req, res) { var from = new Date(req.body.range.from); var to = new Date(req.body.range.to); var from_str = Math.floor(from.getTime() / 1000); var to_str = Math.floor(to.getTime() / 1000); var names = _.map(req.body.targets, function (t) { return t.target; }); //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('", "') + '"))'; //var group_by = ' GROUP BY UNIX_TIMESTAMP(`timestamp`) DIV ' + interval; var interval = req.body.intervalMs / 1000; var mode = "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); "; var sql = mode + 'SELECT `timestamp`, `name`, `value` FROM `' + table + '` WHERE (`timestamp` BETWEEN ' + from_str + ' AND ' + to_str + ') AND (`name` IN ("' + names.join('", "') + '"))'; var group_by = ''; var order_by = ' ORDER BY `timestamp` ASC'; var maxDataPoints = req.body.maxDataPoints; var limit = ' LIMIT ' + maxDataPoints + ';'; sql += group_by + order_by + limit; connection.query(sql, function (err, rows, fields) { if (err) { console.log(err); throw err; } var result = []; for (var i = 0; i < rows.length; i++) { if (rows[i].name !== undefined) { if (result.indexOf(rows[i].name) === -1) { result[rows[i].name] = new Array(); } (result[rows[i].name]).push([rows[i].value, 1000 * rows[i].timestamp]); } } var keys = _.keys(result); for (var i = 0; i < keys.length; i++) { var data = { target: keys[i], datapoints: result[keys[i]] }; mysql_query_result.push(data); } if (res !== undefined) { setCORSHeaders(res); res.json(mysql_query_result); res.end(); } }); } var mysql_query_result = []; app.all('/query', function (req, res) { mysql_query_result = []; query('gauges_statistics', req); query('counters_statistics', req); query('timers_statistics', req); query('sets_statistics', req, res); }); app.listen(8000); console.log("Server is listening to port 8000");