diff --git a/package-lock.json b/package-lock.json index be39ad75f6031..e2dc46a8477e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "n8n", - "version": "0.180.0", + "version": "0.181.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "n8n", - "version": "0.180.0", + "version": "0.181.2", "dependencies": { "@apidevtools/swagger-cli": "4.0.0", "@babel/core": "^7.14.6", diff --git a/packages/cli/src/InternalHooks.ts b/packages/cli/src/InternalHooks.ts index 12d6d009a9dbf..2b55acdc6fb06 100644 --- a/packages/cli/src/InternalHooks.ts +++ b/packages/cli/src/InternalHooks.ts @@ -9,7 +9,7 @@ import { IWorkflowBase, IWorkflowDb, } from '.'; -import { Telemetry } from './telemetry'; +import Telemetry from './telemetry'; export class InternalHooksClass implements IInternalHooksClass { private versionCli: string; diff --git a/packages/cli/src/InternalHooksManager.ts b/packages/cli/src/InternalHooksManager.ts index 617fe1b6a2218..3b4029de6d596 100644 --- a/packages/cli/src/InternalHooksManager.ts +++ b/packages/cli/src/InternalHooksManager.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-cycle */ import { INodeTypes } from 'n8n-workflow'; import { InternalHooksClass } from './InternalHooks'; -import { Telemetry } from './telemetry'; +import Telemetry from './telemetry'; export class InternalHooksManager { private static internalHooksInstance: InternalHooksClass; diff --git a/packages/cli/src/telemetry/index.ts b/packages/cli/src/telemetry/index.ts index fe648e69721e2..c3e8df249e42c 100644 --- a/packages/cli/src/telemetry/index.ts +++ b/packages/cli/src/telemetry/index.ts @@ -35,7 +35,8 @@ interface IExecutionsBuffer { firstExecutions: IFirstExecutions; } -export class Telemetry { +// eslint-disable-next-line import/no-default-export +export default class Telemetry { private client?: TelemetryClient; private instanceId: string; @@ -71,14 +72,26 @@ export class Telemetry { return; } - this.client = new TelemetryClient(key, url, { logLevel }); + this.client = this.createTelemetryClient(key, url, logLevel); - this.pulseIntervalReference = setInterval(async () => { - void this.pulse(); - }, 6 * 60 * 60 * 1000); // every 6 hours + this.startPulse(); } } + private createTelemetryClient( + key: string, + url: string, + logLevel: string, + ): TelemetryClient | undefined { + return new TelemetryClient(key, url, { logLevel }); + } + + private startPulse() { + this.pulseIntervalReference = setInterval(async () => { + void this.pulse(); + }, 6 * 60 * 60 * 1000); // every 6 hours + } + private async pulse(): Promise { if (!this.client) { return Promise.resolve(); @@ -104,6 +117,10 @@ export class Telemetry { return Promise.all(allPromises); } + getTelemetryClient(): unknown { + return this.client; + } + async trackWorkflowExecution(properties: IDataObject): Promise { if (this.client) { const workflowId = properties.workflow_id as string; diff --git a/packages/cli/test/integration/shared/utils.ts b/packages/cli/test/integration/shared/utils.ts index f3d205476f569..d21e1822b5750 100644 --- a/packages/cli/test/integration/shared/utils.ts +++ b/packages/cli/test/integration/shared/utils.ts @@ -45,7 +45,6 @@ import { credentialsController } from '../../../src/api/credentials.api'; import { loadPublicApiVersions } from '../../../src/PublicApi/'; import type { User } from '../../../src/databases/entities/User'; import type { ApiPath, EndpointGroup, PostgresSchemaSection, SmtpTestAccount } from './types'; -import { Telemetry } from '../../../src/telemetry'; import type { N8nApp } from '../../../src/UserManagement/Interfaces'; import { set } from 'lodash'; interface TriggerTime { diff --git a/packages/cli/test/unit/Telemetry.test.ts b/packages/cli/test/unit/Telemetry.test.ts new file mode 100644 index 0000000000000..efab8e1da2153 --- /dev/null +++ b/packages/cli/test/unit/Telemetry.test.ts @@ -0,0 +1,24 @@ +import Telemetry from '../../src/telemetry'; + +describe('Telemetry', () => { + jest.spyOn(Telemetry.prototype as any, 'createTelemetryClient').mockImplementation(() => { + return { + flush: () => {}, + identify: () => {}, + track: () => {}, + }; + }); + + jest.spyOn(Telemetry.prototype as any, 'startPulse').mockImplementation(() => {}); + + const spyTrack = jest.spyOn(Telemetry.prototype, 'track'); + + const telemetry = new Telemetry('Telemetry unit test', '0.0.0'); + + describe('trackN8nStop', () => { + test('should call track method', () => { + telemetry.trackN8nStop(); + expect(spyTrack).toHaveBeenCalledTimes(1); + }); + }); +});