|
@@ -4,69 +4,18 @@ 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'
|
|
|
+ database : 'statsd_db',
|
|
|
+ multipleStatements: true
|
|
|
});
|
|
|
|
|
|
app.use(morgan('combined'))
|
|
|
|
|
|
app.use(bodyParser.json());
|
|
|
-
|
|
|
-var timeserie = [
|
|
|
- {'target': 's1', 'datapoints': [ [0,0], [1,0], [2,0], [3,0], [4,0] , [5,0], [6,0] , [7,0], [8,0], [9,0], [10,0], [11,0], [12,0], [13,0], [14,0], [15,0]]},
|
|
|
- {'target': 's2', 'datapoints': [ [15,0], [14,0], [13,0], [12,0], [11,0] , [10,0], [9,0] , [8,0], [7,0], [6,0], [5,0], [4,0], [3,0], [2,0], [1,0], [0,0]]},
|
|
|
- {'target': 's3', 'datapoints': [ [0,0], [1,0], [2,0], [3,0], [4,0] , [5,0], [6,0] , [7,0], [8,0], [9,0], [10,0], [11,0], [12,0], [13,0], [14,0], [15,0]]},
|
|
|
- {'target': 's4', 'datapoints': [ [15,0], [14,0], [13,0], [12,0], [11,0] , [10,0], [9,0] , [8,0], [7,0], [6,0], [5,0], [4,0], [3,0], [2,0], [1,0], [0,0]]},
|
|
|
- {'target': 's5', 'datapoints': [ [0,0], [1,0], [2,0], [3,0], [4,0] , [5,0], [6,0] , [7,0], [8,0], [9,0], [10,0], [11,0], [12,0], [13,0], [14,0], [15,0]]},
|
|
|
- {'target': 's6', 'datapoints': [ [15,0], [14,0], [13,0], [12,0], [11,0] , [10,0], [9,0] , [8,0], [7,0], [6,0], [5,0], [4,0], [3,0], [2,0], [1,0], [0,0]]}
|
|
|
- ]; //require('./series');
|
|
|
-
|
|
|
-var now = Date.now();
|
|
|
-
|
|
|
-for (var i = timeserie.length -1; i >= 0; i--) {
|
|
|
- var series = timeserie[i];
|
|
|
- var decreaser = 0;
|
|
|
- for (var y = series.datapoints.length -1; y >= 0; y--) {
|
|
|
- series.datapoints[y][1] = Math.round((now - decreaser) /1000) * 1000;
|
|
|
- decreaser += 50000;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-var annotation = {
|
|
|
- name : "annotation name",
|
|
|
- enabled: true,
|
|
|
- datasource: "generic datasource",
|
|
|
- showLine: true,
|
|
|
-}
|
|
|
-
|
|
|
-var annotations = [
|
|
|
- { annotation: annotation, "title": "Donlad trump is kinda funny", "time": 1450754160000, text: "teeext", tags: "taaags" },
|
|
|
- { annotation: annotation, "title": "Wow he really won", "time": 1450754160000, text: "teeext", tags: "taaags" },
|
|
|
- { annotation: annotation, "title": "When is the next ", "time": 1450754160000, text: "teeext", tags: "taaags" }
|
|
|
-];
|
|
|
-
|
|
|
-var now = Date.now();
|
|
|
-var decreaser = 0;
|
|
|
-for (var i = 0;i < annotations.length; i++) {
|
|
|
- var anon = annotations[i];
|
|
|
- anon.time = (now - decreaser);
|
|
|
- decreaser += 1000000
|
|
|
-}
|
|
|
-
|
|
|
-var table =
|
|
|
- {
|
|
|
- columns: [{text: 'Time', type: 'time'}, {text: 'Country', type: 'string'}, {text: 'Number', type: 'number'}],
|
|
|
- values: [
|
|
|
- [ 1234567, 'SE', 123 ],
|
|
|
- [ 1234567, 'DE', 231 ],
|
|
|
- [ 1234567, 'US', 321 ],
|
|
|
- ]
|
|
|
- };
|
|
|
|
|
|
function setCORSHeaders(res) {
|
|
|
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
@@ -74,118 +23,105 @@ function setCORSHeaders(res) {
|
|
|
res.setHeader("Access-Control-Allow-Headers", "accept, content-type");
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-var now = Date.now();
|
|
|
-var decreaser = 0;
|
|
|
-for (var i = 0;i < table.values.length; i++) {
|
|
|
- var anon = table.values[i];
|
|
|
-
|
|
|
- anon[0] = (now - decreaser);
|
|
|
- decreaser += 1000000
|
|
|
-}
|
|
|
-
|
|
|
app.all('/', function(req, res) {
|
|
|
setCORSHeaders(res);
|
|
|
res.send('https://grafana.com/plugins/grafana-simple-json-datasource\n');
|
|
|
res.end();
|
|
|
});
|
|
|
|
|
|
-var result = [];
|
|
|
-function search(table)
|
|
|
+function search(table, res)
|
|
|
{
|
|
|
- connection.query('SELECT `name` FROM `' + table + '` GROUP BY `name` ORDER BY `name`', function (err, rows, fields) {
|
|
|
- if (err)
|
|
|
+ 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;
|
|
|
- _.each(rows, function (ts) {
|
|
|
- if (result.indexOf(ts.name) === -1) { // Se agregan solo los name que no esten en result
|
|
|
- result.push(ts.name);
|
|
|
+ }
|
|
|
+ for (var i = 0; i <= rows.length - 1; 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');
|
|
|
-
|
|
|
- res.json(result);
|
|
|
- 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);
|
|
|
+ throw err;
|
|
|
+ }
|
|
|
+
|
|
|
+ var result = [];
|
|
|
+ for (var i = 0; i < rows.length - 1; 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]);
|
|
|
}
|
|
|
- (result[d.name]).push([d.value, 1000 * d.timestamp]);
|
|
|
- });
|
|
|
-
|
|
|
- _.each(_.keys(result), function (d) {
|
|
|
- var data = {target: d};
|
|
|
- data['datapoints'] = result[d];
|
|
|
- tsResult.push(data);
|
|
|
- });
|
|
|
+ }
|
|
|
+ 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) {
|
|
|
- setCORSHeaders(res);
|
|
|
- console.log(req.url);
|
|
|
- console.log(req.body);
|
|
|
-
|
|
|
+ mysql_query_result = [];
|
|
|
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);
|