Merge pull request #205 from matiaspando/feat/stats2
Adding statistics to BWS
This commit is contained in:
commit
488e33e0e2
|
@ -9,6 +9,7 @@ var querystring = require('querystring');
|
|||
var bodyParser = require('body-parser')
|
||||
|
||||
var WalletService = require('./server');
|
||||
var stats = require('./stats');
|
||||
|
||||
log.disableColor();
|
||||
log.debug = log.verbose;
|
||||
|
@ -322,10 +323,22 @@ ExpressApp.prototype.start = function(opts, cb) {
|
|||
});
|
||||
});
|
||||
|
||||
router.get('/v1/stats/:from/:to/', function(req, res) {
|
||||
var opts = {};
|
||||
opts.from = req.params['from'];
|
||||
opts.to = req.params['to'];
|
||||
stats.getStats(opts, function(err, data) {
|
||||
if (err) return returnError(err, res, req);
|
||||
res.json(data);
|
||||
res.end();
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
this.app.use(opts.basePath || '/bws/api', router);
|
||||
|
||||
WalletService.initialize(opts, cb);
|
||||
|
||||
};
|
||||
|
||||
module.exports = ExpressApp;
|
||||
|
|
233
lib/stats.js
233
lib/stats.js
|
@ -1,133 +1,158 @@
|
|||
#!/usr/bin/env node
|
||||
|
||||
'use strict';
|
||||
|
||||
var _ = require('lodash');
|
||||
var mongodb = require('mongodb');
|
||||
var moment = require('moment');
|
||||
var async = require('async');
|
||||
var config = require('../config');
|
||||
|
||||
var otherDate;
|
||||
|
||||
//trying to parse optional parameter to get stats on any given date
|
||||
try {
|
||||
otherDate = process.argv[2] && moment(process.argv[2]).isValid() ? moment(process.argv[2]) : null;
|
||||
} catch (e) {
|
||||
console.log('Enter the date in the format YYYY-MM-DD.');
|
||||
}
|
||||
var c = config.storageOpts.mongoDb;
|
||||
var url = 'mongodb://' + (c.host || 'localhost') + ':' + (c.port || 27017) + '/bws';
|
||||
|
||||
var Today = otherDate || moment();
|
||||
var TotalTxLivenet = 0;
|
||||
var TotalAmountLivenet = 0;
|
||||
var TotalNewWalletsLivenet = 0;
|
||||
|
||||
var TotalTxTestnet = 0;
|
||||
var TotalAmountTestnet = 0;
|
||||
var TotalNewWalletsTestnet = 0;
|
||||
var startDate = moment();
|
||||
var endDate = moment();
|
||||
|
||||
var stats = {};
|
||||
var wallets = {};
|
||||
var bwsStats = {};
|
||||
|
||||
bwsStats.cleanUp = function() {
|
||||
stats = {
|
||||
'livenet': {},
|
||||
'testnet': {}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
var IsToday = function(date) {
|
||||
if (!date) return false;
|
||||
var date = moment(date * 1000);
|
||||
return (date >= Today.startOf('day') && date <= Today.endOf('day'));
|
||||
}
|
||||
|
||||
var TotalTxpForToday = function(data) {
|
||||
bwsStats.AddingWalletToCache = function(data) {
|
||||
if (!data) return;
|
||||
|
||||
if (!wallets[data.walletId]) {
|
||||
console.log('Walletid not found! ', data.walletId);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!IsToday(data.createdOn)) return;
|
||||
|
||||
if (wallets[data.walletId] == 'livenet') {
|
||||
TotalTxLivenet++;
|
||||
TotalAmountLivenet = TotalAmountLivenet + data.amount;
|
||||
} else if (wallets[data.walletId] == 'testnet') {
|
||||
TotalTxTestnet++;
|
||||
TotalAmountTestnet = TotalAmountTestnet + data.amount;
|
||||
} else {
|
||||
console.log('Invalid network ', wallets[data.walletId]);
|
||||
}
|
||||
wallets[data.id] = data.network;
|
||||
};
|
||||
|
||||
var TotalNewWalletForToday = function(data) {
|
||||
bwsStats.TotalNewWallets = function(data) {
|
||||
if (!data) return;
|
||||
|
||||
if (!wallets[data.id]) {
|
||||
wallets[data.id] = data.network;
|
||||
}
|
||||
if (!IsToday(data.createdOn)) return;
|
||||
|
||||
if (data.network == 'livenet') {
|
||||
TotalNewWalletsLivenet++;
|
||||
} else if (data.network == 'testnet') {
|
||||
TotalNewWalletsTestnet++;
|
||||
} else {
|
||||
console.log('Invalid data ', data);
|
||||
console.log('Invalid network ', data.network);
|
||||
var day = moment(data.createdOn * 1000).format('YYYYMMDD');
|
||||
if (!stats[data.network][day]) {
|
||||
stats[data.network][day] = {
|
||||
totalTx: 0,
|
||||
totalAmount: 0,
|
||||
totalNewWallets: 0
|
||||
};
|
||||
}
|
||||
stats[data.network][day].totalNewWallets++;
|
||||
};
|
||||
|
||||
var PrintStats = function() {
|
||||
console.log('Stats for date : ', Today.format("YYYY-MM-DD"));
|
||||
console.log(' ');
|
||||
console.log('Livenet stats--------------------------------- ')
|
||||
console.log('New wallets : ', TotalNewWalletsLivenet);
|
||||
console.log('Total tx : ', TotalTxLivenet);
|
||||
console.log('Total amount in tx (BTC) : ', TotalAmountLivenet * 1 / 1e8);
|
||||
console.log(' ');
|
||||
console.log('Testnet stats--------------------------------- ')
|
||||
console.log('New wallets : ', TotalNewWalletsTestnet);
|
||||
console.log('Total tx : ', TotalTxTestnet);
|
||||
console.log('Total amount in tx (BTC) : ', TotalAmountTestnet * 1 / 1e8);
|
||||
bwsStats.TotalTxps = function(data) {
|
||||
if (!data) return;
|
||||
var day = moment(data.createdOn * 1000).format('YYYYMMDD');
|
||||
var network = wallets[data.walletId];
|
||||
if (!stats[network][day]) {
|
||||
stats[network][day] = {
|
||||
totalTx: 0,
|
||||
totalAmount: 0,
|
||||
totalNewWallets: 0
|
||||
};
|
||||
}
|
||||
stats[network][day].totalTx++;
|
||||
stats[network][day].totalAmount += data.amount;
|
||||
};
|
||||
|
||||
var ProcessData = function(DB, cb) {
|
||||
ProccesWallets(DB, function() {
|
||||
ProccesTxs(DB, cb);
|
||||
bwsStats.ProcessData = function(DB, cb) {
|
||||
bwsStats.ProccesWallets(DB, function() {
|
||||
bwsStats.ProccesNewWallets(DB, function() {
|
||||
bwsStats.ProccesTxs(DB, function() {
|
||||
DB.close();
|
||||
cb();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
var ProccesWallets = function(DB, cb) {
|
||||
bwsStats.ProccesWallets = function(DB, cb) {
|
||||
var collection = DB.collection('wallets');
|
||||
|
||||
collection.find({}).toArray(function(err, items) {
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
TotalNewWalletForToday(items[i]);
|
||||
};
|
||||
cb();
|
||||
});
|
||||
};
|
||||
|
||||
var ProccesTxs = function(DB, cb) {
|
||||
var collection = DB.collection('txs');
|
||||
|
||||
collection.find({}).toArray(function(err, items) {
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
TotalTxpForToday(items[i]);
|
||||
};
|
||||
cb();
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
var url = 'mongodb://localhost:27017/bws';
|
||||
mongodb.MongoClient.connect(url, function(err, db) {
|
||||
if (err) {
|
||||
console.log('Unable to connect to the mongoDB server. Error:', err);
|
||||
process.exit(code = 1);
|
||||
}
|
||||
console.log('Connection established to ', url);
|
||||
ProcessData(db, function(err) {
|
||||
if (err) {
|
||||
console.log('error ', err);
|
||||
process.exit(code = 1);
|
||||
console.log('Error.', err);
|
||||
return cb(err);
|
||||
}
|
||||
PrintStats();
|
||||
db.close();
|
||||
process.exit(code = 0);
|
||||
|
||||
items.forEach(function(it) {
|
||||
bwsStats.AddingWalletToCache(it);
|
||||
});
|
||||
cb();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
bwsStats.ProccesNewWallets = function(DB, cb) {
|
||||
var collection = DB.collection('wallets');
|
||||
var start = Math.floor(startDate.startOf('day').valueOf() / 1000);
|
||||
var end = Math.floor(endDate.endOf('day').valueOf() / 1000);
|
||||
|
||||
collection.find({
|
||||
createdOn: {
|
||||
$gt: start,
|
||||
$lt: end
|
||||
}
|
||||
}).toArray(function(err, items) {
|
||||
if (err) {
|
||||
console.log('Error.', err);
|
||||
return cb(err);
|
||||
}
|
||||
items.forEach(function(it) {
|
||||
bwsStats.TotalNewWallets(it);
|
||||
});
|
||||
cb();
|
||||
});
|
||||
};
|
||||
|
||||
bwsStats.ProccesTxs = function(DB, cb) {
|
||||
var collection = DB.collection('txs');
|
||||
var start = Math.floor(startDate.startOf('day').valueOf() / 1000);
|
||||
var end = Math.floor(endDate.endOf('day').valueOf() / 1000);
|
||||
|
||||
collection.find({
|
||||
createdOn: {
|
||||
$gt: start,
|
||||
$lt: end
|
||||
}
|
||||
}).toArray(
|
||||
function(err, items) {
|
||||
if (err) {
|
||||
console.log('Error.', err);
|
||||
return cb(err);
|
||||
} else {
|
||||
items.forEach(function(it) {
|
||||
bwsStats.TotalTxps(it);
|
||||
});
|
||||
}
|
||||
cb();
|
||||
});
|
||||
};
|
||||
|
||||
bwsStats.getStats = function(opts, cb) {
|
||||
if (opts) {
|
||||
startDate = moment(opts.from);
|
||||
endDate = moment(opts.to);
|
||||
}
|
||||
bwsStats.cleanUp();
|
||||
|
||||
mongodb.MongoClient.connect(url, function(err, db) {
|
||||
if (err) {
|
||||
console.log('Unable to connect to the mongoDB server. Error:', err);
|
||||
return cb(err, null);
|
||||
}
|
||||
console.log('Connection established to ', url);
|
||||
bwsStats.ProcessData(db, function(err) {
|
||||
if (err) {
|
||||
console.log('Error.', err);
|
||||
return cb(err, null);
|
||||
}
|
||||
cb(null, stats);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = bwsStats;
|
||||
|
|
Loading…
Reference in New Issue