public emitUserTriggerDecision()

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,
        })
    }