in server/aws-lsp-codewhisperer/src/shared/telemetry/telemetryService.ts [168:246]
public emitUserTriggerDecision(session: CodeWhispererSession, timeSinceLastUserModification?: number) {
if (this.enableTelemetryEventsToDestination) {
const data: CodeWhispererUserTriggerDecisionEvent = {
codewhispererSessionId: session.codewhispererSessionId || '',
codewhispererFirstRequestId: session.responseContext?.requestId || '',
credentialStartUrl: session.credentialStartUrl,
codewhispererSuggestionState: session.getAggregatedUserTriggerDecision(),
codewhispererCompletionType:
session.suggestions.length > 0 ? getCompletionType(session.suggestions[0]) : undefined,
codewhispererLanguage: session.language,
codewhispererTriggerType: session.triggerType,
codewhispererAutomatedTriggerType: session.autoTriggerType,
codewhispererTriggerCharacter:
session.autoTriggerType === 'SpecialCharacters' ? session.triggerCharacter : undefined,
codewhispererLineNumber: session.startPosition.line,
codewhispererCursorOffset: session.startPosition.character,
codewhispererSuggestionCount: session.suggestions.length,
codewhispererClassifierResult: session.classifierResult,
codewhispererClassifierThreshold: session.classifierThreshold,
codewhispererTotalShownTime: session.totalSessionDisplayTime || 0,
codewhispererTypeaheadLength: session.typeaheadLength || 0,
// Global time between any 2 document changes
codewhispererTimeSinceLastDocumentChange: timeSinceLastUserModification,
codewhispererTimeSinceLastUserDecision: session.previousTriggerDecisionTime
? session.startTime - session.previousTriggerDecisionTime
: undefined,
codewhispererTimeToFirstRecommendation: session.timeToFirstRecommendation,
codewhispererPreviousSuggestionState: session.previousTriggerDecision,
codewhispererSupplementalContextTimeout: session.supplementalMetadata?.isProcessTimeout,
codewhispererSupplementalContextIsUtg: session.supplementalMetadata?.isUtg,
codewhispererSupplementalContextLength: session.supplementalMetadata?.contentsLength,
codewhispererCustomizationArn: session.customizationArn,
}
this.telemetry.emitMetric({
name: 'codewhisperer_userTriggerDecision',
data: data,
})
}
const acceptedSuggestion = session.suggestions.find(s => s.itemId === session.acceptedSuggestionId)
const generatedLines =
acceptedSuggestion === undefined || acceptedSuggestion.content.trim() === ''
? 0
: acceptedSuggestion.content.split('\n').length
const referenceCount =
acceptedSuggestion === undefined
? 0
: acceptedSuggestion.references && acceptedSuggestion.references.length > 0
? 1
: 0
const acceptedCharacterCount =
acceptedSuggestion && acceptedSuggestion.content ? acceptedSuggestion.content.length : 0
const perceivedLatencyMilliseconds =
session.triggerType === 'OnDemand' ? session.timeToFirstRecommendation : timeSinceLastUserModification
const event: UserTriggerDecisionEvent = {
sessionId: session.codewhispererSessionId || '',
requestId: session.responseContext?.requestId || '',
customizationArn: session.customizationArn === '' ? undefined : session.customizationArn,
programmingLanguage: {
languageName: getRuntimeLanguage(session.language),
},
completionType:
session.suggestions.length > 0 ? getCompletionType(session.suggestions[0]).toUpperCase() : 'LINE',
suggestionState: this.getSuggestionState(session),
recommendationLatencyMilliseconds: session.firstCompletionDisplayLatency
? session.firstCompletionDisplayLatency
: 0,
timestamp: new Date(Date.now()),
triggerToResponseLatencyMilliseconds: session.timeToFirstRecommendation,
suggestionReferenceCount: referenceCount,
generatedLine: generatedLines,
numberOfRecommendations: session.suggestions.length,
perceivedLatencyMilliseconds: perceivedLatencyMilliseconds,
acceptedCharacterCount: acceptedCharacterCount,
}
return this.invokeSendTelemetryEvent({
userTriggerDecisionEvent: event,
})
}