From c9a3bf8e429017895804e83da8bd5ea402107f70 Mon Sep 17 00:00:00 2001 From: Andre Dietisheim Date: Fri, 6 Jun 2025 18:05:55 +0200 Subject: [PATCH] feat: send telemetry when hint in editor was clicked (#869) Signed-off-by: Andre Dietisheim --- .../editor/ResourceEditorFactory.kt | 2 +- .../inlay/base64/Base64Presentations.kt | 24 ++++++++++++------- .../editor/inlay/base64/Base64ValueAdapter.kt | 2 +- .../inlay/selector/SelectorPresentations.kt | 7 ++++++ .../kubernetes/telemetry/TelemetryService.kt | 2 ++ 5 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/ResourceEditorFactory.kt b/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/ResourceEditorFactory.kt index 0db24b34c..f27fe88ab 100644 --- a/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/ResourceEditorFactory.kt +++ b/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/ResourceEditorFactory.kt @@ -137,7 +137,7 @@ open class ResourceEditorFactory protected constructor( private fun createTelemetry(file: VirtualFile): TelemetryMessageBuilder.ActionMessage { val isLocalFile = ResourceFile.isResourceFile(file) return getTelemetryMessageBuilder().action( - "${TelemetryService.NAME_PREFIX_EDITOR} open ${ + "${TelemetryService.NAME_PREFIX_EDITOR}open ${ if (isLocalFile) { "cluster file" } else { diff --git a/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/inlay/base64/Base64Presentations.kt b/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/inlay/base64/Base64Presentations.kt index 5fada9b16..f581944b1 100644 --- a/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/inlay/base64/Base64Presentations.kt +++ b/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/inlay/base64/Base64Presentations.kt @@ -20,12 +20,13 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement import com.redhat.devtools.intellij.common.validation.KubernetesTypeInfo import com.redhat.devtools.intellij.kubernetes.balloon.StringInputBalloon -import com.redhat.devtools.intellij.kubernetes.editor.inlay.base64.Base64Presentations.InlayPresentationsFactory import com.redhat.devtools.intellij.kubernetes.editor.inlay.base64.Base64Presentations.create import com.redhat.devtools.intellij.kubernetes.editor.util.getBinaryData import com.redhat.devtools.intellij.kubernetes.editor.util.getDataValue +import com.redhat.devtools.intellij.kubernetes.editor.util.getKey import com.redhat.devtools.intellij.kubernetes.editor.util.isKubernetesResource import com.redhat.devtools.intellij.kubernetes.model.util.trimWithEllipsis +import com.redhat.devtools.intellij.kubernetes.telemetry.TelemetryService import org.jetbrains.concurrency.runAsync import java.awt.event.MouseEvent @@ -97,12 +98,7 @@ object Base64Presentations { override fun create(adapter: Base64ValueAdapter): InlayPresentation? { val decoded = adapter.getDecoded() ?: return null val offset = adapter.getStartOffset() ?: return null - val onClick = StringInputBalloon( - decoded, - onValidValue(adapter::set, editor.project), - editor - )::show - val presentation = create(decoded, onClick, factory) ?: return null + val presentation = create(decoded, { event -> onClick(adapter.element, decoded, adapter, event) }, factory) ?: return null sink.addInlineElement(offset, false, presentation, false) return presentation } @@ -120,6 +116,19 @@ object Base64Presentations { ) } + private fun onClick(element: PsiElement, decoded: String, adapter: Base64ValueAdapter, event: MouseEvent) { + runAsync { + TelemetryService.instance.action("${TelemetryService.NAME_PREFIX_EDITOR_HINT}base64Hint") + .property(TelemetryService.PROP_PROPERTY_NAME, element.getKey()?.text) + .send() + } + StringInputBalloon( + decoded, + onValidValue(adapter::set, editor.project), + editor + ).show(event) + } + private fun onValidValue(setter: (value: String, wrapAt: Int) -> Unit, project: Project?) : (value: String) -> Unit { return { value -> @@ -130,7 +139,6 @@ object Base64Presentations { } } } - } class BinaryPresentationsFactory(element: PsiElement, sink: InlayHintsSink, editor: Editor, factory: PresentationFactory) diff --git a/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/inlay/base64/Base64ValueAdapter.kt b/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/inlay/base64/Base64ValueAdapter.kt index fdb6e160c..13001cffe 100644 --- a/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/inlay/base64/Base64ValueAdapter.kt +++ b/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/inlay/base64/Base64ValueAdapter.kt @@ -19,7 +19,7 @@ import com.redhat.devtools.intellij.kubernetes.editor.util.getValue import com.redhat.devtools.intellij.kubernetes.editor.util.setValue import org.jetbrains.yaml.psi.YAMLKeyValue -class Base64ValueAdapter(private val element: PsiElement) { +class Base64ValueAdapter(val element: PsiElement) { private companion object { private val CONTENT_REGEX = Regex("[^\"\n |]*", RegexOption.MULTILINE) diff --git a/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/inlay/selector/SelectorPresentations.kt b/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/inlay/selector/SelectorPresentations.kt index ef2b6abe2..77a8ca82b 100644 --- a/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/inlay/selector/SelectorPresentations.kt +++ b/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/editor/inlay/selector/SelectorPresentations.kt @@ -23,8 +23,10 @@ import com.redhat.devtools.intellij.kubernetes.editor.util.getLabels import com.redhat.devtools.intellij.kubernetes.editor.util.getSelector import com.redhat.devtools.intellij.kubernetes.editor.util.getTemplate import com.redhat.devtools.intellij.kubernetes.editor.util.hasTemplate +import com.redhat.devtools.intellij.kubernetes.telemetry.TelemetryService import com.redhat.devtools.intellij.kubernetes.usage.LabelsFilter import com.redhat.devtools.intellij.kubernetes.usage.SelectorsFilter +import org.jetbrains.concurrency.runAsync import java.awt.Point import java.awt.event.MouseEvent import javax.swing.Icon @@ -156,6 +158,11 @@ object SelectorPresentations { return { event, point -> val project = editor.project if (project != null) { + runAsync { + TelemetryService.instance.action("${TelemetryService.NAME_PREFIX_EDITOR_HINT}selector") + .property(TelemetryService.PROP_PROPERTY_NAME, hintedKeyValue.getKey()?.text) + .send() + } ShowUsagesAction.startFindUsages(hintedKeyValue, RelativePoint(event), editor) } } diff --git a/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/telemetry/TelemetryService.kt b/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/telemetry/TelemetryService.kt index a91cb587a..6d2eafa0a 100644 --- a/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/telemetry/TelemetryService.kt +++ b/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/telemetry/TelemetryService.kt @@ -23,6 +23,7 @@ import io.fabric8.kubernetes.api.model.HasMetadata object TelemetryService { const val NAME_PREFIX_EDITOR = "editor-" + const val NAME_PREFIX_EDITOR_HINT = "${NAME_PREFIX_EDITOR}hint_clicked-" const val NAME_PREFIX_NAMESPACE = "current_namespace-" const val NAME_PREFIX_CONTEXT = "current_context-" @@ -30,6 +31,7 @@ object TelemetryService { const val PROP_IS_OPENSHIFT = "is_openshift" const val PROP_KUBERNETES_VERSION = "kubernetes_version" const val PROP_OPENSHIFT_VERSION = "openshift_version" + const val PROP_PROPERTY_NAME = "property_name" val instance: TelemetryMessageBuilder by lazy { return@lazy if (!ApplicationManager.getApplication().isUnitTestMode) {