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' }); 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", "*"); res.setHeader("Access-Control-Allow-Methods", "POST"); 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) { connection.query('SELECT `name` FROM `' + table + '` GROUP BY `name` ORDER BY `name`', function (err, rows, fields) { if (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); } }); }); } app.all('/search', function (req, res) { setCORSHeaders(res); 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) { 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); }); 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 interval = req.body.intervalMs / 1000; var group_by = ' GROUP BY UNIX_TIMESTAMP(timestamp) DIV ' + interval; var maxDataPoints = req.body.maxDataPoints; var limit = ' LIMIT ' + maxDataPoints; sql += group_by + limit; console.log(sql); connection.query(sql, function (err, rows, fields) { var result = {}; _.each(rows, function (d) { if (!(d.name in result)) { result[d.name] = new Array(); } (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); }); }); } app.all('/query', function (req, res) { setCORSHeaders(res); console.log(req.url); console.log(req.body); query('gauges_statistics', req); query('counters_statistics', req); query('timers_statistics', req); query('sets_statistics', req); res.json(tsResult); res.end(); }); app.listen(8000); console.log("Server is listening to port 8000");