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, mysql_search_result, value, res) { // connection.query('SELECT DISTINCT(`name`) FROM `' + table + '` WHERE `name` NOT IN ("' + mysql_search_result.join('", "') + '") ORDER BY `name`', function (err, rows, fields) { connection.query('SELECT DISTINCT(`name`) FROM `' + table + '` WHERE `name` LIKE ("%' + value + '%") 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); } } if (res) { setCORSHeaders(res); res.json(mysql_search_result); res.end(); } }); } app.all('/search', function (req, res) { var mysql_search_result = []; var target = req.body.target; // metric search('gauges_statistics', mysql_search_result, target); search('counters_statistics', mysql_search_result, target); search('timers_statistics', mysql_search_result, target); search('sets_statistics', mysql_search_result, target, res); }); function query(table, req, mysql_query_result, 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 = []; var results = rows[1]; for (var i = 0; i < results.length; i++) { var name = results[i].name; if (name !== undefined) { if (result[name] === undefined) { result[name] = []; } result[name].push([results[i].value, 1000 * results[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(); } }); } app.all('/query', function (req, res) { var mysql_query_result = []; query('gauges_statistics', req, mysql_query_result); query('counters_statistics', req, mysql_query_result); query('timers_statistics', req, mysql_query_result); query('sets_statistics', req, mysql_query_result, res); }); app.listen(8000); console.log("Server is listening to port 8000");