mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-07 14:35:47 +01:00
updated analytics
accumulate pageviews, uniquevisitors and uniqueIps locally and update db every 10 mins instead of on every page view
This commit is contained in:
63
src/analytics.js
Normal file
63
src/analytics.js
Normal file
@@ -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));
|
||||||
@@ -20,6 +20,7 @@ var app,
|
|||||||
topics = require('./../topics'),
|
topics = require('./../topics'),
|
||||||
messaging = require('../messaging'),
|
messaging = require('../messaging'),
|
||||||
ensureLoggedIn = require('connect-ensure-login'),
|
ensureLoggedIn = require('connect-ensure-login'),
|
||||||
|
analytics = require('../analytics'),
|
||||||
|
|
||||||
controllers = {
|
controllers = {
|
||||||
api: require('./../controllers/api'),
|
api: require('./../controllers/api'),
|
||||||
@@ -38,38 +39,17 @@ middleware.applyCSRF = csrf();
|
|||||||
|
|
||||||
middleware.ensureLoggedIn = ensureLoggedIn.ensureLoggedIn(nconf.get('relative_path') + '/login');
|
middleware.ensureLoggedIn = ensureLoggedIn.ensureLoggedIn(nconf.get('relative_path') + '/login');
|
||||||
|
|
||||||
middleware.updateLastOnlineTime = function(req, res, next) {
|
middleware.pageView = function(req, res, next) {
|
||||||
if (req.user) {
|
if (req.user) {
|
||||||
user.updateLastOnlineTime(req.user.uid);
|
user.updateLastOnlineTime(req.user.uid);
|
||||||
user.updateOnlineUsers(req.user.uid);
|
user.updateOnlineUsers(req.user.uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
db.sortedSetScore('ip:recent', req.ip, function(err, score) {
|
analytics.pageView(req.ip);
|
||||||
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();
|
next();
|
||||||
};
|
};
|
||||||
|
|
||||||
middleware.incrementPageViews = function(req, res, next) {
|
|
||||||
var today = new Date();
|
|
||||||
today.setHours(today.getHours(), 0, 0, 0);
|
|
||||||
|
|
||||||
db.sortedSetIncrBy('analytics:pageviews', 1, today.getTime());
|
|
||||||
next();
|
|
||||||
};
|
|
||||||
|
|
||||||
middleware.redirectToAccountIfLoggedIn = function(req, res, next) {
|
middleware.redirectToAccountIfLoggedIn = function(req, res, next) {
|
||||||
if (!req.user) {
|
if (!req.user) {
|
||||||
return next();
|
return next();
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ function groupRoutes(app, middleware, controllers) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setupPageRoute(router, name, middleware, middlewares, controller) {
|
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(name, middleware.buildHeader, middlewares, controller);
|
||||||
router.get('/api' + name, middlewares, controller);
|
router.get('/api' + name, middlewares, controller);
|
||||||
|
|||||||
Reference in New Issue
Block a user