123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- '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");
|