Skip to content

Commit f5e3ce3

Browse files
author
Vandita Patidar
committed
Adding metrics
1 parent ef5e965 commit f5e3ce3

File tree

11 files changed

+624
-37
lines changed

11 files changed

+624
-37
lines changed

packages/core/src/awsService/appBuilder/activation.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,9 @@ async function registerAppBuilderCommands(context: ExtContext): Promise<void> {
202202
}
203203
}),
204204
Commands.register({ id: 'aws.toolkit.lambda.createServerlessLandProject', autoconnect: false }, async () => {
205-
await createNewServerlessLandProject(context)
205+
await telemetry.serverlessland_createProject.run(async () => {
206+
await createNewServerlessLandProject(context)
207+
})
206208
})
207209
)
208210
}

packages/core/src/awsService/appBuilder/serverlessLand/main.ts

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import { ExtContext } from '../../../shared/extensions'
1616
import { addFolderToWorkspace } from '../../../shared/utilities/workspaceUtils'
1717
import { ToolkitError } from '../../../shared/errors'
1818
import { fs } from '../../../shared/fs/fs'
19-
import { sleep } from '../../../shared/utilities/timeoutUtils'
2019
import { getPattern } from '../../../shared/utilities/downloadPatterns'
2120
import { MetadataManager } from './metadataManager'
2221

@@ -74,16 +73,14 @@ export async function createNewServerlessLandProject(extContext: ExtContext): Pr
7473
)
7574
getLogger().error('Error creating new Serverless Land Application: %O', err as Error)
7675
} finally {
77-
// add telemetry
78-
// TODO: Will add telemetry once the implementation gets completed
79-
telemetry.sam_init.emit({
76+
telemetry.serverlessland_createProject.emit({
8077
result: createResult,
8178
reason: reason,
8279
})
8380
}
8481
}
8582

86-
async function launchProjectCreationWizard(
83+
export async function launchProjectCreationWizard(
8784
extContext: ExtContext
8885
): Promise<CreateServerlessLandWizardForm | undefined> {
8986
const awsContext = extContext.awsContext
@@ -96,40 +93,59 @@ async function launchProjectCreationWizard(
9693
}).run()
9794
}
9895

99-
async function downloadPatternCode(config: CreateServerlessLandWizardForm, assetName: string): Promise<void> {
96+
export async function downloadPatternCode(config: CreateServerlessLandWizardForm, assetName: string): Promise<void> {
10097
const fullAssetName = assetName + '.zip'
10198
const location = vscode.Uri.joinPath(config.location, config.name)
10299
try {
103100
await getPattern(serverlessLandOwner, serverlessLandRepo, fullAssetName, location, true)
101+
telemetry.record({
102+
action: fullAssetName + config.iac + config.runtime,
103+
result: 'Succeeded',
104+
})
104105
} catch (error) {
106+
telemetry.serverlessland_downloadPattern.emit({
107+
result: 'Failed',
108+
reason: getTelemetryReason(error),
109+
})
105110
if (error instanceof ToolkitError) {
106111
throw error
107112
}
108113
throw new ToolkitError(`Failed to download pattern: ${error}`)
109114
}
110115
}
111116

112-
async function openReadmeFile(config: CreateServerlessLandWizardForm): Promise<void> {
117+
export async function openReadmeFile(config: CreateServerlessLandWizardForm): Promise<void> {
113118
try {
114119
const readmeUri = await getProjectUri(config, readmeFile)
115120
if (!readmeUri) {
116121
getLogger().warn('README.md file not found in the project directory')
122+
telemetry.serverlessland_readme.emit({
123+
result: 'Failed',
124+
reason: 'FileNotFound',
125+
})
117126
return
118127
}
119128
await vscode.commands.executeCommand('workbench.action.focusFirstEditorGroup')
120129
await vscode.commands.executeCommand('markdown.showPreview', readmeUri)
130+
telemetry.serverlessland_readme.emit({
131+
result: 'Succeeded',
132+
})
121133
} catch (err) {
134+
telemetry.serverlessland_readme.emit({
135+
result: 'Failed',
136+
reason: getTelemetryReason(err),
137+
})
122138
getLogger().error(`Error in openReadmeFile: ${err}`)
123139
throw new ToolkitError('Error processing README file')
124140
}
125141
}
126142

127-
async function getProjectUri(
143+
export async function getProjectUri(
128144
config: Pick<CreateServerlessLandWizardForm, 'location' | 'name'>,
129145
file: string
130146
): Promise<vscode.Uri | undefined> {
131147
if (!file) {
132-
throw Error('expected "file" parameter to have at least one item')
148+
throw new ToolkitError('expected "file" parameter to have at least one item')
133149
}
134150
const cfnTemplatePath = path.resolve(config.location.fsPath, config.name, file)
135151
if (await fs.exists(cfnTemplatePath)) {

packages/core/src/awsService/appBuilder/serverlessLand/metadata.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"patterns": {
3-
"s3-lambda-resizing-sam": {
3+
"Image Resizing": {
44
"name": "Resizing image",
55
"description": "Lambda, S3 • Python, Javascript, Java, .NET • SAM",
66
"implementation": [
@@ -26,7 +26,7 @@
2626
}
2727
]
2828
},
29-
"apigw-rest-api-lambda-sam": {
29+
"Hello World Lambda with API": {
3030
"name": "Rest API",
3131
"description": "Lambda, API Gateway • Python, Javascript, Java, .NET • SAM",
3232
"implementation": [

packages/core/src/awsService/appBuilder/serverlessLand/metadataManager.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import * as nodefs from 'fs' // eslint-disable-line no-restricted-imports
66
import { ToolkitError } from '../../../shared/errors'
77
import globals from '../../../shared/extensionGlobals'
8+
import { telemetry } from '../../../shared/telemetry/telemetry'
89

910
interface Implementation {
1011
iac: string
@@ -62,9 +63,18 @@ export class MetadataManager {
6263
const metadataContent = nodefs.readFileSync(metadataPath, { encoding: 'utf-8' })
6364
const parseMetadata = JSON.parse(metadataContent) as ProjectMetadata
6465
this.metadata = parseMetadata
66+
telemetry.record({
67+
action: 'serverlessland_metadataLoaded',
68+
result: 'Succeeded',
69+
})
6570
}
6671
return this.metadata
6772
} catch (err) {
73+
telemetry.record({
74+
action: 'serverlessland_metadataLoaded',
75+
result: 'Failed',
76+
reason: err instanceof Error ? err.message : String(err),
77+
})
6878
throw new ToolkitError(`Failed to load metadata: ${err instanceof Error ? err.message : String(err)}`)
6979
}
7080
}

packages/core/src/awsService/appBuilder/serverlessLand/wizard.ts

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ function promptPattern(metadataManager: MetadataManager) {
3131
throw new ToolkitError('No patterns found in metadata')
3232
}
3333

34-
const items = [
35-
...patterns.map((p) => ({
34+
return createQuickPick<string>(
35+
patterns.map((p) => ({
3636
label: p.label,
3737
detail: p.description,
3838
data: p.label,
@@ -44,22 +44,13 @@ function promptPattern(metadataManager: MetadataManager) {
4444
],
4545
})),
4646
{
47-
label: '',
48-
detail: 'Browse more on serverlessland.com',
49-
data: 'visit',
50-
alwaysShow: true,
51-
},
52-
]
53-
54-
const quickPick = createQuickPick<string>(items, {
55-
title: localize('AWS.serverlessLand.initWizard.pattern.prompt', 'Select a Pattern for your application'),
56-
placeholder: 'Choose a pattern for your project',
57-
buttons: createCommonButtons(),
58-
matchOnDescription: true,
59-
matchOnDetail: true,
60-
})
61-
62-
return quickPick
47+
title: localize('AWS.serverlessLand.initWizard.pattern.prompt', 'Select a Pattern for your application'),
48+
placeholder: 'Choose a pattern for your project',
49+
buttons: createCommonButtons(),
50+
matchOnDescription: true,
51+
matchOnDetail: true,
52+
}
53+
)
6354
}
6455

6556
function promptRuntime(metadataManager: MetadataManager, pattern: string | undefined) {

packages/core/src/shared/telemetry/vscodeTelemetry.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,22 @@
644644
"name": "aws_hideRegion",
645645
"description": "Records a call to remove a region from the explorer"
646646
},
647+
{
648+
"name": "serverlessland_createProject",
649+
"description": "Called when creating a new Serverless Project"
650+
},
651+
{
652+
"name": "serverlessland_downloadPattern",
653+
"description": "Called when downloading a Serverless Pattern"
654+
},
655+
{
656+
"name": "serverlessland_readme",
657+
"description": "Called when opening the Serverless Pattern Readme"
658+
},
659+
{
660+
"name": "serverlessland_wizard",
661+
"description": "Called when opening the Serverless Pattern Wizard"
662+
},
647663
{
648664
"name": "sam_detect",
649665
"description": "Called when detecting the location of the SAM CLI",

packages/core/src/shared/ui/pickerPrompter.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -145,13 +145,6 @@ export function createQuickPick<T>(
145145
assign(mergedOptions, picker)
146146
picker.buttons = mergedOptions.buttons ?? []
147147

148-
picker.onDidAccept(() => {
149-
if (picker.selectedItems[0].data === 'visit') {
150-
void vscode.env.openExternal(vscode.Uri.parse('https://serverlessland.com/patterns'))
151-
return
152-
}
153-
})
154-
155148
picker.onDidTriggerItemButton(async (event) => {
156149
const metadataManager = MetadataManager.getInstance()
157150
if (event.button.tooltip !== 'Open in Serverless Land') {

0 commit comments

Comments
 (0)