From 011c42bde3551dbded542776c1ff5bcf2298fc49 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 12 Dec 2014 16:15:13 -0500 Subject: [PATCH] updated analytics accumulate pageviews, uniquevisitors and uniqueIps locally and update db every 10 mins instead of on every page view --- src/analytics.js | 63 ++++++++++++++++++++++++++++++++++++ src/middleware/middleware.js | 26 ++------------- src/routes/index.js | 2 +- 3 files changed, 67 insertions(+), 24 deletions(-) create mode 100644 src/analytics.js diff --git a/src/analytics.js b/src/analytics.js new file mode 100644 index 0000000000..fd9031d9a7 --- /dev/null +++ b/src/analytics.js @@ -0,0 +1,63 @@ +'use strict'; + +var cronJob = require('cron').CronJob, + db = require('./database'); + + +(function(Analytics) { + + var pageViews = 0; + var uniqueIPCount = 0; + var uniquevisitors = 0; + + new cronJob('*/10 * * * *', function() { + Analytics.writeData(); + }, null, true); + + Analytics.pageView = function(ip) { + ++pageViews; + + if (ip) { + db.sortedSetScore('ip:recent', ip, function(err, score) { + if (err) { + return; + } + if (!score) { + ++uniqueIPCount; + } + var today = new Date(); + today.setHours(today.getHours(), 0, 0, 0); + if (!score || score < today.getTime()) { + ++uniquevisitors; + db.sortedSetAdd('ip:recent', Date.now(), ip); + } + }); + } + }; + + Analytics.writeData = function() { + + var today; + if (pageViews > 0 || uniquevisitors > 0) { + today = new Date(); + today.setHours(today.getHours(), 0, 0, 0); + } + + if (pageViews > 0) { + db.sortedSetIncrBy('analytics:pageviews', pageViews, today.getTime()); + pageViews = 0; + } + + if (uniquevisitors > 0) { + db.sortedSetIncrBy('analytics:uniquevisitors', uniquevisitors, today.getTime()); + uniquevisitors = 0; + } + + if (uniqueIPCount > 0) { + db.incrObjectFieldBy('global', 'uniqueIPCount', uniqueIPCount); + uniqueIPCount = 0; + } + }; + + +}(exports)); \ No newline at end of file diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 9e08774f25..fa0a9c5715 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -20,6 +20,7 @@ var app, topics = require('./../topics'), messaging = require('../messaging'), ensureLoggedIn = require('connect-ensure-login'), + analytics = require('../analytics'), controllers = { api: require('./../controllers/api'), @@ -38,35 +39,14 @@ middleware.applyCSRF = csrf(); middleware.ensureLoggedIn = ensureLoggedIn.ensureLoggedIn(nconf.get('relative_path') + '/login'); -middleware.updateLastOnlineTime = function(req, res, next) { +middleware.pageView = function(req, res, next) { if (req.user) { user.updateLastOnlineTime(req.user.uid); user.updateOnlineUsers(req.user.uid); } - db.sortedSetScore('ip:recent', req.ip, function(err, score) { - if (err) { - return; - } - var today = new Date(); - today.setHours(today.getHours(), 0, 0, 0); - if (!score) { - db.incrObjectField('global', 'uniqueIPCount'); - } - if (!score || score < today.getTime()) { - db.sortedSetIncrBy('analytics:uniquevisitors', 1, today.getTime()); - db.sortedSetAdd('ip:recent', Date.now(), req.ip || 'Unknown'); - } - }); - - next(); -}; - -middleware.incrementPageViews = function(req, res, next) { - var today = new Date(); - today.setHours(today.getHours(), 0, 0, 0); + analytics.pageView(req.ip); - db.sortedSetIncrBy('analytics:pageviews', 1, today.getTime()); next(); }; diff --git a/src/routes/index.js b/src/routes/index.js index 1c1844dfce..435b0baff6 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -96,7 +96,7 @@ function groupRoutes(app, middleware, controllers) { } function setupPageRoute(router, name, middleware, middlewares, controller) { - middlewares = middlewares.concat([middleware.incrementPageViews, middleware.updateLastOnlineTime]); + middlewares = middlewares.concat([middleware.pageView]); router.get(name, middleware.buildHeader, middlewares, controller); router.get('/api' + name, middlewares, controller);