diff --git a/apps/meteor/app/statistics/server/functions/sendUsageReport.spec.ts b/apps/meteor/app/statistics/server/functions/sendUsageReport.spec.ts index 2e9da97aa733f..f2fd40e80557a 100644 --- a/apps/meteor/app/statistics/server/functions/sendUsageReport.spec.ts +++ b/apps/meteor/app/statistics/server/functions/sendUsageReport.spec.ts @@ -21,6 +21,9 @@ const mocks = { logger: { error: sandbox.stub(), }, + Info: { + version: '3.0.1', + }, }; const { sendUsageReport } = proxyquire.noCallThru().load('./sendUsageReport', { @@ -29,6 +32,7 @@ const { sendUsageReport } = proxyquire.noCallThru().load('./sendUsageReport', { '..': { statistics: mocks.statistics }, '../../../cloud/server': { getWorkspaceAccessToken: mocks.getWorkspaceAccessToken }, 'meteor/meteor': { Meteor: mocks.Meteor }, + '../../../utils/rocketchat.info': { Info: mocks.Info }, }); describe('sendUsageReport', () => { @@ -60,4 +64,42 @@ describe('sendUsageReport', () => { expect(mocks.serverFetch.calledWith('https://collector.rocket.chat/', sinon.match({ method: 'POST' }))).to.be.true; expect(result).to.be.undefined; }); + + it('should generate new statistics when version changes', async () => { + mocks.Statistics.findLast.resolves({ + _id: 'stats-id', + version: '2.9.0', + createdAt: new Date(), + }); + + mocks.statistics.save.resolves({ _id: 'new-stats-id' }); + + const result = await sendUsageReport(mocks.logger); + + expect(mocks.statistics.save.calledOnce).to.be.true; + expect(result).to.be.undefined; + }); + + it('should NOT generate new statistics if last version equals current version', async () => { + mocks.Statistics.findLast.resolves({ + _id: 'stats-id', + version: '3.0.1', + createdAt: new Date(), + statsToken: 'token', + }); + + const result = await sendUsageReport(mocks.logger); + + expect(mocks.statistics.save.called).to.be.false; + expect(result).to.equal('token'); + }); + + it('should generate new statistics when no previous stats exist', async () => { + mocks.Statistics.findLast.resolves(undefined); + mocks.statistics.save.resolves({ _id: 'new-stats-id' }); + + await sendUsageReport(mocks.logger); + + expect(mocks.statistics.save.calledOnce).to.be.true; + }); }); diff --git a/apps/meteor/app/statistics/server/functions/sendUsageReport.ts b/apps/meteor/app/statistics/server/functions/sendUsageReport.ts index a5bc91a639621..048d0f54d9882 100644 --- a/apps/meteor/app/statistics/server/functions/sendUsageReport.ts +++ b/apps/meteor/app/statistics/server/functions/sendUsageReport.ts @@ -8,6 +8,7 @@ import { Meteor } from 'meteor/meteor'; import { statistics } from '..'; import { shouldReportStatistics } from '../../../../server/cron/usageReport'; import { getWorkspaceAccessToken } from '../../../cloud/server'; +import { Info } from '../../../utils/rocketchat.info'; async function sendStats(logger: Logger, cronStatistics: IStats): Promise { try { @@ -41,7 +42,10 @@ export async function sendUsageReport(logger: Logger): Promise { const last = await Statistics.findLast(); - if (last) { + + const currentVersion = Info.version; + + if (last && last.version === currentVersion) { const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); @@ -61,7 +65,7 @@ export async function sendUsageReport(logger: Logger): Promise { - try { - const lastStatistics = await Statistics.findLast(); - - if (!lastStatistics) { - return; - } - - const { mongoVersion, mongoStorageEngine } = await getMongoInfo(); - - const deploymentInfo: Partial = { - os: { - type: os.type(), - platform: os.platform(), - arch: os.arch(), - release: os.release(), - uptime: os.uptime(), - loadavg: os.loadavg(), - totalmem: os.totalmem(), - freemem: os.freemem(), - cpus: os.cpus(), - }, - process: { - nodeVersion: process.version, - pid: process.pid, - uptime: process.uptime(), - }, - deploy: { - method: process.env.DEPLOY_METHOD || 'tar', - platform: process.env.DEPLOY_PLATFORM || 'selfinstall', - }, - msEnabled: isRunningMs(), - mongoVersion, - mongoStorageEngine: mongoStorageEngine || '', - migration: await getControl(), - }; - - if (Info) { - deploymentInfo.version = Info.version; - } - - const { _id, ...baseStatistics } = lastStatistics; - - const newStatistics: Omit = { - ...baseStatistics, - ...deploymentInfo, - createdAt: new Date(), - }; - - await Statistics.insertOne(newStatistics); - } catch (error) { - SystemLogger.error({ msg: 'Error saving statistics with new deployment data', err: error }); - } - }, }; diff --git a/apps/meteor/server/startup/migrations/xrun.ts b/apps/meteor/server/startup/migrations/xrun.ts index fcf6bf8b5137b..0344649f99935 100644 --- a/apps/meteor/server/startup/migrations/xrun.ts +++ b/apps/meteor/server/startup/migrations/xrun.ts @@ -3,7 +3,6 @@ import type { UpdateResult } from 'mongodb'; import { upsertPermissions } from '../../../app/authorization/server/functions/upsertPermissions'; import { settings } from '../../../app/settings/server'; -import { statistics } from '../../../app/statistics/server/lib/statistics'; import { migrateDatabase, onServerVersionChange } from '../../lib/migrations'; import { ensureCloudWorkspaceRegistered } from '../cloudRegistration'; @@ -63,6 +62,5 @@ export const performMigrationProcedure = async (): Promise => { await upsertPermissions(); await ensureCloudWorkspaceRegistered(); await moveRetentionSetting(); - await statistics.updateDeploymentData(); }); };