Introduce telemetry (#2099)

* introduce analytics

* add user survey backend

* add user survey backend

* set answers on survey submit

Co-authored-by: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com>

* change name to personalization

* lint

Co-authored-by: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com>

* N8n 2495 add personalization modal (#2280)

* update modals

* add onboarding modal

* implement questions

* introduce analytics

* simplify impl

* implement survey handling

* add personalized cateogry

* update modal behavior

* add thank you view

* handle empty cases

* rename modal

* standarize modal names

* update image, add tags to headings

* remove unused file

* remove unused interfaces

* clean up footer spacing

* introduce analytics

* refactor to fix bug

* update endpoint

* set min height

* update stories

* update naming from questions to survey

* remove spacing after core categories

* fix bug in logic

* sort nodes

* rename types

* merge with be

* rename userSurvey

* clean up rest api

* use constants for keys

* use survey keys

* clean up types

* move personalization to its own file

Co-authored-by: ahsan-virani <ahsan.virani@gmail.com>

* Survey new options (#2300)

* split up options

* fix quotes

* remove unused import

* add user created workflow event (#2301)

* simplify env vars

* fix versionCli on FE

* update personalization env

* fix event User opened Credentials panel

* fix select modal spacing

* fix nodes panel event

* fix workflow id in workflow execute event

* improve telemetry error logging

* fix config and stop process events

* add flush call on n8n stop

* ready for release

* improve telemetry process exit

* fix merge

* improve n8n stop events

Co-authored-by: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com>
Co-authored-by: Mutasem <mutdmour@gmail.com>
Co-authored-by: Jan Oberhauser <jan.oberhauser@gmail.com>
This commit is contained in:
Ahsan Virani
2021-10-19 05:57:49 +02:00
committed by GitHub
parent 4b857b19ac
commit 421dd72224
100 changed files with 2223 additions and 550 deletions

View File

@@ -2,7 +2,6 @@
<div id="side-menu">
<about :dialogVisible="aboutDialogVisible" @closeDialog="closeAboutDialog"></about>
<executions-list :dialogVisible="executionsListDialogVisible" @closeDialog="closeExecutionsListOpenDialog"></executions-list>
<credentials-list :dialogVisible="credentialOpenDialogVisible" @closeDialog="closeCredentialOpenDialog"></credentials-list>
<input type="file" ref="importFile" style="display: none" v-on:change="handleFileImport()">
<div class="side-menu-wrapper" :class="{expanded: !isCollapsed}">
@@ -113,7 +112,7 @@
<span slot="title" class="item-title-root">Help</span>
</template>
<MenuItemsIterator :items="helpMenuItems" />
<MenuItemsIterator :items="helpMenuItems" :afterItemClick="trackHelpItemClick" />
<n8n-menu-item index="help-about">
<template slot="title">
@@ -151,7 +150,6 @@ import {
} from '../Interface';
import About from '@/components/About.vue';
import CredentialsList from '@/components/CredentialsList.vue';
import ExecutionsList from '@/components/ExecutionsList.vue';
import GiftNotificationIcon from './GiftNotificationIcon.vue';
import WorkflowSettings from '@/components/WorkflowSettings.vue';
@@ -168,6 +166,7 @@ import { saveAs } from 'file-saver';
import mixins from 'vue-typed-mixins';
import { mapGetters } from 'vuex';
import MenuItemsIterator from './MainSidebarMenuItemsIterator.vue';
import { CREDENTIAL_LIST_MODAL_KEY, CREDENTIAL_SELECT_MODAL_KEY, DUPLICATE_MODAL_KEY, TAGS_MANAGER_MODAL_KEY, VERSIONS_MODAL_KEY, WORKFLOW_SETTINGS_MODAL_KEY, WORKFLOW_OPEN_MODAL_KEY } from '@/constants';
const helpMenuItems: IMenuItem[] = [
{
@@ -214,7 +213,6 @@ export default mixins(
name: 'MainHeader',
components: {
About,
CredentialsList,
ExecutionsList,
GiftNotificationIcon,
WorkflowSettings,
@@ -225,7 +223,6 @@ export default mixins(
aboutDialogVisible: false,
// @ts-ignore
basePath: this.$store.getters.getBaseUrl,
credentialOpenDialogVisible: false,
executionsListDialogVisible: false,
stopExecutionInProgress: false,
helpMenuItems,
@@ -293,6 +290,9 @@ export default mixins(
},
},
methods: {
trackHelpItemClick (itemType: string) {
this.$telemetry.track('User clicked help resource', { type: itemType, workflow_id: this.$store.getters.workflowId });
},
toggleCollapse () {
this.$store.commit('ui/toggleSidebarMenuCollapse');
},
@@ -306,14 +306,11 @@ export default mixins(
closeExecutionsListOpenDialog () {
this.executionsListDialogVisible = false;
},
closeCredentialOpenDialog () {
this.credentialOpenDialogVisible = false;
},
openTagManager() {
this.$store.dispatch('ui/openTagsManagerModal');
this.$store.dispatch('ui/openModal', TAGS_MANAGER_MODAL_KEY);
},
openUpdatesPanel() {
this.$store.dispatch('ui/openUpdatesPanel');
this.$store.dispatch('ui/openModal', VERSIONS_MODAL_KEY);
},
async stopExecution () {
const executionId = this.$store.getters.activeExecutionId;
@@ -361,6 +358,7 @@ export default mixins(
return;
}
this.$telemetry.track('User imported workflow', { source: 'file', workflow_id: this.$store.getters.workflowId });
this.$root.$emit('importWorkflowData', { data: worflowData });
};
@@ -371,7 +369,7 @@ export default mixins(
},
async handleSelect (key: string, keyPath: string) {
if (key === 'workflow-open') {
this.$store.dispatch('ui/openWorklfowOpenModal');
this.$store.dispatch('ui/openModal', WORKFLOW_OPEN_MODAL_KEY);
} else if (key === 'workflow-import-file') {
(this.$refs.importFile as HTMLInputElement).click();
} else if (key === 'workflow-import-url') {
@@ -423,15 +421,18 @@ export default mixins(
workflowName = workflowName.replace(/[^a-z0-9]/gi, '_');
this.$telemetry.track('User exported workflow', { workflow_id: workflowData.id });
saveAs(blob, workflowName + '.json');
} else if (key === 'workflow-save') {
this.saveCurrentWorkflow();
this.saveCurrentWorkflow(undefined);
} else if (key === 'workflow-duplicate') {
this.$store.dispatch('ui/openDuplicateModal');
this.$store.dispatch('ui/openModal', DUPLICATE_MODAL_KEY);
} else if (key === 'help-about') {
this.aboutDialogVisible = true;
this.trackHelpItemClick('about');
} else if (key === 'workflow-settings') {
this.$store.dispatch('ui/openWorkflowSettingsModal');
this.$store.dispatch('ui/openModal', WORKFLOW_SETTINGS_MODAL_KEY);
} else if (key === 'workflow-new') {
const result = this.$store.getters.getStateIsDirty;
if(result) {
@@ -463,9 +464,9 @@ export default mixins(
}
this.$titleReset();
} else if (key === 'credentials-open') {
this.credentialOpenDialogVisible = true;
this.$store.dispatch('ui/openModal', CREDENTIAL_LIST_MODAL_KEY);
} else if (key === 'credentials-new') {
this.$store.dispatch('ui/openCredentialsSelectModal');
this.$store.dispatch('ui/openModal', CREDENTIAL_SELECT_MODAL_KEY);
} else if (key === 'execution-open-workflow') {
if (this.workflowExecution !== null) {
this.openWorkflow(this.workflowExecution.workflowId as string);