|
@@ -10,7 +10,8 @@ var connection = mysql.createConnection({
|
|
|
host : 'mysql',
|
|
|
user : 'root',
|
|
|
password : '235r2342gtfsw',
|
|
|
- database : 'statsd_db'
|
|
|
+ database : 'statsd_db',
|
|
|
+ multipleStatements: true
|
|
|
});
|
|
|
|
|
|
app.use(morgan('combined'))
|
|
@@ -116,76 +117,63 @@ app.all('/search', function (req, res) {
|
|
|
res.end();
|
|
|
});
|
|
|
|
|
|
-/**
|
|
|
- * Este metodo no esta implementado.
|
|
|
- */
|
|
|
-//app.all('/annotations', function(req, res) {
|
|
|
-// setCORSHeaders(res);
|
|
|
-// console.log(req.url);
|
|
|
-// console.log(req.body);
|
|
|
-//
|
|
|
-// res.json(annotations);
|
|
|
-// res.end();
|
|
|
-//})
|
|
|
-
|
|
|
-/**
|
|
|
- * @todo : intervalMs: 500,
|
|
|
- * targets: [ {
|
|
|
- * type: 'timeserie'
|
|
|
- * }]
|
|
|
- * maxDataPoints: 1920,
|
|
|
- *
|
|
|
- */
|
|
|
var tsResult = [];
|
|
|
-function query(table, req)
|
|
|
+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
|
|
|
- console.log(t);
|
|
|
+ return t.target;
|
|
|
});
|
|
|
- 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';
|
|
|
-
|
|
|
+
|
|
|
+ //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 group_by = ' GROUP BY UNIX_TIMESTAMP(timestamp) DIV ' + interval;
|
|
|
-
|
|
|
+ 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 + limit;
|
|
|
- console.log(sql);
|
|
|
+ var limit = ' LIMIT ' + maxDataPoints + ';';
|
|
|
+ sql += group_by + order_by + limit;
|
|
|
+
|
|
|
connection.query(sql, function (err, rows, fields) {
|
|
|
var result = {};
|
|
|
- _.each(rows, function (d) {
|
|
|
- if (!(d.name in result)) {
|
|
|
- result[d.name] = new Array();
|
|
|
+ if (err) {
|
|
|
+ console.log(err);
|
|
|
+ }
|
|
|
+ _.each(rows[1], function (d) {
|
|
|
+ if (d.name) {
|
|
|
+ if (!(d.name in result)) {
|
|
|
+ result[d.name] = new Array();
|
|
|
+ }
|
|
|
+ (result[d.name]).push([d.value, 1000 * d.timestamp]);
|
|
|
}
|
|
|
- (result[d.name]).push([d.value, 1000 * d.timestamp]);
|
|
|
});
|
|
|
-
|
|
|
_.each(_.keys(result), function (d) {
|
|
|
- var data = {target: d};
|
|
|
- data['datapoints'] = result[d];
|
|
|
+ var data = {
|
|
|
+ target: d,
|
|
|
+ datapoints: result[d]
|
|
|
+ };
|
|
|
tsResult.push(data);
|
|
|
});
|
|
|
+ if (res) {
|
|
|
+ setCORSHeaders(res);
|
|
|
+ res.json(tsResult);
|
|
|
+ res.end();
|
|
|
+ }
|
|
|
});
|
|
|
}
|
|
|
|
|
|
app.all('/query', function (req, res) {
|
|
|
- setCORSHeaders(res);
|
|
|
- console.log(req.url);
|
|
|
- console.log(req.body);
|
|
|
-
|
|
|
+ tsResult = [];
|
|
|
query('gauges_statistics', req);
|
|
|
query('counters_statistics', req);
|
|
|
query('timers_statistics', req);
|
|
|
- query('sets_statistics', req);
|
|
|
-
|
|
|
- res.json(tsResult);
|
|
|
- res.end();
|
|
|
+ query('sets_statistics', req, res);
|
|
|
});
|
|
|
|
|
|
app.listen(8000);
|