From 3d22859a4d837f72a9f89954ff8241dedbf7dcc0 Mon Sep 17 00:00:00 2001 From: Patrick Volum Date: Thu, 29 Apr 2021 17:41:13 -0400 Subject: [PATCH 01/13] Adding missing types --- .../CreationFlow/v2/CreateOptions.tsx | 19 +++++++++++++++++-- Composer/packages/types/src/telemetry.ts | 15 ++++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx b/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx index cfe546777d..ce2e004cbc 100644 --- a/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx +++ b/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx @@ -17,10 +17,11 @@ import querystring from 'query-string'; import axios from 'axios'; import { useRecoilValue } from 'recoil'; -import { DialogCreationCopy } from '../../../constants'; +import { CreationFlowStatus, DialogCreationCopy } from '../../../constants'; import { getAliasFromPayload, isElectron } from '../../../utils/electronUtil'; -import { userHasNodeInstalledState } from '../../../recoilModel'; +import { creationFlowTypeState, userHasNodeInstalledState } from '../../../recoilModel'; import { InstallDepModal } from '../../InstallDepModal'; +import TelemetryClient from '../../../telemetry/TelemetryClient'; import { CreateBotV2 } from './CreateBot'; @@ -40,6 +41,16 @@ export function CreateOptionsV2(props: CreateOptionsProps) { const { templates, onDismiss, onNext, onJumpToOpenModal, fetchReadMe } = props; const [showNodeModal, setShowNodeModal] = useState(false); const userHasNode = useRecoilValue(userHasNodeInstalledState); + const creationFlowType = useRecoilValue(creationFlowTypeState); + + useEffect(() => { + if (!props.location?.search) { + TelemetryClient.track('NewBotDialogOpened', { + isSkillBot: creationFlowType === 'Skill', + fromAbsHandoff: false, + }); + } + }, []); useEffect(() => { // open bot directly if alias exist. @@ -58,6 +69,10 @@ export function CreateOptionsV2(props: CreateOptionsProps) { } }) .catch((e) => { + TelemetryClient.track('NewBotDialogOpened', { + isSkillBot: false, + fromAbsHandoff: true, + }); setIsOpenOptionsModal(true); }); }); diff --git a/Composer/packages/types/src/telemetry.ts b/Composer/packages/types/src/telemetry.ts index dfd80da5a7..29756ed8bd 100644 --- a/Composer/packages/types/src/telemetry.ts +++ b/Composer/packages/types/src/telemetry.ts @@ -133,6 +133,17 @@ type PublishingEvents = { ProvisionAddResourcesCancel: undefined; }; +type CreationEvents = { + NewBotDialogOpened: { fromAbsHandoff: boolean; isSkillBot: boolean }; + CreationCancelBtnClicked: undefined; + NeedAnotherTemplateCLicked: undefined; +}; + +type RocketPanelEvents = { + LearningLinkClicked: { linkName: string }; + NextStepClicked: { title: string }; +}; + type AppSettingsEvents = { FeatureFlagChanged: { featureFlag: string; enabled: boolean }; }; @@ -237,7 +248,9 @@ export type TelemetryEvents = ApplicationEvents & WebChatEvents & LuEditorEvents & OrchestratorEvents & - PropertyEditorEvents; + PropertyEditorEvents & + CreationEvents & + RocketPanelEvents; export type TelemetryEventName = keyof TelemetryEvents; From 819ce1ea11c19ee772762945ad176dce01e10026 Mon Sep 17 00:00:00 2001 From: Patrick Volum Date: Thu, 29 Apr 2021 17:45:43 -0400 Subject: [PATCH 02/13] Simplifying createModal telem --- .../components/CreationFlow/v2/CreateOptions.tsx | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx b/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx index ce2e004cbc..aba0899acb 100644 --- a/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx +++ b/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx @@ -43,15 +43,6 @@ export function CreateOptionsV2(props: CreateOptionsProps) { const userHasNode = useRecoilValue(userHasNodeInstalledState); const creationFlowType = useRecoilValue(creationFlowTypeState); - useEffect(() => { - if (!props.location?.search) { - TelemetryClient.track('NewBotDialogOpened', { - isSkillBot: creationFlowType === 'Skill', - fromAbsHandoff: false, - }); - } - }, []); - useEffect(() => { // open bot directly if alias exist. if (props.location?.search) { @@ -80,6 +71,10 @@ export function CreateOptionsV2(props: CreateOptionsProps) { return; } } + TelemetryClient.track('NewBotDialogOpened', { + isSkillBot: creationFlowType === 'Skill', + fromAbsHandoff: false, + }); setIsOpenCreateModal(true); }, [props.location?.search]); const dialogWrapperProps = DialogCreationCopy.CREATE_OPTIONS; From 9a72f10b74bea7e7a88d62c9d0a5ca4a56ee0c5a Mon Sep 17 00:00:00 2001 From: Patrick Volum Date: Thu, 29 Apr 2021 17:58:34 -0400 Subject: [PATCH 03/13] convert formatMessage variable to function --- .../client/src/components/CreationFlow/v2/CreateOptions.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx b/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx index aba0899acb..3ae310ee41 100644 --- a/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx +++ b/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx @@ -99,7 +99,7 @@ export function CreateOptionsV2(props: CreateOptionsProps) { }, }; - const options: IChoiceGroupOption[] = [ + const getOptions = (): IChoiceGroupOption[] => [ { key: 'Create', text: formatMessage('Create a new bot') }, { key: 'Connect', text: formatMessage('Connect to an existing bot') }, ]; From 5a231c7f6f6258bbb0a4639164be0b95b7d1db69 Mon Sep 17 00:00:00 2001 From: Patrick Volum Date: Thu, 29 Apr 2021 18:00:35 -0400 Subject: [PATCH 04/13] Adding creation cancelled telemetry --- .../components/CreationFlow/v2/CreateOptions.tsx | 2 +- .../components/CreationFlow/v2/CreationFlow.tsx | 15 ++++++++++++--- Composer/packages/types/src/telemetry.ts | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx b/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx index 3ae310ee41..b582c7b210 100644 --- a/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx +++ b/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx @@ -131,7 +131,7 @@ export function CreateOptionsV2(props: CreateOptionsProps) { dialogType={DialogTypes.Customer} onDismiss={onDismiss} > - + diff --git a/Composer/packages/client/src/components/CreationFlow/v2/CreationFlow.tsx b/Composer/packages/client/src/components/CreationFlow/v2/CreationFlow.tsx index b4f6197c15..93d20d6a32 100644 --- a/Composer/packages/client/src/components/CreationFlow/v2/CreationFlow.tsx +++ b/Composer/packages/client/src/components/CreationFlow/v2/CreationFlow.tsx @@ -181,7 +181,10 @@ const CreationFlowV2: React.FC = () => { path="create/:runtimeLanguage/:templateId" updateFolder={updateFolder} onCurrentPathUpdate={updateCurrentPath} - onDismiss={handleDismiss} + onDismiss={() => { + TelemetryClient.track('CreationCancelled'); + handleDismiss(); + }} onSubmit={handleSubmit} /> = () => { path="create/:templateId" updateFolder={updateFolder} onCurrentPathUpdate={updateCurrentPath} - onDismiss={handleDismiss} + onDismiss={() => { + TelemetryClient.track('CreationCancelled'); + handleDismiss(); + }} onSubmit={handleSubmit} /> { + TelemetryClient.track('CreationCancelled'); + handleDismiss(); + }} onJumpToOpenModal={handleJumpToOpenModal} onNext={handleCreateNext} /> diff --git a/Composer/packages/types/src/telemetry.ts b/Composer/packages/types/src/telemetry.ts index 29756ed8bd..b7b3ea59b6 100644 --- a/Composer/packages/types/src/telemetry.ts +++ b/Composer/packages/types/src/telemetry.ts @@ -135,7 +135,7 @@ type PublishingEvents = { type CreationEvents = { NewBotDialogOpened: { fromAbsHandoff: boolean; isSkillBot: boolean }; - CreationCancelBtnClicked: undefined; + CreationCancelled: undefined; NeedAnotherTemplateCLicked: undefined; }; From a9e39cb22e99813e2fea845c72853d6be7f77ba6 Mon Sep 17 00:00:00 2001 From: Patrick Volum Date: Thu, 29 Apr 2021 18:34:19 -0400 Subject: [PATCH 05/13] telemetry for provision profile creation failure --- .../components/CreationFlow/v2/DefineConversation.tsx | 11 ++++++++++- .../create-publish-profile/PublishProfileDialog.tsx | 8 +++++--- .../client/src/recoilModel/dispatchers/provision.ts | 7 +++++++ Composer/packages/types/src/telemetry.ts | 3 +++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx b/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx index 16b3682483..88b25f2087 100644 --- a/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx +++ b/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx @@ -15,7 +15,7 @@ import querystring from 'query-string'; import { FontWeights } from '@uifabric/styling'; import { DialogWrapper, DialogTypes } from '@bfc/ui-shared'; import { useRecoilValue } from 'recoil'; -import { csharpFeedKey, functionsRuntimeKey, nodeFeedKey, QnABotTemplateId } from '@bfc/shared'; +import { csharpFeedKey, FeedType, functionsRuntimeKey, nodeFeedKey, QnABotTemplateId } from '@bfc/shared'; import { RuntimeType, webAppRuntimeKey } from '@bfc/shared'; import { Dropdown, IDropdownOption } from 'office-ui-fabric-react/lib/Dropdown'; import camelCase from 'lodash/camelCase'; @@ -29,6 +29,8 @@ import { ImportSuccessNotificationWrapper } from '../../ImportModal/ImportSucces import { dispatcherState, templateProjectsState } from '../../../recoilModel'; import { LocationSelectContent } from '../LocationSelectContent'; import { getAliasFromPayload, Profile } from '../../../utils/electronUtil'; +import TelemetryClient from '../../../telemetry/TelemetryClient'; +import { ImportFailedModal } from '../../ImportModal/ImportFailedModal'; // -------------------- Styles -------------------- // @@ -291,6 +293,13 @@ const DefineConversationV2: React.FC = (props) => { dataToSubmit.alias = await getAliasFromPayload(source, payload); } } + // creationExecuted: { runtimeChoice: RuntimeType; runtimeLanguage: FeedType; isPva: boolean; isAbs: boolean }; + TelemetryClient.track('creationExecuted', { + runtimeChoice: dataToSubmit?.runtimeType, + runtimeLanguage: dataToSubmit?.runtimeLanguage as FeedType, + isPva: isImported, + isAbs: !!dataToSubmit?.source, + }); onSubmit({ ...dataToSubmit }, templateId || ''); }, [hasErrors, formData] diff --git a/Composer/packages/client/src/pages/botProject/create-publish-profile/PublishProfileDialog.tsx b/Composer/packages/client/src/pages/botProject/create-publish-profile/PublishProfileDialog.tsx index b98bfe332b..aa01b4b53a 100644 --- a/Composer/packages/client/src/pages/botProject/create-publish-profile/PublishProfileDialog.tsx +++ b/Composer/packages/client/src/pages/botProject/create-publish-profile/PublishProfileDialog.tsx @@ -175,12 +175,14 @@ export const PublishProfileDialog: React.FC = (props) // require tenant id to be set by plugin (handles multiple tenant scenario) if (!tenantId) { + const errorMessage = formatMessage( + 'An Azure tenant must be set in order to provision resources. Try recreating the publish profile and try again.' + ); + TelemetryClient.track('ProvisionProfileCreateFailure', { message: errorMessage }); const notification = createNotification({ type: 'error', title: formatMessage('Error provisioning.'), - description: formatMessage( - 'An Azure tenant must be set in order to provision resources. Try recreating the publish profile and try again.' - ), + description: errorMessage, }); addNotification(notification); return; diff --git a/Composer/packages/client/src/recoilModel/dispatchers/provision.ts b/Composer/packages/client/src/recoilModel/dispatchers/provision.ts index 35b341969d..457dda898c 100644 --- a/Composer/packages/client/src/recoilModel/dispatchers/provision.ts +++ b/Composer/packages/client/src/recoilModel/dispatchers/provision.ts @@ -99,6 +99,10 @@ export const provisionDispatcher = () => { notification.id ); } catch (error) { + TelemetryClient.track('ProvisionProfileCreateFailure', { + message: error.response?.data || 'Error when provision target', + }); + // set notification const notification = createNotification( getProvisionFailureNotification(error.response?.data || 'Error when provision target') @@ -164,6 +168,9 @@ export const provisionDispatcher = () => { if (response.data.status !== 500) { notification = getProvisionPendingNotification(response.data.message); } else { + TelemetryClient.track('ProvisionProfileCreateFailure', { + message: 'Error when provisioning', + }); notification = getProvisionFailureNotification(response.data.message); isCleanTimer = true; } diff --git a/Composer/packages/types/src/telemetry.ts b/Composer/packages/types/src/telemetry.ts index b7b3ea59b6..2ac67652d9 100644 --- a/Composer/packages/types/src/telemetry.ts +++ b/Composer/packages/types/src/telemetry.ts @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +import { FeedType, RuntimeType } from './creation'; import { TelemetrySettings } from './settings'; export type ServerSettings = Partial<{ telemetry: TelemetrySettings }>; @@ -131,12 +132,14 @@ type PublishingEvents = { ProvisionCancel: undefined; ProvisionShowHandoff: undefined; ProvisionAddResourcesCancel: undefined; + ProvisionProfileCreateFailure: { message: string }; }; type CreationEvents = { NewBotDialogOpened: { fromAbsHandoff: boolean; isSkillBot: boolean }; CreationCancelled: undefined; NeedAnotherTemplateCLicked: undefined; + creationExecuted: { runtimeChoice: RuntimeType; runtimeLanguage: FeedType; isPva: boolean; isAbs: boolean }; }; type RocketPanelEvents = { From 7bc829914b4f2099a0337ac4a7cf27468489d2ba Mon Sep 17 00:00:00 2001 From: Patrick Volum Date: Thu, 29 Apr 2021 18:37:12 -0400 Subject: [PATCH 06/13] Adding telemetry for request template button --- .../client/src/components/CreationFlow/v2/CreateBot.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Composer/packages/client/src/components/CreationFlow/v2/CreateBot.tsx b/Composer/packages/client/src/components/CreationFlow/v2/CreateBot.tsx index 1805bfb318..9e7646d47e 100644 --- a/Composer/packages/client/src/components/CreationFlow/v2/CreateBot.tsx +++ b/Composer/packages/client/src/components/CreationFlow/v2/CreateBot.tsx @@ -273,7 +273,14 @@ export function CreateBotV2(props: CreateBotProps) { - + { + TelemetryClient.track('NeedAnotherTemplateCLicked'); + }} + > {formatMessage('Need another template? Send us a request')} From 6a5820c72074d6979926b9c3821d58f0a18d0cd7 Mon Sep 17 00:00:00 2001 From: Patrick Volum Date: Thu, 29 Apr 2021 18:49:05 -0400 Subject: [PATCH 07/13] Adding telem for publish success and failure --- .../client/src/recoilModel/dispatchers/publisher.ts | 3 +++ Composer/packages/types/src/telemetry.ts | 10 +++------- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Composer/packages/client/src/recoilModel/dispatchers/publisher.ts b/Composer/packages/client/src/recoilModel/dispatchers/publisher.ts index df9d590854..53b7ee02df 100644 --- a/Composer/packages/client/src/recoilModel/dispatchers/publisher.ts +++ b/Composer/packages/client/src/recoilModel/dispatchers/publisher.ts @@ -28,6 +28,7 @@ import * as luUtil from '../../utils/luUtil'; import * as qnaUtil from '../../utils/qnaUtil'; import { ClientStorage } from '../../utils/storage'; import { RuntimeOutputData } from '../types'; +import TelemetryClient from '../../telemetry/TelemetryClient'; import { BotStatus, Text } from './../../constants'; import httpClient from './../../utils/httpUtil'; @@ -42,6 +43,7 @@ export const publishStorage = new ClientStorage(window.sessionStorage, 'publish' export const publisherDispatcher = () => { const publishFailure = async ({ set }: CallbackInterface, title: string, error, target, projectId: string) => { + TelemetryClient.track('PublishFailure', { message: title }); if (target.name === defaultPublishConfig.name) { set(botStatusState(projectId), BotStatus.failed); set(botBuildTimeErrorState(projectId), { ...error, title }); @@ -58,6 +60,7 @@ export const publisherDispatcher = () => { }; const publishSuccess = async ({ set }: CallbackInterface, projectId: string, data: PublishResult, target) => { + TelemetryClient.track('PublishSuccess'); const { endpointURL, status } = data; if (target.name === defaultPublishConfig.name) { if (status === PUBLISH_SUCCESS && endpointURL) { diff --git a/Composer/packages/types/src/telemetry.ts b/Composer/packages/types/src/telemetry.ts index 2ac67652d9..46c5e678fb 100644 --- a/Composer/packages/types/src/telemetry.ts +++ b/Composer/packages/types/src/telemetry.ts @@ -120,6 +120,8 @@ type ResourcesItem = { }; type PublishingEvents = { + PublishSuccess: undefined; + PublishFailure: { message: string }; NewPublishingProfileStarted: undefined; NewPublishingProfileSaved: { type: string; msAppId?: string; subscriptionId?: string }; PublishingProfileStarted: { target: string; projectId: string; msAppId?: string; subscriptionId?: string }; @@ -142,11 +144,6 @@ type CreationEvents = { creationExecuted: { runtimeChoice: RuntimeType; runtimeLanguage: FeedType; isPva: boolean; isAbs: boolean }; }; -type RocketPanelEvents = { - LearningLinkClicked: { linkName: string }; - NextStepClicked: { title: string }; -}; - type AppSettingsEvents = { FeatureFlagChanged: { featureFlag: string; enabled: boolean }; }; @@ -252,8 +249,7 @@ export type TelemetryEvents = ApplicationEvents & LuEditorEvents & OrchestratorEvents & PropertyEditorEvents & - CreationEvents & - RocketPanelEvents; + CreationEvents; export type TelemetryEventName = keyof TelemetryEvents; From 9f694b92eef26b29dbdd3cb22fcd148d93072d61 Mon Sep 17 00:00:00 2001 From: Patrick Volum Date: Thu, 29 Apr 2021 18:52:14 -0400 Subject: [PATCH 08/13] Adding telem for publish start button click --- Composer/packages/client/src/pages/publish/PublishDialog.tsx | 3 +++ Composer/packages/types/src/telemetry.ts | 1 + 2 files changed, 4 insertions(+) diff --git a/Composer/packages/client/src/pages/publish/PublishDialog.tsx b/Composer/packages/client/src/pages/publish/PublishDialog.tsx index 5a3cdd8431..df6c68eaf4 100644 --- a/Composer/packages/client/src/pages/publish/PublishDialog.tsx +++ b/Composer/packages/client/src/pages/publish/PublishDialog.tsx @@ -10,6 +10,8 @@ import { TextField } from 'office-ui-fabric-react/lib/TextField'; import formatMessage from 'format-message'; import { CheckboxVisibility, DetailsList } from 'office-ui-fabric-react/lib/DetailsList'; +import TelemetryClient from '../../telemetry/TelemetryClient'; + import { BotStatus } from './type'; export const PublishDialog = (props) => { @@ -86,6 +88,7 @@ export const PublishDialog = (props) => { setShowItems(cleanedItems); }; const submit = async () => { + TelemetryClient.track('publishStartBtnClick'); props.onDismiss(); await props.onSubmit(showItems); cleanComments(); diff --git a/Composer/packages/types/src/telemetry.ts b/Composer/packages/types/src/telemetry.ts index 46c5e678fb..ec75c10631 100644 --- a/Composer/packages/types/src/telemetry.ts +++ b/Composer/packages/types/src/telemetry.ts @@ -120,6 +120,7 @@ type ResourcesItem = { }; type PublishingEvents = { + publishStartBtnClick: undefined; PublishSuccess: undefined; PublishFailure: { message: string }; NewPublishingProfileStarted: undefined; From 1ab55cc8a6b98b923db4da309f79ef217320f4f0 Mon Sep 17 00:00:00 2001 From: Patrick Volum Date: Thu, 29 Apr 2021 19:08:08 -0400 Subject: [PATCH 09/13] Adding telem for create provision prof started with newResoruceGroup variable --- Composer/packages/client/src/pages/publish/PublishDialog.tsx | 2 +- Composer/packages/types/src/telemetry.ts | 3 ++- .../azurePublish/src/components/azureProvisionDialog.tsx | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Composer/packages/client/src/pages/publish/PublishDialog.tsx b/Composer/packages/client/src/pages/publish/PublishDialog.tsx index df6c68eaf4..b4259d4729 100644 --- a/Composer/packages/client/src/pages/publish/PublishDialog.tsx +++ b/Composer/packages/client/src/pages/publish/PublishDialog.tsx @@ -88,7 +88,7 @@ export const PublishDialog = (props) => { setShowItems(cleanedItems); }; const submit = async () => { - TelemetryClient.track('publishStartBtnClick'); + TelemetryClient.track('PublishStartBtnClick'); props.onDismiss(); await props.onSubmit(showItems); cleanComments(); diff --git a/Composer/packages/types/src/telemetry.ts b/Composer/packages/types/src/telemetry.ts index ec75c10631..c51e8a5d0f 100644 --- a/Composer/packages/types/src/telemetry.ts +++ b/Composer/packages/types/src/telemetry.ts @@ -120,7 +120,8 @@ type ResourcesItem = { }; type PublishingEvents = { - publishStartBtnClick: undefined; + CreateProvisionStarted: { newResourceGroup: boolean }; + PublishStartBtnClick: undefined; PublishSuccess: undefined; PublishFailure: { message: string }; NewPublishingProfileStarted: undefined; diff --git a/extensions/azurePublish/src/components/azureProvisionDialog.tsx b/extensions/azurePublish/src/components/azureProvisionDialog.tsx index b3c1150153..1ea57c923b 100644 --- a/extensions/azurePublish/src/components/azureProvisionDialog.tsx +++ b/extensions/azurePublish/src/components/azureProvisionDialog.tsx @@ -1195,6 +1195,7 @@ export const AzureProvisionDialog: React.FC = () => { text={formatMessage('Create')} onClick={() => { const selectedResources = formData.requiredResources.concat(formData.enabledResources); + telemetryClient.track('CreateProvisionStarted', { newResourceGroup: isNewResourceGroup }); onSubmit({ tenantId: formData.tenantId, subscription: formData.subscriptionId, From 2a0cd612cf6777b565fb038ade1e0a708dd6dd68 Mon Sep 17 00:00:00 2001 From: Patrick Volum Date: Thu, 29 Apr 2021 19:12:23 -0400 Subject: [PATCH 10/13] Adding unary null operator --- extensions/azurePublish/src/components/azureProvisionDialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/azurePublish/src/components/azureProvisionDialog.tsx b/extensions/azurePublish/src/components/azureProvisionDialog.tsx index 1ea57c923b..e80d99207a 100644 --- a/extensions/azurePublish/src/components/azureProvisionDialog.tsx +++ b/extensions/azurePublish/src/components/azureProvisionDialog.tsx @@ -1195,7 +1195,7 @@ export const AzureProvisionDialog: React.FC = () => { text={formatMessage('Create')} onClick={() => { const selectedResources = formData.requiredResources.concat(formData.enabledResources); - telemetryClient.track('CreateProvisionStarted', { newResourceGroup: isNewResourceGroup }); + telemetryClient?.track('CreateProvisionStarted', { newResourceGroup: isNewResourceGroup }); onSubmit({ tenantId: formData.tenantId, subscription: formData.subscriptionId, From 34956a1f444f06acda064c27c682a34af40cd185 Mon Sep 17 00:00:00 2001 From: Patrick Volum Date: Fri, 30 Apr 2021 13:57:16 -0400 Subject: [PATCH 11/13] - making PR changes - updating localization file --- .../CreationFlow/v2/CreateOptions.tsx | 8 +++--- .../CreationFlow/v2/DefineConversation.tsx | 1 - .../PublishProfileDialog.tsx | 9 +++---- .../src/recoilModel/dispatchers/provision.ts | 6 ++--- .../src/recoilModel/dispatchers/publisher.ts | 2 +- .../packages/server/src/locales/en-US.json | 27 ++++++++++++++++--- Composer/packages/types/src/telemetry.ts | 2 +- 7 files changed, 37 insertions(+), 18 deletions(-) diff --git a/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx b/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx index b582c7b210..a51438a756 100644 --- a/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx +++ b/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx @@ -60,10 +60,6 @@ export function CreateOptionsV2(props: CreateOptionsProps) { } }) .catch((e) => { - TelemetryClient.track('NewBotDialogOpened', { - isSkillBot: false, - fromAbsHandoff: true, - }); setIsOpenOptionsModal(true); }); }); @@ -110,6 +106,10 @@ export function CreateOptionsV2(props: CreateOptionsProps) { const handleJumpToNext = () => { if (option === 'Create') { + TelemetryClient.track('NewBotDialogOpened', { + isSkillBot: false, + fromAbsHandoff: true, + }); setIsOpenCreateModal(true); } else { onJumpToOpenModal(props.location?.search); diff --git a/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx b/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx index 3014ecd5ee..844eeb1173 100644 --- a/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx +++ b/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx @@ -295,7 +295,6 @@ const DefineConversationV2: React.FC = (props) => { dataToSubmit.alias = await getAliasFromPayload(source, payload); } } - // creationExecuted: { runtimeChoice: RuntimeType; runtimeLanguage: FeedType; isPva: boolean; isAbs: boolean }; TelemetryClient.track('creationExecuted', { runtimeChoice: dataToSubmit?.runtimeType, runtimeLanguage: dataToSubmit?.runtimeLanguage as FeedType, diff --git a/Composer/packages/client/src/pages/botProject/create-publish-profile/PublishProfileDialog.tsx b/Composer/packages/client/src/pages/botProject/create-publish-profile/PublishProfileDialog.tsx index 481a256607..ecd9d3f695 100644 --- a/Composer/packages/client/src/pages/botProject/create-publish-profile/PublishProfileDialog.tsx +++ b/Composer/packages/client/src/pages/botProject/create-publish-profile/PublishProfileDialog.tsx @@ -184,14 +184,13 @@ export const PublishProfileDialog: React.FC = (props) // require tenant id to be set by plugin (handles multiple tenant scenario) if (!tenantId) { - const errorMessage = formatMessage( - 'An Azure tenant must be set in order to provision resources. Try recreating the publish profile and try again.' - ); - TelemetryClient.track('ProvisionProfileCreateFailure', { message: errorMessage }); + TelemetryClient.track('ProvisioningProfileCreateFailure', { message: 'azure tenant not set' }); const notification = createNotification({ type: 'error', title: formatMessage('Error provisioning.'), - description: errorMessage, + description: formatMessage( + 'An Azure tenant must be set in order to provision resources. Try recreating the publish profile and try again.' + ), }); addNotification(notification); return; diff --git a/Composer/packages/client/src/recoilModel/dispatchers/provision.ts b/Composer/packages/client/src/recoilModel/dispatchers/provision.ts index c2966b07aa..b237450cfd 100644 --- a/Composer/packages/client/src/recoilModel/dispatchers/provision.ts +++ b/Composer/packages/client/src/recoilModel/dispatchers/provision.ts @@ -99,7 +99,7 @@ export const provisionDispatcher = () => { notification.id ); } catch (error) { - TelemetryClient.track('ProvisionProfileCreateFailure', { + TelemetryClient.track('ProvisioningProfileCreateFailure', { message: error.response?.data || 'Error when provision target', }); @@ -168,8 +168,8 @@ export const provisionDispatcher = () => { if (response.data.status !== 500) { notification = getProvisionPendingNotification(response.data.message); } else { - TelemetryClient.track('ProvisionProfileCreateFailure', { - message: 'Error when provisioning', + TelemetryClient.track('ProvisioningProfileCreateFailure', { + message: response.data.message, }); notification = getProvisionFailureNotification(response.data.message); isCleanTimer = true; diff --git a/Composer/packages/client/src/recoilModel/dispatchers/publisher.ts b/Composer/packages/client/src/recoilModel/dispatchers/publisher.ts index 359a0be381..1ac3143c1e 100644 --- a/Composer/packages/client/src/recoilModel/dispatchers/publisher.ts +++ b/Composer/packages/client/src/recoilModel/dispatchers/publisher.ts @@ -44,7 +44,7 @@ export const publishStorage = new ClientStorage(window.sessionStorage, 'publish' export const publisherDispatcher = () => { const publishFailure = async ({ set }: CallbackInterface, title: string, error, target, projectId: string) => { - TelemetryClient.track('PublishFailure', { message: title }); + TelemetryClient.track('PublishFailure', { message: error }); if (target.name === defaultPublishConfig.name) { set(botStatusState(projectId), BotStatus.failed); set(botBuildTimeErrorState(projectId), { ...error, title }); diff --git a/Composer/packages/server/src/locales/en-US.json b/Composer/packages/server/src/locales/en-US.json index a523a8d646..6845817af4 100644 --- a/Composer/packages/server/src/locales/en-US.json +++ b/Composer/packages/server/src/locales/en-US.json @@ -182,6 +182,9 @@ "add_alternative_phrasing_17e0304c": { "message": "+ Add alternative phrasing" }, + "add_an_existing_bot_5a9cc5b1": { + "message": "Add an existing bot" + }, "add_app_id_and_password_164e0fdb": { "message": "Add App ID and Password" }, @@ -431,6 +434,12 @@ "azure_functions_5e23be5c": { "message": "Azure Functions" }, + "azure_functions_required_2a035b48": { + "message": "Azure Functions required" + }, + "azure_functions_runtime_not_installed_bc24e100": { + "message": "Azure Functions runtime not installed." + }, "azure_web_app_d834cb4c": { "message": "Azure Web App" }, @@ -698,6 +707,9 @@ "composer_logo_ba2048a0": { "message": "Composer Logo" }, + "composer_needs_azure_functions_36138382": { + "message": "Composer needs Azure Functions" + }, "composer_needs_net_core_sdk_46e2a8ae": { "message": "Composer needs .NET Core SDK" }, @@ -1910,6 +1922,9 @@ "insert_template_reference_bb33720e": { "message": "Insert template reference" }, + "install_azure_functions_d607f182": { + "message": "Install Azure Functions" + }, "install_error_a9319839": { "message": "Install Error" }, @@ -2621,6 +2636,9 @@ "onboarding_8407871c": { "message": "Onboarding" }, + "once_you_publish_your_bot_to_azure_you_will_be_rea_93048067": { + "message": "Once you publish your bot to Azure you will be ready to add connections." + }, "ondialogevents_types_3dc569b5": { "message": "OnDialogEvents Types" }, @@ -2894,6 +2912,9 @@ "publish_to_dev_ops_3b8f5a2f": { "message": "Publish to Dev Ops" }, + "publish_your_bot_9099e323": { + "message": "Publish your bot" + }, "publish_your_bot_to_azure_and_manage_published_bot_67751ca9": { "message": "Publish your bot to Azure and manage published bots here." }, @@ -3191,9 +3212,6 @@ "save_11a80ec3": { "message": "Save" }, - "save_as_9e0cf70b": { - "message": "Save as" - }, "save_your_skill_manifest_63bf5f26": { "message": "Save your skill manifest" }, @@ -3833,6 +3851,9 @@ "to_perform_provisioning_and_publishing_actions_com_a2c54389": { "message": "To perform provisioning and publishing actions, Composer requires access to your Azure and MS Graph accounts. Paste access tokens from the az command line tool using the commands highlighted below." }, + "to_run_this_bot_composer_needs_azure_functions_cor_bbbd0e7": { + "message": "To run this bot, Composer needs Azure Functions Core Tools." + }, "to_run_this_bot_composer_needs_net_core_sdk_d1551038": { "message": "To run this bot, Composer needs .NET Core SDK." }, diff --git a/Composer/packages/types/src/telemetry.ts b/Composer/packages/types/src/telemetry.ts index b3386ea028..f2c669bcb4 100644 --- a/Composer/packages/types/src/telemetry.ts +++ b/Composer/packages/types/src/telemetry.ts @@ -137,7 +137,7 @@ type PublishingEvents = { ProvisionCancel: undefined; ProvisionShowHandoff: undefined; ProvisionAddResourcesCancel: undefined; - ProvisionProfileCreateFailure: { message: string }; + ProvisioningProfileCreateFailure: { message: string }; }; type CreationEvents = { From ac782545f2a3596375cfdf6c02b7651d62cdcdbe Mon Sep 17 00:00:00 2001 From: Patrick Volum Date: Fri, 30 Apr 2021 13:58:56 -0400 Subject: [PATCH 12/13] removing ununsed imports --- .../client/src/components/CreationFlow/v2/CreateOptions.tsx | 2 +- .../src/components/CreationFlow/v2/DefineConversation.tsx | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx b/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx index a51438a756..0b39a0ccc7 100644 --- a/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx +++ b/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx @@ -17,7 +17,7 @@ import querystring from 'query-string'; import axios from 'axios'; import { useRecoilValue } from 'recoil'; -import { CreationFlowStatus, DialogCreationCopy } from '../../../constants'; +import { DialogCreationCopy } from '../../../constants'; import { getAliasFromPayload, isElectron } from '../../../utils/electronUtil'; import { creationFlowTypeState, userHasNodeInstalledState } from '../../../recoilModel'; import { InstallDepModal } from '../../InstallDepModal'; diff --git a/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx b/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx index 844eeb1173..cab1b01b25 100644 --- a/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx +++ b/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx @@ -30,7 +30,6 @@ import { dispatcherState, templateProjectsState } from '../../../recoilModel'; import { LocationSelectContent } from '../LocationSelectContent'; import { getAliasFromPayload, Profile } from '../../../utils/electronUtil'; import TelemetryClient from '../../../telemetry/TelemetryClient'; -import { ImportFailedModal } from '../../ImportModal/ImportFailedModal'; // -------------------- Styles -------------------- // From 0d5e63781de411e8853e2bc5d6db74c21b7c0420 Mon Sep 17 00:00:00 2001 From: Patrick Volum Date: Fri, 30 Apr 2021 16:24:37 -0400 Subject: [PATCH 13/13] Making requested PR changes --- .../client/src/components/CreationFlow/v2/CreateBot.tsx | 2 +- .../client/src/components/CreationFlow/v2/CreateOptions.tsx | 4 ++-- .../src/components/CreationFlow/v2/DefineConversation.tsx | 2 +- .../packages/client/src/recoilModel/dispatchers/publisher.ts | 2 +- Composer/packages/types/src/telemetry.ts | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Composer/packages/client/src/components/CreationFlow/v2/CreateBot.tsx b/Composer/packages/client/src/components/CreationFlow/v2/CreateBot.tsx index a3568a2cfd..8578971755 100644 --- a/Composer/packages/client/src/components/CreationFlow/v2/CreateBot.tsx +++ b/Composer/packages/client/src/components/CreationFlow/v2/CreateBot.tsx @@ -283,7 +283,7 @@ export function CreateBotV2(props: CreateBotProps) { styles={{ root: { fontSize: '12px', float: 'left' } }} target="_blank" onClick={() => { - TelemetryClient.track('NeedAnotherTemplateCLicked'); + TelemetryClient.track('NeedAnotherTemplateClicked'); }} > diff --git a/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx b/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx index 0b39a0ccc7..0f01399bca 100644 --- a/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx +++ b/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx @@ -95,7 +95,7 @@ export function CreateOptionsV2(props: CreateOptionsProps) { }, }; - const getOptions = (): IChoiceGroupOption[] => [ + const options: IChoiceGroupOption[] = [ { key: 'Create', text: formatMessage('Create a new bot') }, { key: 'Connect', text: formatMessage('Connect to an existing bot') }, ]; @@ -131,7 +131,7 @@ export function CreateOptionsV2(props: CreateOptionsProps) { dialogType={DialogTypes.Customer} onDismiss={onDismiss} > - + diff --git a/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx b/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx index cab1b01b25..d15f9381e8 100644 --- a/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx +++ b/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx @@ -294,7 +294,7 @@ const DefineConversationV2: React.FC = (props) => { dataToSubmit.alias = await getAliasFromPayload(source, payload); } } - TelemetryClient.track('creationExecuted', { + TelemetryClient.track('CreationExecuted', { runtimeChoice: dataToSubmit?.runtimeType, runtimeLanguage: dataToSubmit?.runtimeLanguage as FeedType, isPva: isImported, diff --git a/Composer/packages/client/src/recoilModel/dispatchers/publisher.ts b/Composer/packages/client/src/recoilModel/dispatchers/publisher.ts index 1ac3143c1e..41c8f6997d 100644 --- a/Composer/packages/client/src/recoilModel/dispatchers/publisher.ts +++ b/Composer/packages/client/src/recoilModel/dispatchers/publisher.ts @@ -44,7 +44,7 @@ export const publishStorage = new ClientStorage(window.sessionStorage, 'publish' export const publisherDispatcher = () => { const publishFailure = async ({ set }: CallbackInterface, title: string, error, target, projectId: string) => { - TelemetryClient.track('PublishFailure', { message: error }); + TelemetryClient.track('PublishFailure', { message: typeof error === 'string' ? error : JSON.stringify(error) }); if (target.name === defaultPublishConfig.name) { set(botStatusState(projectId), BotStatus.failed); set(botBuildTimeErrorState(projectId), { ...error, title }); diff --git a/Composer/packages/types/src/telemetry.ts b/Composer/packages/types/src/telemetry.ts index f2c669bcb4..7860f2d3e2 100644 --- a/Composer/packages/types/src/telemetry.ts +++ b/Composer/packages/types/src/telemetry.ts @@ -143,8 +143,8 @@ type PublishingEvents = { type CreationEvents = { NewBotDialogOpened: { fromAbsHandoff: boolean; isSkillBot: boolean }; CreationCancelled: undefined; - NeedAnotherTemplateCLicked: undefined; - creationExecuted: { runtimeChoice: RuntimeType; runtimeLanguage: FeedType; isPva: boolean; isAbs: boolean }; + NeedAnotherTemplateClicked: undefined; + CreationExecuted: { runtimeChoice: RuntimeType; runtimeLanguage: FeedType; isPva: boolean; isAbs: boolean }; }; type AppSettingsEvents = {