UNPKG

n8n

Version:

n8n Workflow Automation Tool

725 lines 35.3 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.TelemetryEventRelay = void 0; const config_1 = require("@n8n/config"); const di_1 = require("@n8n/di"); const change_case_1 = require("change-case"); const n8n_core_1 = require("n8n-core"); const n8n_workflow_1 = require("n8n-workflow"); const node_os_1 = __importDefault(require("node:os")); const psl_1 = require("psl"); const config_2 = __importDefault(require("../../config")); const constants_1 = require("../../constants"); const credentials_repository_1 = require("../../databases/repositories/credentials.repository"); const project_relation_repository_1 = require("../../databases/repositories/project-relation.repository"); const shared_workflow_repository_1 = require("../../databases/repositories/shared-workflow.repository"); const workflow_repository_1 = require("../../databases/repositories/workflow.repository"); const event_service_1 = require("../../events/event.service"); const shared_hook_functions_1 = require("../../execution-lifecycle/shared/shared-hook-functions"); const license_1 = require("../../license"); const node_types_1 = require("../../node-types"); const event_relay_1 = require("./event-relay"); const telemetry_1 = require("../../telemetry"); let TelemetryEventRelay = class TelemetryEventRelay extends event_relay_1.EventRelay { constructor(eventService, telemetry, license, globalConfig, instanceSettings, workflowRepository, nodeTypes, sharedWorkflowRepository, projectRelationRepository, credentialsRepository) { super(eventService); this.eventService = eventService; this.telemetry = telemetry; this.license = license; this.globalConfig = globalConfig; this.instanceSettings = instanceSettings; this.workflowRepository = workflowRepository; this.nodeTypes = nodeTypes; this.sharedWorkflowRepository = sharedWorkflowRepository; this.projectRelationRepository = projectRelationRepository; this.credentialsRepository = credentialsRepository; } async init() { if (!this.globalConfig.diagnostics.enabled) return; await this.telemetry.init(); this.setupListeners({ 'team-project-updated': (event) => this.teamProjectUpdated(event), 'team-project-deleted': (event) => this.teamProjectDeleted(event), 'team-project-created': (event) => this.teamProjectCreated(event), 'source-control-settings-updated': (event) => this.sourceControlSettingsUpdated(event), 'source-control-user-started-pull-ui': (event) => this.sourceControlUserStartedPullUi(event), 'source-control-user-finished-pull-ui': (event) => this.sourceControlUserFinishedPullUi(event), 'source-control-user-pulled-api': (event) => this.sourceControlUserPulledApi(event), 'source-control-user-started-push-ui': (event) => this.sourceControlUserStartedPushUi(event), 'source-control-user-finished-push-ui': (event) => this.sourceControlUserFinishedPushUi(event), 'license-renewal-attempted': (event) => this.licenseRenewalAttempted(event), 'license-community-plus-registered': (event) => this.licenseCommunityPlusRegistered(event), 'variable-created': () => this.variableCreated(), 'external-secrets-provider-settings-saved': (event) => this.externalSecretsProviderSettingsSaved(event), 'public-api-invoked': (event) => this.publicApiInvoked(event), 'public-api-key-created': (event) => this.publicApiKeyCreated(event), 'public-api-key-deleted': (event) => this.publicApiKeyDeleted(event), 'community-package-installed': (event) => this.communityPackageInstalled(event), 'community-package-updated': (event) => this.communityPackageUpdated(event), 'community-package-deleted': (event) => this.communityPackageDeleted(event), 'credentials-created': (event) => this.credentialsCreated(event), 'credentials-shared': (event) => this.credentialsShared(event), 'credentials-updated': (event) => this.credentialsUpdated(event), 'credentials-deleted': (event) => this.credentialsDeleted(event), 'ldap-general-sync-finished': (event) => this.ldapGeneralSyncFinished(event), 'ldap-settings-updated': (event) => this.ldapSettingsUpdated(event), 'ldap-login-sync-failed': (event) => this.ldapLoginSyncFailed(event), 'login-failed-due-to-ldap-disabled': (event) => this.loginFailedDueToLdapDisabled(event), 'workflow-created': (event) => this.workflowCreated(event), 'workflow-deleted': (event) => this.workflowDeleted(event), 'workflow-sharing-updated': (event) => this.workflowSharingUpdated(event), 'workflow-saved': async (event) => await this.workflowSaved(event), 'server-started': async () => await this.serverStarted(), 'session-started': (event) => this.sessionStarted(event), 'instance-stopped': () => this.instanceStopped(), 'instance-owner-setup': async (event) => await this.instanceOwnerSetup(event), 'first-production-workflow-succeeded': (event) => this.firstProductionWorkflowSucceeded(event), 'first-workflow-data-loaded': (event) => this.firstWorkflowDataLoaded(event), 'workflow-post-execute': async (event) => await this.workflowPostExecute(event), 'user-changed-role': (event) => this.userChangedRole(event), 'user-retrieved-user': (event) => this.userRetrievedUser(event), 'user-retrieved-all-users': (event) => this.userRetrievedAllUsers(event), 'user-retrieved-execution': (event) => this.userRetrievedExecution(event), 'user-retrieved-all-executions': (event) => this.userRetrievedAllExecutions(event), 'user-retrieved-workflow': (event) => this.userRetrievedWorkflow(event), 'user-retrieved-all-workflows': (event) => this.userRetrievedAllWorkflows(event), 'user-updated': (event) => this.userUpdated(event), 'user-deleted': (event) => this.userDeleted(event), 'user-invited': (event) => this.userInvited(event), 'user-signed-up': (event) => this.userSignedUp(event), 'user-submitted-personalization-survey': (event) => this.userSubmittedPersonalizationSurvey(event), 'email-failed': (event) => this.emailFailed(event), 'user-transactional-email-sent': (event) => this.userTransactionalEmailSent(event), 'user-invite-email-click': (event) => this.userInviteEmailClick(event), 'user-password-reset-email-click': (event) => this.userPasswordResetEmailClick(event), 'user-password-reset-request-click': (event) => this.userPasswordResetRequestClick(event), }); } teamProjectUpdated({ userId, role, members, projectId, }) { this.telemetry.track('Project settings updated', { user_id: userId, role, members: members.map(({ userId: user_id, role }) => ({ user_id, role })), project_id: projectId, }); } teamProjectDeleted({ userId, role, projectId, removalType, targetProjectId, }) { this.telemetry.track('User deleted project', { user_id: userId, role, project_id: projectId, removal_type: removalType, target_project_id: targetProjectId, }); } teamProjectCreated({ userId, role }) { this.telemetry.track('User created project', { user_id: userId, role, }); } sourceControlSettingsUpdated({ branchName, readOnlyInstance, repoType, connected, }) { this.telemetry.track('User updated source control settings', { branch_name: branchName, read_only_instance: readOnlyInstance, repo_type: repoType, connected, }); } sourceControlUserStartedPullUi({ userId, workflowUpdates, workflowConflicts, credConflicts, }) { this.telemetry.track('User started pull via UI', { user_id: userId, workflow_updates: workflowUpdates, workflow_conflicts: workflowConflicts, cred_conflicts: credConflicts, }); } sourceControlUserFinishedPullUi({ userId, workflowUpdates, }) { this.telemetry.track('User finished pull via UI', { user_id: userId, workflow_updates: workflowUpdates, }); } sourceControlUserPulledApi({ workflowUpdates, forced, }) { this.telemetry.track('User pulled via API', { workflow_updates: workflowUpdates, forced, }); } sourceControlUserStartedPushUi({ userId, workflowsEligible, workflowsEligibleWithConflicts, credsEligible, credsEligibleWithConflicts, variablesEligible, }) { this.telemetry.track('User started push via UI', { user_id: userId, workflows_eligible: workflowsEligible, workflows_eligible_with_conflicts: workflowsEligibleWithConflicts, creds_eligible: credsEligible, creds_eligible_with_conflicts: credsEligibleWithConflicts, variables_eligible: variablesEligible, }); } sourceControlUserFinishedPushUi({ userId, workflowsEligible, workflowsPushed, credsPushed, variablesPushed, }) { this.telemetry.track('User finished push via UI', { user_id: userId, workflows_eligible: workflowsEligible, workflows_pushed: workflowsPushed, creds_pushed: credsPushed, variables_pushed: variablesPushed, }); } licenseRenewalAttempted({ success }) { this.telemetry.track('Instance attempted to refresh license', { success, }); } licenseCommunityPlusRegistered({ userId, email, licenseKey, }) { this.telemetry.track('User registered for license community plus', { user_id: userId, email, licenseKey, }); } variableCreated() { this.telemetry.track('User created variable'); } externalSecretsProviderSettingsSaved({ userId, vaultType, isValid, isNew, errorMessage, }) { this.telemetry.track('User updated external secrets settings', { user_id: userId, vault_type: vaultType, is_valid: isValid, is_new: isNew, error_message: errorMessage, }); } publicApiInvoked({ userId, path, method, apiVersion, }) { this.telemetry.track('User invoked API', { user_id: userId, path, method, api_version: apiVersion, }); } publicApiKeyCreated(event) { const { user, publicApi } = event; this.telemetry.track('API key created', { user_id: user.id, public_api: publicApi, }); } publicApiKeyDeleted(event) { const { user, publicApi } = event; this.telemetry.track('API key deleted', { user_id: user.id, public_api: publicApi, }); } communityPackageInstalled({ user, inputString, packageName, success, packageVersion, packageNodeNames, packageAuthor, packageAuthorEmail, failureReason, }) { this.telemetry.track('cnr package install finished', { user_id: user.id, input_string: inputString, package_name: packageName, success, package_version: packageVersion, package_node_names: packageNodeNames, package_author: packageAuthor, package_author_email: packageAuthorEmail, failure_reason: failureReason, }); } communityPackageUpdated({ user, packageName, packageVersionCurrent, packageVersionNew, packageNodeNames, packageAuthor, packageAuthorEmail, }) { this.telemetry.track('cnr package updated', { user_id: user.id, package_name: packageName, package_version_current: packageVersionCurrent, package_version_new: packageVersionNew, package_node_names: packageNodeNames, package_author: packageAuthor, package_author_email: packageAuthorEmail, }); } communityPackageDeleted({ user, packageName, packageVersion, packageNodeNames, packageAuthor, packageAuthorEmail, }) { this.telemetry.track('cnr package deleted', { user_id: user.id, package_name: packageName, package_version: packageVersion, package_node_names: packageNodeNames, package_author: packageAuthor, package_author_email: packageAuthorEmail, }); } credentialsCreated({ user, credentialType, credentialId, projectId, projectType, }) { this.telemetry.track('User created credentials', { user_id: user.id, credential_type: credentialType, credential_id: credentialId, project_id: projectId, project_type: projectType, }); } credentialsShared({ user, credentialType, credentialId, userIdSharer, userIdsShareesAdded, shareesRemoved, }) { this.telemetry.track('User updated cred sharing', { user_id: user.id, credential_type: credentialType, credential_id: credentialId, user_id_sharer: userIdSharer, user_ids_sharees_added: userIdsShareesAdded, sharees_removed: shareesRemoved, }); } credentialsUpdated({ user, credentialId, credentialType, }) { this.telemetry.track('User updated credentials', { user_id: user.id, credential_type: credentialType, credential_id: credentialId, }); } credentialsDeleted({ user, credentialId, credentialType, }) { this.telemetry.track('User deleted credentials', { user_id: user.id, credential_type: credentialType, credential_id: credentialId, }); } ldapGeneralSyncFinished({ type, succeeded, usersSynced, error, }) { this.telemetry.track('Ldap general sync finished', { type, succeeded, users_synced: usersSynced, error, }); } ldapSettingsUpdated({ userId, loginIdAttribute, firstNameAttribute, lastNameAttribute, emailAttribute, ldapIdAttribute, searchPageSize, searchTimeout, synchronizationEnabled, synchronizationInterval, loginLabel, loginEnabled, }) { this.telemetry.track('User updated Ldap settings', { user_id: userId, loginIdAttribute, firstNameAttribute, lastNameAttribute, emailAttribute, ldapIdAttribute, searchPageSize, searchTimeout, synchronizationEnabled, synchronizationInterval, loginLabel, loginEnabled, }); } ldapLoginSyncFailed({ error }) { this.telemetry.track('Ldap login sync failed', { error }); } loginFailedDueToLdapDisabled({ userId, }) { this.telemetry.track('User login failed since ldap disabled', { user_ud: userId }); } workflowCreated({ user, workflow, publicApi, projectId, projectType, }) { const { nodeGraph } = n8n_workflow_1.TelemetryHelpers.generateNodesGraph(workflow, this.nodeTypes); this.telemetry.track('User created workflow', { user_id: user.id, workflow_id: workflow.id, node_graph_string: JSON.stringify(nodeGraph), public_api: publicApi, project_id: projectId, project_type: projectType, }); } workflowDeleted({ user, workflowId, publicApi }) { this.telemetry.track('User deleted workflow', { user_id: user.id, workflow_id: workflowId, public_api: publicApi, }); } workflowSharingUpdated({ workflowId, userIdSharer, userIdList, }) { this.telemetry.track('User updated workflow sharing', { workflow_id: workflowId, user_id_sharer: userIdSharer, user_id_list: userIdList, }); } async workflowSaved({ user, workflow, publicApi }) { const isCloudDeployment = config_2.default.getEnv('deployment.type') === 'cloud'; const { nodeGraph } = n8n_workflow_1.TelemetryHelpers.generateNodesGraph(workflow, this.nodeTypes, { isCloudDeployment, }); let userRole = undefined; const role = await this.sharedWorkflowRepository.findSharingRole(user.id, workflow.id); if (role) { userRole = role === 'workflow:owner' ? 'owner' : 'sharee'; } else { const workflowOwner = await this.sharedWorkflowRepository.getWorkflowOwningProject(workflow.id); if (workflowOwner) { const projectRole = await this.projectRelationRepository.findProjectRole({ userId: user.id, projectId: workflowOwner.id, }); if (projectRole && projectRole !== 'project:personalOwner') { userRole = 'member'; } } } const notesCount = Object.keys(nodeGraph.notes).length; const overlappingCount = Object.values(nodeGraph.notes).filter((note) => note.overlapping).length; this.telemetry.track('User saved workflow', { user_id: user.id, workflow_id: workflow.id, node_graph_string: JSON.stringify(nodeGraph), notes_count_overlapping: overlappingCount, notes_count_non_overlapping: notesCount - overlappingCount, version_cli: constants_1.N8N_VERSION, num_tags: workflow.tags?.length ?? 0, public_api: publicApi, sharing_role: userRole, }); } async workflowPostExecute({ workflow, runData, userId, }) { if (!workflow.id) { return; } const telemetryProperties = { workflow_id: workflow.id, is_manual: false, version_cli: constants_1.N8N_VERSION, success: false, }; if (userId) { telemetryProperties.user_id = userId; } if (runData?.data.resultData.error?.message?.includes('canceled')) { runData.status = 'canceled'; } telemetryProperties.success = !!runData?.finished; const executionStatus = runData ? (0, shared_hook_functions_1.determineFinalExecutionStatus)(runData) : 'unknown'; if (runData !== undefined) { telemetryProperties.execution_mode = runData.mode; telemetryProperties.is_manual = runData.mode === 'manual'; let nodeGraphResult = null; if (!telemetryProperties.success && runData?.data.resultData.error) { if (n8n_workflow_1.TelemetryHelpers.userInInstanceRanOutOfFreeAiCredits(runData)) { this.telemetry.track('User ran out of free AI credits'); } telemetryProperties.error_message = runData?.data.resultData.error.message; let errorNodeName = 'node' in runData?.data.resultData.error ? runData?.data.resultData.error.node?.name : undefined; telemetryProperties.error_node_type = 'node' in runData?.data.resultData.error ? runData?.data.resultData.error.node?.type : undefined; if (runData.data.resultData.lastNodeExecuted) { const lastNode = n8n_workflow_1.TelemetryHelpers.getNodeTypeForName(workflow, runData.data.resultData.lastNodeExecuted); if (lastNode !== undefined) { telemetryProperties.error_node_type = lastNode.type; errorNodeName = lastNode.name; } } if (telemetryProperties.is_manual) { nodeGraphResult = n8n_workflow_1.TelemetryHelpers.generateNodesGraph(workflow, this.nodeTypes, { runData: runData.data.resultData?.runData, }); telemetryProperties.node_graph = nodeGraphResult.nodeGraph; telemetryProperties.node_graph_string = JSON.stringify(nodeGraphResult.nodeGraph); if (errorNodeName) { telemetryProperties.error_node_id = nodeGraphResult.nameIndices[errorNodeName]; } } } if (telemetryProperties.is_manual) { if (!nodeGraphResult) { nodeGraphResult = n8n_workflow_1.TelemetryHelpers.generateNodesGraph(workflow, this.nodeTypes, { runData: runData.data.resultData?.runData, }); } let userRole = undefined; if (userId) { const role = await this.sharedWorkflowRepository.findSharingRole(userId, workflow.id); if (role) { userRole = role === 'workflow:owner' ? 'owner' : 'sharee'; } } const manualExecEventProperties = { user_id: userId, workflow_id: workflow.id, status: executionStatus, executionStatus: runData?.status ?? 'unknown', error_message: telemetryProperties.error_message, error_node_type: telemetryProperties.error_node_type, node_graph_string: telemetryProperties.node_graph_string, error_node_id: telemetryProperties.error_node_id, webhook_domain: null, sharing_role: userRole, credential_type: null, is_managed: false, ...n8n_workflow_1.TelemetryHelpers.resolveAIMetrics(workflow.nodes, this.nodeTypes), }; if (!manualExecEventProperties.node_graph_string) { nodeGraphResult = n8n_workflow_1.TelemetryHelpers.generateNodesGraph(workflow, this.nodeTypes, { runData: runData.data.resultData?.runData, }); manualExecEventProperties.node_graph_string = JSON.stringify(nodeGraphResult.nodeGraph); } if (runData.data.startData?.destinationNode) { const credentialsData = n8n_workflow_1.TelemetryHelpers.extractLastExecutedNodeCredentialData(runData); if (credentialsData) { manualExecEventProperties.credential_type = credentialsData.credentialType; const credential = await this.credentialsRepository.findOneBy({ id: credentialsData.credentialId, }); if (credential) { manualExecEventProperties.is_managed = credential.isManaged; } } const telemetryPayload = { ...manualExecEventProperties, node_type: n8n_workflow_1.TelemetryHelpers.getNodeTypeForName(workflow, runData.data.startData?.destinationNode)?.type, node_id: nodeGraphResult.nameIndices[runData.data.startData?.destinationNode], }; this.telemetry.track('Manual node exec finished', telemetryPayload); } else { nodeGraphResult.webhookNodeNames.forEach((name) => { const execJson = runData.data.resultData.runData[name]?.[0]?.data?.main?.[0]?.[0] ?.json; if (execJson?.headers?.origin && execJson.headers.origin !== '') { manualExecEventProperties.webhook_domain = (0, psl_1.get)(execJson.headers.origin.replace(/^https?:\/\//, '')); } }); this.telemetry.track('Manual workflow exec finished', manualExecEventProperties); } } } this.telemetry.trackWorkflowExecution(telemetryProperties); } async serverStarted() { const cpus = node_os_1.default.cpus(); const binaryDataConfig = config_2.default.getEnv('binaryDataManager'); const isS3Selected = config_2.default.getEnv('binaryDataManager.mode') === 's3'; const isS3Available = config_2.default.getEnv('binaryDataManager.availableModes').includes('s3'); const isS3Licensed = this.license.isBinaryDataS3Licensed(); const authenticationMethod = config_2.default.getEnv('userManagement.authenticationMethod'); const info = { version_cli: constants_1.N8N_VERSION, db_type: this.globalConfig.database.type, n8n_version_notifications_enabled: this.globalConfig.versionNotifications.enabled, n8n_disable_production_main_process: this.globalConfig.endpoints.disableProductionWebhooksOnMainProcess, system_info: { os: { type: node_os_1.default.type(), version: node_os_1.default.version(), }, memory: node_os_1.default.totalmem() / 1024, cpus: { count: cpus.length, model: cpus[0].model, speed: cpus[0].speed, }, is_docker: this.instanceSettings.isDocker, }, execution_variables: { executions_mode: config_2.default.getEnv('executions.mode'), executions_timeout: config_2.default.getEnv('executions.timeout'), executions_timeout_max: config_2.default.getEnv('executions.maxTimeout'), executions_data_save_on_error: config_2.default.getEnv('executions.saveDataOnError'), executions_data_save_on_success: config_2.default.getEnv('executions.saveDataOnSuccess'), executions_data_save_on_progress: config_2.default.getEnv('executions.saveExecutionProgress'), executions_data_save_manual_executions: config_2.default.getEnv('executions.saveDataManualExecutions'), executions_data_prune: this.globalConfig.executions.pruneData, executions_data_max_age: this.globalConfig.executions.pruneDataMaxAge, }, n8n_deployment_type: config_2.default.getEnv('deployment.type'), n8n_binary_data_mode: binaryDataConfig.mode, smtp_set_up: this.globalConfig.userManagement.emails.mode === 'smtp', ldap_allowed: authenticationMethod === 'ldap', saml_enabled: authenticationMethod === 'saml', license_plan_name: this.license.getPlanName(), license_tenant_id: this.globalConfig.license.tenantId, binary_data_s3: isS3Available && isS3Selected && isS3Licensed, multi_main_setup_enabled: this.globalConfig.multiMainSetup.enabled, metrics: { metrics_enabled: this.globalConfig.endpoints.metrics.enable, metrics_category_default: this.globalConfig.endpoints.metrics.includeDefaultMetrics, metrics_category_routes: this.globalConfig.endpoints.metrics.includeApiEndpoints, metrics_category_cache: this.globalConfig.endpoints.metrics.includeCacheMetrics, metrics_category_logs: this.globalConfig.endpoints.metrics.includeMessageEventBusMetrics, metrics_category_queue: this.globalConfig.endpoints.metrics.includeQueueMetrics, }, }; const firstWorkflow = await this.workflowRepository.findOne({ select: ['createdAt'], order: { createdAt: 'ASC' }, where: {}, }); this.telemetry.identify(info); this.telemetry.track('Instance started', { ...info, earliest_workflow_created: firstWorkflow?.createdAt, }); } sessionStarted({ pushRef }) { this.telemetry.track('Session started', { session_id: pushRef }); } instanceStopped() { this.telemetry.track('User instance stopped'); } async instanceOwnerSetup({ userId }) { this.telemetry.track('Owner finished instance setup', { user_id: userId }); } firstProductionWorkflowSucceeded({ projectId, workflowId, userId, }) { this.telemetry.track('Workflow first prod success', { project_id: projectId, workflow_id: workflowId, user_id: userId, }); } firstWorkflowDataLoaded({ userId, workflowId, nodeType, nodeId, credentialType, credentialId, }) { this.telemetry.track('Workflow first data fetched', { user_id: userId, workflow_id: workflowId, node_type: nodeType, node_id: nodeId, credential_type: credentialType, credential_id: credentialId, }); } userChangedRole({ userId, targetUserId, targetUserNewRole, publicApi, }) { this.telemetry.track('User changed role', { user_id: userId, target_user_id: targetUserId, target_user_new_role: targetUserNewRole, public_api: publicApi, }); } userRetrievedUser({ userId, publicApi }) { this.telemetry.track('User retrieved user', { user_id: userId, public_api: publicApi, }); } userRetrievedAllUsers({ userId, publicApi }) { this.telemetry.track('User retrieved all users', { user_id: userId, public_api: publicApi, }); } userRetrievedExecution({ userId, publicApi }) { this.telemetry.track('User retrieved execution', { user_id: userId, public_api: publicApi, }); } userRetrievedAllExecutions({ userId, publicApi, }) { this.telemetry.track('User retrieved all executions', { user_id: userId, public_api: publicApi, }); } userRetrievedWorkflow({ userId, publicApi }) { this.telemetry.track('User retrieved workflow', { user_id: userId, public_api: publicApi, }); } userRetrievedAllWorkflows({ userId, publicApi, }) { this.telemetry.track('User retrieved all workflows', { user_id: userId, public_api: publicApi, }); } userUpdated({ user, fieldsChanged }) { this.telemetry.track('User changed personal settings', { user_id: user.id, fields_changed: fieldsChanged, }); } userDeleted({ user, publicApi, targetUserOldStatus, migrationStrategy, targetUserId, migrationUserId, }) { this.telemetry.track('User deleted user', { user_id: user.id, public_api: publicApi, target_user_old_status: targetUserOldStatus, migration_strategy: migrationStrategy, target_user_id: targetUserId, migration_user_id: migrationUserId, }); } userInvited({ user, targetUserId, publicApi, emailSent, inviteeRole, }) { this.telemetry.track('User invited new user', { user_id: user.id, target_user_id: targetUserId, public_api: publicApi, email_sent: emailSent, invitee_role: inviteeRole, }); } userSignedUp({ user, userType, wasDisabledLdapUser }) { this.telemetry.track('User signed up', { user_id: user.id, user_type: userType, was_disabled_ldap_user: wasDisabledLdapUser, }); } userSubmittedPersonalizationSurvey({ userId, answers, }) { const personalizationSurveyData = { user_id: userId }; for (const [camelCaseKey, value] of Object.entries(answers)) { if (value) { personalizationSurveyData[(0, change_case_1.snakeCase)(camelCaseKey)] = value; } } this.telemetry.track('User responded to personalization questions', personalizationSurveyData); } emailFailed({ user, messageType, publicApi }) { this.telemetry.track('Instance failed to send transactional email to user', { user_id: user.id, message_type: messageType, public_api: publicApi, }); } userTransactionalEmailSent({ userId, messageType, publicApi, }) { this.telemetry.track('User sent transactional email', { user_id: userId, message_type: messageType, public_api: publicApi, }); } userInviteEmailClick({ invitee }) { this.telemetry.track('User clicked invite link from email', { user_id: invitee.id, }); } userPasswordResetEmailClick({ user }) { this.telemetry.track('User clicked password reset link from email', { user_id: user.id, }); } userPasswordResetRequestClick({ user, }) { this.telemetry.track('User requested password reset while logged out', { user_id: user.id, }); } }; exports.TelemetryEventRelay = TelemetryEventRelay; exports.TelemetryEventRelay = TelemetryEventRelay = __decorate([ (0, di_1.Service)(), __metadata("design:paramtypes", [event_service_1.EventService, telemetry_1.Telemetry, license_1.License, config_1.GlobalConfig, n8n_core_1.InstanceSettings, workflow_repository_1.WorkflowRepository, node_types_1.NodeTypes, shared_workflow_repository_1.SharedWorkflowRepository, project_relation_repository_1.ProjectRelationRepository, credentials_repository_1.CredentialsRepository]) ], TelemetryEventRelay); //# sourceMappingURL=telemetry.event-relay.js.map