From 873011ecdc4ad76f74c0e25e2bd89a5da2270163 Mon Sep 17 00:00:00 2001 From: Dan Adler Date: Fri, 4 Oct 2024 06:27:36 -0700 Subject: [PATCH] telemetry: Add billing categorization to cody events 2 (#2345) Adds billing metadata to some events per RFC 978: https://docs.google.com/document/d/1EvyH1kaU-fsn59h-DyoaO2Qy4C2TYLmDGjG73bdb2V4/edit#heading=h.trqab8y0kufp follow on to https://github.com/sourcegraph/cody/pull/5493 and https://github.com/sourcegraph/sourcegraph/pull/529 ## Test plan CI --------- Co-authored-by: Dan Adler <5589410+dadlerj@users.noreply.github.com> --- .../protocol/TelemetryEventParameters.kt | 12 ++++++++++ .../cody/config/CodyAccountListModel.kt | 11 +++++++++- .../cody/config/CodyPersistentAccountsHost.kt | 11 +++++++++- .../cody/config/LogInToSourcegraphAction.kt | 22 +++++++++++++++++-- .../initialization/PostStartupActivity.kt | 2 +- .../cody/listeners/CodyDocumentListener.kt | 9 +++++++- .../sourcegraph/cody/telemetry/TelemetryV2.kt | 14 ++++++++++-- 7 files changed, 73 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/sourcegraph/cody/agent/protocol/TelemetryEventParameters.kt b/src/main/java/com/sourcegraph/cody/agent/protocol/TelemetryEventParameters.kt index 30d266f085..383d8ab9cc 100644 --- a/src/main/java/com/sourcegraph/cody/agent/protocol/TelemetryEventParameters.kt +++ b/src/main/java/com/sourcegraph/cody/agent/protocol/TelemetryEventParameters.kt @@ -1,8 +1,20 @@ package com.sourcegraph.cody.agent.protocol +enum class BillingProduct { + CODY +} + +enum class BillingCategory { + CORE, + BILLABLE +} + +data class BillingMetadata(val product: BillingProduct, val category: BillingCategory) + data class TelemetryEventParameters( val version: Long? = null, val interactionID: String? = null, val metadata: Map? = null, + val billingMetadata: BillingMetadata? = null, val privateMetadata: Map? = null, ) diff --git a/src/main/kotlin/com/sourcegraph/cody/config/CodyAccountListModel.kt b/src/main/kotlin/com/sourcegraph/cody/config/CodyAccountListModel.kt index e5620ec41d..3b4914f547 100644 --- a/src/main/kotlin/com/sourcegraph/cody/config/CodyAccountListModel.kt +++ b/src/main/kotlin/com/sourcegraph/cody/config/CodyAccountListModel.kt @@ -5,6 +5,10 @@ import com.intellij.openapi.actionSystem.ActionManager import com.intellij.openapi.project.Project import com.intellij.openapi.ui.JBPopupMenu import com.intellij.ui.awt.RelativePoint +import com.sourcegraph.cody.agent.protocol.BillingCategory +import com.sourcegraph.cody.agent.protocol.BillingMetadata +import com.sourcegraph.cody.agent.protocol.BillingProduct +import com.sourcegraph.cody.agent.protocol.TelemetryEventParameters import com.sourcegraph.cody.auth.ui.AccountsListModel import com.sourcegraph.cody.auth.ui.AccountsListModelBase import com.sourcegraph.cody.telemetry.TelemetryV2 @@ -63,7 +67,12 @@ class CodyAccountListModel(private val project: Project) : token: String, id: String ) { - TelemetryV2.sendTelemetryEvent(project, "auth.signin.token", "clicked") + TelemetryV2.sendTelemetryEvent( + project, + "auth.signin.token", + "clicked", + TelemetryEventParameters( + billingMetadata = BillingMetadata(BillingProduct.CODY, BillingCategory.BILLABLE))) val account = CodyAccount(login, displayName, server, id) if (accountsListModel.isEmpty) { diff --git a/src/main/kotlin/com/sourcegraph/cody/config/CodyPersistentAccountsHost.kt b/src/main/kotlin/com/sourcegraph/cody/config/CodyPersistentAccountsHost.kt index 1c00f0ca4c..bb72972843 100644 --- a/src/main/kotlin/com/sourcegraph/cody/config/CodyPersistentAccountsHost.kt +++ b/src/main/kotlin/com/sourcegraph/cody/config/CodyPersistentAccountsHost.kt @@ -1,6 +1,10 @@ package com.sourcegraph.cody.config import com.intellij.openapi.project.Project +import com.sourcegraph.cody.agent.protocol.BillingCategory +import com.sourcegraph.cody.agent.protocol.BillingMetadata +import com.sourcegraph.cody.agent.protocol.BillingProduct +import com.sourcegraph.cody.agent.protocol.TelemetryEventParameters import com.sourcegraph.cody.telemetry.TelemetryV2 class CodyPersistentAccountsHost(private val project: Project) : CodyAccountsHost { @@ -11,7 +15,12 @@ class CodyPersistentAccountsHost(private val project: Project) : CodyAccountsHos token: String, id: String ) { - TelemetryV2.sendTelemetryEvent(project, "auth.signin.token", "clicked") + TelemetryV2.sendTelemetryEvent( + project, + "auth.signin.token", + "clicked", + TelemetryEventParameters( + billingMetadata = BillingMetadata(BillingProduct.CODY, BillingCategory.BILLABLE))) val codyAccount = CodyAccount(login, displayName, server, id) val authManager = CodyAuthenticationManager.getInstance() diff --git a/src/main/kotlin/com/sourcegraph/cody/config/LogInToSourcegraphAction.kt b/src/main/kotlin/com/sourcegraph/cody/config/LogInToSourcegraphAction.kt index 926d3302d6..2cee68fffb 100644 --- a/src/main/kotlin/com/sourcegraph/cody/config/LogInToSourcegraphAction.kt +++ b/src/main/kotlin/com/sourcegraph/cody/config/LogInToSourcegraphAction.kt @@ -5,6 +5,10 @@ import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.PlatformCoreDataKeys import com.intellij.openapi.project.Project import com.intellij.util.ui.JBUI +import com.sourcegraph.cody.agent.protocol.BillingCategory +import com.sourcegraph.cody.agent.protocol.BillingMetadata +import com.sourcegraph.cody.agent.protocol.BillingProduct +import com.sourcegraph.cody.agent.protocol.TelemetryEventParameters import com.sourcegraph.cody.api.SourcegraphApiRequestExecutor import com.sourcegraph.cody.auth.SsoAuthMethod import com.sourcegraph.cody.telemetry.TelemetryV2 @@ -19,7 +23,14 @@ class LogInToSourcegraphAction : BaseAddAccountWithTokenAction() { get() = SourcegraphServerPath.DEFAULT_HOST override fun actionPerformed(e: AnActionEvent) { - e.project?.let { TelemetryV2.sendTelemetryEvent(it, "auth.login", "clicked") } + e.project?.let { + TelemetryV2.sendTelemetryEvent( + it, + "auth.login", + "clicked", + TelemetryEventParameters( + billingMetadata = BillingMetadata(BillingProduct.CODY, BillingCategory.BILLABLE))) + } val accountsHost = getCodyAccountsHost(e) ?: return val authMethod: SsoAuthMethod = @@ -45,7 +56,14 @@ class AddCodyEnterpriseAccountAction : BaseAddAccountWithTokenAction() { get() = "" override fun actionPerformed(e: AnActionEvent) { - e.project?.let { TelemetryV2.sendTelemetryEvent(it, "auth.login", "clicked") } + e.project?.let { + TelemetryV2.sendTelemetryEvent( + it, + "auth.login", + "clicked", + TelemetryEventParameters( + billingMetadata = BillingMetadata(BillingProduct.CODY, BillingCategory.BILLABLE))) + } val accountsHost = getCodyAccountsHost(e) ?: return val dialog = diff --git a/src/main/kotlin/com/sourcegraph/cody/initialization/PostStartupActivity.kt b/src/main/kotlin/com/sourcegraph/cody/initialization/PostStartupActivity.kt index ce1139dfda..2a812c879f 100644 --- a/src/main/kotlin/com/sourcegraph/cody/initialization/PostStartupActivity.kt +++ b/src/main/kotlin/com/sourcegraph/cody/initialization/PostStartupActivity.kt @@ -53,6 +53,6 @@ class PostStartupActivity : ProjectActivity { .connect(disposable) .subscribe(AppTopics.FILE_DOCUMENT_SYNC, CodySettingsChangeListener(project)) - TelemetryV2.sendTelemetryEvent(project, "cody.extension", "started") + TelemetryV2.sendTelemetryEvent(project, "extension", "started") } } diff --git a/src/main/kotlin/com/sourcegraph/cody/listeners/CodyDocumentListener.kt b/src/main/kotlin/com/sourcegraph/cody/listeners/CodyDocumentListener.kt index f1b27263fe..51b65414cf 100644 --- a/src/main/kotlin/com/sourcegraph/cody/listeners/CodyDocumentListener.kt +++ b/src/main/kotlin/com/sourcegraph/cody/listeners/CodyDocumentListener.kt @@ -5,6 +5,9 @@ import com.intellij.openapi.editor.event.BulkAwareDocumentListener import com.intellij.openapi.editor.event.DocumentEvent import com.intellij.openapi.project.Project import com.sourcegraph.cody.agent.CodyAgentService +import com.sourcegraph.cody.agent.protocol.BillingCategory +import com.sourcegraph.cody.agent.protocol.BillingMetadata +import com.sourcegraph.cody.agent.protocol.BillingProduct import com.sourcegraph.cody.agent.protocol.CompletionItemParams import com.sourcegraph.cody.agent.protocol.ProtocolTextDocument import com.sourcegraph.cody.autocomplete.CodyAutocompleteManager @@ -21,7 +24,11 @@ class CodyDocumentListener(val project: Project) : BulkAwareDocumentListener { if (pastedCode.isNotBlank() && CodeEditorFactory.lastCopiedText == pastedCode) { CodeEditorFactory.lastCopiedText = null TelemetryV2.sendCodeGenerationEvent( - project, feature = "keyDown", action = "paste", pastedCode) + project, + feature = "keyDown", + action = "paste", + pastedCode, + billingMetadata = BillingMetadata(BillingProduct.CODY, BillingCategory.CORE)) } } diff --git a/src/main/kotlin/com/sourcegraph/cody/telemetry/TelemetryV2.kt b/src/main/kotlin/com/sourcegraph/cody/telemetry/TelemetryV2.kt index 3c07986e09..5ab06ddbbf 100644 --- a/src/main/kotlin/com/sourcegraph/cody/telemetry/TelemetryV2.kt +++ b/src/main/kotlin/com/sourcegraph/cody/telemetry/TelemetryV2.kt @@ -3,6 +3,7 @@ package com.sourcegraph.cody.telemetry import com.intellij.openapi.application.ApplicationInfo import com.intellij.openapi.project.Project import com.sourcegraph.cody.agent.CodyAgentService +import com.sourcegraph.cody.agent.protocol.BillingMetadata import com.sourcegraph.cody.agent.protocol.TelemetryEvent import com.sourcegraph.cody.agent.protocol.TelemetryEventParameters @@ -46,7 +47,13 @@ class TelemetryV2 { } } - fun sendCodeGenerationEvent(project: Project, feature: String, action: String, code: String) { + fun sendCodeGenerationEvent( + project: Project, + feature: String, + action: String, + code: String, + billingMetadata: BillingMetadata? = null + ) { val op = if (action.startsWith("copy")) "copy" else if (action.startsWith("insert")) "insert" else "save" @@ -61,7 +68,10 @@ class TelemetryV2 { feature = feature, action = action, parameters = - TelemetryEventParameters(metadata = metadata, privateMetadata = privateMetadata)) + TelemetryEventParameters( + metadata = metadata, + privateMetadata = privateMetadata, + billingMetadata = billingMetadata)) } } }