Browse Source

Merge pull request #205 from matiaspando/feat/stats2

Adding statistics to BWS
activeAddress
Matias Alejo Garcia 10 years ago
parent
commit
488e33e0e2
  1. 13
      lib/expressapp.js
  2. 209
      lib/stats.js

13
lib/expressapp.js

@ -9,6 +9,7 @@ var querystring = require('querystring');
var bodyParser = require('body-parser') var bodyParser = require('body-parser')
var WalletService = require('./server'); var WalletService = require('./server');
var stats = require('./stats');
log.disableColor(); log.disableColor();
log.debug = log.verbose; 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); this.app.use(opts.basePath || '/bws/api', router);
WalletService.initialize(opts, cb); WalletService.initialize(opts, cb);
}; };
module.exports = ExpressApp; module.exports = ExpressApp;

209
lib/stats.js

@ -1,133 +1,158 @@
#!/usr/bin/env node #!/usr/bin/env node
'use strict';
var _ = require('lodash');
var mongodb = require('mongodb'); var mongodb = require('mongodb');
var moment = require('moment'); var moment = require('moment');
var async = require('async'); 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 Today = otherDate || moment(); var c = config.storageOpts.mongoDb;
var TotalTxLivenet = 0; var url = 'mongodb://' + (c.host || 'localhost') + ':' + (c.port ||  27017) + '/bws';
var TotalAmountLivenet = 0;
var TotalNewWalletsLivenet = 0;
var TotalTxTestnet = 0; var startDate = moment();
var TotalAmountTestnet = 0; var endDate = moment();
var TotalNewWalletsTestnet = 0;
var stats = {};
var wallets = {}; 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 (!data) return;
wallets[data.id] = data.network;
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]);
}
}; };
var TotalNewWalletForToday = function(data) { bwsStats.TotalNewWallets = function(data) {
if (!data) return; if (!data) return;
var day = moment(data.createdOn * 1000).format('YYYYMMDD');
if (!wallets[data.id]) { if (!stats[data.network][day]) {
wallets[data.id] = data.network; stats[data.network][day] = {
} totalTx: 0,
if (!IsToday(data.createdOn)) return; totalAmount: 0,
totalNewWallets: 0
if (data.network == 'livenet') { };
TotalNewWalletsLivenet++;
} else if (data.network == 'testnet') {
TotalNewWalletsTestnet++;
} else {
console.log('Invalid data ', data);
console.log('Invalid network ', data.network);
} }
stats[data.network][day].totalNewWallets++;
}; };
var PrintStats = function() { bwsStats.TotalTxps = function(data) {
console.log('Stats for date : ', Today.format("YYYY-MM-DD")); if (!data) return;
console.log(' '); var day = moment(data.createdOn * 1000).format('YYYYMMDD');
console.log('Livenet stats--------------------------------- ') var network = wallets[data.walletId];
console.log('New wallets : ', TotalNewWalletsLivenet); if (!stats[network][day]) {
console.log('Total tx : ', TotalTxLivenet); stats[network][day] = {
console.log('Total amount in tx (BTC) : ', TotalAmountLivenet * 1 / 1e8); totalTx: 0,
console.log(' '); totalAmount: 0,
console.log('Testnet stats--------------------------------- ') totalNewWallets: 0
console.log('New wallets : ', TotalNewWalletsTestnet); };
console.log('Total tx : ', TotalTxTestnet); }
console.log('Total amount in tx (BTC) : ', TotalAmountTestnet * 1 / 1e8); stats[network][day].totalTx++;
stats[network][day].totalAmount += data.amount;
}; };
var ProcessData = function(DB, cb) { bwsStats.ProcessData = function(DB, cb) {
ProccesWallets(DB, function() { bwsStats.ProccesWallets(DB, function() {
ProccesTxs(DB, cb); 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'); var collection = DB.collection('wallets');
collection.find({}).toArray(function(err, items) { collection.find({}).toArray(function(err, items) {
for (var i = 0; i < items.length; i++) { if (err) {
TotalNewWalletForToday(items[i]); console.log('Error.', err);
}; return cb(err);
}
items.forEach(function(it) {
bwsStats.AddingWalletToCache(it);
});
cb(); cb();
}); });
}; };
var ProccesTxs = function(DB, cb) { bwsStats.ProccesNewWallets = function(DB, cb) {
var collection = DB.collection('txs'); 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({}).toArray(function(err, items) { collection.find({
for (var i = 0; i < items.length; i++) { createdOn: {
TotalTxpForToday(items[i]); $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(); 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();
});
};
var url = 'mongodb://localhost:27017/bws'; bwsStats.getStats = function(opts, cb) {
mongodb.MongoClient.connect(url, function(err, db) { if (opts) {
if (err) { startDate = moment(opts.from);
console.log('Unable to connect to the mongoDB server. Error:', err); endDate = moment(opts.to);
process.exit(code = 1);
} }
console.log('Connection established to ', url); bwsStats.cleanUp();
ProcessData(db, function(err) {
mongodb.MongoClient.connect(url, function(err, db) {
if (err) { if (err) {
console.log('error ', err); console.log('Unable to connect to the mongoDB server. Error:', err);
process.exit(code = 1); return cb(err, null);
} }
PrintStats(); console.log('Connection established to ', url);
db.close(); bwsStats.ProcessData(db, function(err) {
process.exit(code = 0); if (err) {
console.log('Error.', err);
return cb(err, null);
}
cb(null, stats);
});
}); });
}); };
module.exports = bwsStats;

Loading…
Cancel
Save