'use strict'; var express = require('express'); var morgan = require('morgan'); var bodyParser = require('body-parser'); var _ = require('lodash'); var app = express(); var mongo = require('mongodb'), MongoClient = mongo.MongoClient, async = require('async'), util = require('util'), dbs = {}, options = { debug: false, prefix: true, size: 100, max: 2610, name: 'statsd', host: 'mongodb', port: 27017 }; 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(); }); var result = []; app.all('/search', function (req, res) { setCORSHeaders(res); mongo.connect("mongodb://" + options.host + "/" + options.name, function (err, db) { if (err) { console.log(err); } if (options.debug) { console.log("Connected successfully to server"); } db.listCollections().toArray(function(err, collInfos) { result = []; for (var i = 0; i <= collInfos.length -1; i++) { if (collInfos[i]) { result.push(collInfos[i].name); } } }); res.json(result); res.end(); }); }); var tsResult = []; app.all('/query', function (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 name = names.join('", "'); var interval = req.body.intervalMs / 1000; var maxDataPoints = req.body.maxDataPoints; mongo.connect("mongodb://" + options.host + "/" + options.name, function (err, db) { if (err) { console.log(err); } // https://docs.mongodb.com/manual/reference/method/db.collection.find/#db.collection.find db.collection(""+name).find({ time: { $gte: from_str, $lte: to_str } }, { type: 1, time: 1, count:1, durations: 1, gauge: 1, set: 1, $slice: maxDataPoints }).sort({ time: 1 }).toArray(function (err, docs) { if (err) { console.log(err); } var result = {}; result[name] = new Array(); _.each(docs, function (d) { var value = 0; if (d.type == 'counters') { value = d.count; } else if (d.type == 'timers') { value = d.durations; } else if (d.type == 'gauges') { value = d.gauge; } else if (d.type == 'sets') { value = d.set; } (result[name]).push([value, 1000 * d.time]); }); tsResult = []; _.each(_.keys(result), function (d) { var data = { target: d, datapoints: result[d] }; tsResult.push(data); }); setCORSHeaders(res); res.json(tsResult); res.end(); }); }); }); app.listen(8000); console.log("Server is listening to port 8000");