diff --git a/src/meta/errors.js b/src/meta/errors.js index f291c5f7f1..0b7740b4ae 100644 --- a/src/meta/errors.js +++ b/src/meta/errors.js @@ -1,24 +1,55 @@ 'use strict'; +const nconf = require('nconf'); const winston = require('winston'); const validator = require('validator'); const cronJob = require('cron').CronJob; +const { setTimeout } = require('timers/promises') const db = require('../database'); const analytics = require('../analytics'); +const pubsub = require('../pubsub'); +const utils = require('../utils'); const Errors = module.exports; -let counters = {}; +const runJobs = nconf.get('runJobs'); -new cronJob('0 * * * * *', (() => { - Errors.writeData(); -}), null, true); +let counters = {}; +let total = {}; + +Errors.init = async function () { + new cronJob('0 * * * * *', async () => { + publishLocalErrors(); + if (runJobs) { + await setTimeout(2000); + await Errors.writeData(); + } + }, null, true); + + if (runJobs) { + pubsub.on('errors:publish', (data) => { + for (const [key, value] of Object.entries(data.local)) { + if (utils.isNumber(value)) { + total[key] = total[key] || 0; + total[key] += value; + } + } + }); + } +}; + +function publishLocalErrors() { + pubsub.publish('errors:publish', { + local: counters, + }); + counters = {}; +} Errors.writeData = async function () { try { - const _counters = { ...counters }; - counters = {}; + const _counters = { ...total }; + total = {}; const keys = Object.keys(_counters); if (!keys.length) { return; diff --git a/src/webserver.js b/src/webserver.js index 23ed24df68..c27a4e5d4a 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -24,6 +24,7 @@ const helmet = require('helmet'); const Benchpress = require('benchpressjs'); const db = require('./database'); const analytics = require('./analytics'); +const errors = require('./meta/errors'); const file = require('./file'); const emailer = require('./emailer'); const meta = require('./meta'); @@ -114,6 +115,7 @@ async function initializeNodeBB() { await meta.blacklist.load(); await flags.init(); await analytics.init(); + await errors.init(); await topicEvents.init(); if (nconf.get('runJobs')) { await require('./widgets').moveMissingAreasToDrafts();