Allow telemetry::event! with no properties (#22190)

CC @josephTLyons

Release Notes:

- N/A
This commit is contained in:
Conrad Irwin 2024-12-18 09:41:47 -07:00 committed by GitHub
parent 433cb99170
commit 77abf13f42
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 54 additions and 78 deletions

1
Cargo.lock generated
View file

@ -4412,6 +4412,7 @@ dependencies = [
"serde", "serde",
"settings", "settings",
"smallvec", "smallvec",
"telemetry",
"theme", "theme",
"ui", "ui",
"util", "util",

View file

@ -30,6 +30,7 @@ semantic_version.workspace = true
serde.workspace = true serde.workspace = true
settings.workspace = true settings.workspace = true
smallvec.workspace = true smallvec.workspace = true
telemetry.workspace = true
theme.workspace = true theme.workspace = true
ui.workspace = true ui.workspace = true
util.workspace = true util.workspace = true

View file

@ -1,6 +1,3 @@
use std::sync::Arc;
use client::telemetry::Telemetry;
use gpui::{AnyElement, Div, StyleRefinement}; use gpui::{AnyElement, Div, StyleRefinement};
use smallvec::SmallVec; use smallvec::SmallVec;
use ui::{prelude::*, ButtonLike}; use ui::{prelude::*, ButtonLike};
@ -8,17 +5,15 @@ use ui::{prelude::*, ButtonLike};
#[derive(IntoElement)] #[derive(IntoElement)]
pub struct FeatureUpsell { pub struct FeatureUpsell {
base: Div, base: Div,
telemetry: Arc<Telemetry>,
text: SharedString, text: SharedString,
docs_url: Option<SharedString>, docs_url: Option<SharedString>,
children: SmallVec<[AnyElement; 2]>, children: SmallVec<[AnyElement; 2]>,
} }
impl FeatureUpsell { impl FeatureUpsell {
pub fn new(telemetry: Arc<Telemetry>, text: impl Into<SharedString>) -> Self { pub fn new(text: impl Into<SharedString>) -> Self {
Self { Self {
base: h_flex(), base: h_flex(),
telemetry,
text: text.into(), text: text.into(),
docs_url: None, docs_url: None,
children: SmallVec::new(), children: SmallVec::new(),
@ -67,12 +62,13 @@ impl RenderOnce for FeatureUpsell {
.child(Icon::new(IconName::ArrowUpRight)), .child(Icon::new(IconName::ArrowUpRight)),
) )
.on_click({ .on_click({
let telemetry = self.telemetry.clone();
let docs_url = docs_url.clone(); let docs_url = docs_url.clone();
move |_event, cx| { move |_event, cx| {
telemetry.report_app_event(format!( telemetry::event!(
"feature upsell: viewed docs ({docs_url})" "Documentation Viewed",
)); source = "Feature Upsell",
url = docs_url,
);
cx.open_url(&docs_url) cx.open_url(&docs_url)
} }
}), }),

View file

@ -7,7 +7,6 @@ use std::sync::OnceLock;
use std::time::Duration; use std::time::Duration;
use std::{ops::Range, sync::Arc}; use std::{ops::Range, sync::Arc};
use client::telemetry::Telemetry;
use client::ExtensionMetadata; use client::ExtensionMetadata;
use collections::{BTreeMap, BTreeSet}; use collections::{BTreeMap, BTreeSet};
use editor::{Editor, EditorElement, EditorStyle}; use editor::{Editor, EditorElement, EditorStyle};
@ -182,7 +181,6 @@ fn keywords_by_feature() -> &'static BTreeMap<Feature, Vec<&'static str>> {
pub struct ExtensionsPage { pub struct ExtensionsPage {
workspace: WeakView<Workspace>, workspace: WeakView<Workspace>,
list: UniformListScrollHandle, list: UniformListScrollHandle,
telemetry: Arc<Telemetry>,
is_fetching_extensions: bool, is_fetching_extensions: bool,
filter: ExtensionFilter, filter: ExtensionFilter,
remote_extension_entries: Vec<ExtensionMetadata>, remote_extension_entries: Vec<ExtensionMetadata>,
@ -221,7 +219,6 @@ impl ExtensionsPage {
let mut this = Self { let mut this = Self {
workspace: workspace.weak_handle(), workspace: workspace.weak_handle(),
list: UniformListScrollHandle::new(), list: UniformListScrollHandle::new(),
telemetry: workspace.client().telemetry().clone(),
is_fetching_extensions: false, is_fetching_extensions: false,
filter: ExtensionFilter::All, filter: ExtensionFilter::All,
dev_extension_entries: Vec::new(), dev_extension_entries: Vec::new(),
@ -704,18 +701,15 @@ impl ExtensionsPage {
match status.clone() { match status.clone() {
ExtensionStatus::NotInstalled => ( ExtensionStatus::NotInstalled => (
Button::new(SharedString::from(extension.id.clone()), "Install").on_click( Button::new(SharedString::from(extension.id.clone()), "Install").on_click({
cx.listener({ let extension_id = extension.id.clone();
let extension_id = extension.id.clone(); move |_, cx| {
move |this, _, cx| { telemetry::event!("Extension Installed");
this.telemetry ExtensionStore::global(cx).update(cx, |store, cx| {
.report_app_event("extensions: install extension".to_string()); store.install_latest_extension(extension_id.clone(), cx)
ExtensionStore::global(cx).update(cx, |store, cx| { });
store.install_latest_extension(extension_id.clone(), cx) }
}); }),
}
}),
),
None, None,
), ),
ExtensionStatus::Installing => ( ExtensionStatus::Installing => (
@ -729,18 +723,15 @@ impl ExtensionsPage {
), ),
), ),
ExtensionStatus::Installed(installed_version) => ( ExtensionStatus::Installed(installed_version) => (
Button::new(SharedString::from(extension.id.clone()), "Uninstall").on_click( Button::new(SharedString::from(extension.id.clone()), "Uninstall").on_click({
cx.listener({ let extension_id = extension.id.clone();
let extension_id = extension.id.clone(); move |_, cx| {
move |this, _, cx| { telemetry::event!("Extension Uninstalled", extension_id);
this.telemetry ExtensionStore::global(cx).update(cx, |store, cx| {
.report_app_event("extensions: uninstall extension".to_string()); store.uninstall_extension(extension_id.clone(), cx)
ExtensionStore::global(cx).update(cx, |store, cx| { });
store.uninstall_extension(extension_id.clone(), cx) }
}); }),
}
}),
),
if installed_version == extension.manifest.version { if installed_version == extension.manifest.version {
None None
} else { } else {
@ -760,13 +751,11 @@ impl ExtensionsPage {
}) })
}) })
.disabled(!is_compatible) .disabled(!is_compatible)
.on_click(cx.listener({ .on_click({
let extension_id = extension.id.clone(); let extension_id = extension.id.clone();
let version = extension.manifest.version.clone(); let version = extension.manifest.version.clone();
move |this, _, cx| { move |_, cx| {
this.telemetry.report_app_event( telemetry::event!("Extension Installed", extension_id, version);
"extensions: install extension".to_string(),
);
ExtensionStore::global(cx).update(cx, |store, cx| { ExtensionStore::global(cx).update(cx, |store, cx| {
store store
.upgrade_extension( .upgrade_extension(
@ -777,7 +766,7 @@ impl ExtensionsPage {
.detach_and_log_err(cx) .detach_and_log_err(cx)
}); });
} }
})), }),
) )
}, },
), ),
@ -972,19 +961,16 @@ impl ExtensionsPage {
let upsells_count = self.upsells.len(); let upsells_count = self.upsells.len();
v_flex().children(self.upsells.iter().enumerate().map(|(ix, feature)| { v_flex().children(self.upsells.iter().enumerate().map(|(ix, feature)| {
let telemetry = self.telemetry.clone();
let upsell = match feature { let upsell = match feature {
Feature::Git => FeatureUpsell::new( Feature::Git => FeatureUpsell::new(
telemetry,
"Zed comes with basic Git support. More Git features are coming in the future.", "Zed comes with basic Git support. More Git features are coming in the future.",
) )
.docs_url("https://zed.dev/docs/git"), .docs_url("https://zed.dev/docs/git"),
Feature::OpenIn => FeatureUpsell::new( Feature::OpenIn => FeatureUpsell::new(
telemetry,
"Zed supports linking to a source line on GitHub and others.", "Zed supports linking to a source line on GitHub and others.",
) )
.docs_url("https://zed.dev/docs/git#git-integrations"), .docs_url("https://zed.dev/docs/git#git-integrations"),
Feature::Vim => FeatureUpsell::new(telemetry, "Vim support is built-in to Zed!") Feature::Vim => FeatureUpsell::new("Vim support is built-in to Zed!")
.docs_url("https://zed.dev/docs/vim") .docs_url("https://zed.dev/docs/vim")
.child(CheckboxWithLabel::new( .child(CheckboxWithLabel::new(
"enable-vim", "enable-vim",
@ -995,8 +981,7 @@ impl ExtensionsPage {
ui::ToggleState::Unselected ui::ToggleState::Unselected
}, },
cx.listener(move |this, selection, cx| { cx.listener(move |this, selection, cx| {
this.telemetry telemetry::event!("Vim Mode Toggled", source = "Feature Upsell");
.report_app_event("feature upsell: toggle vim".to_string());
this.update_settings::<VimModeSetting>( this.update_settings::<VimModeSetting>(
selection, selection,
cx, cx,
@ -1004,36 +989,22 @@ impl ExtensionsPage {
); );
}), }),
)), )),
Feature::LanguageBash => { Feature::LanguageBash => FeatureUpsell::new("Shell support is built-in to Zed!")
FeatureUpsell::new(telemetry, "Shell support is built-in to Zed!") .docs_url("https://zed.dev/docs/languages/bash"),
.docs_url("https://zed.dev/docs/languages/bash") Feature::LanguageC => FeatureUpsell::new("C support is built-in to Zed!")
} .docs_url("https://zed.dev/docs/languages/c"),
Feature::LanguageC => { Feature::LanguageCpp => FeatureUpsell::new("C++ support is built-in to Zed!")
FeatureUpsell::new(telemetry, "C support is built-in to Zed!") .docs_url("https://zed.dev/docs/languages/cpp"),
.docs_url("https://zed.dev/docs/languages/c") Feature::LanguageGo => FeatureUpsell::new("Go support is built-in to Zed!")
} .docs_url("https://zed.dev/docs/languages/go"),
Feature::LanguageCpp => { Feature::LanguagePython => FeatureUpsell::new("Python support is built-in to Zed!")
FeatureUpsell::new(telemetry, "C++ support is built-in to Zed!") .docs_url("https://zed.dev/docs/languages/python"),
.docs_url("https://zed.dev/docs/languages/cpp") Feature::LanguageReact => FeatureUpsell::new("React support is built-in to Zed!")
} .docs_url("https://zed.dev/docs/languages/typescript"),
Feature::LanguageGo => { Feature::LanguageRust => FeatureUpsell::new("Rust support is built-in to Zed!")
FeatureUpsell::new(telemetry, "Go support is built-in to Zed!") .docs_url("https://zed.dev/docs/languages/rust"),
.docs_url("https://zed.dev/docs/languages/go")
}
Feature::LanguagePython => {
FeatureUpsell::new(telemetry, "Python support is built-in to Zed!")
.docs_url("https://zed.dev/docs/languages/python")
}
Feature::LanguageReact => {
FeatureUpsell::new(telemetry, "React support is built-in to Zed!")
.docs_url("https://zed.dev/docs/languages/typescript")
}
Feature::LanguageRust => {
FeatureUpsell::new(telemetry, "Rust support is built-in to Zed!")
.docs_url("https://zed.dev/docs/languages/rust")
}
Feature::LanguageTypescript => { Feature::LanguageTypescript => {
FeatureUpsell::new(telemetry, "Typescript support is built-in to Zed!") FeatureUpsell::new("Typescript support is built-in to Zed!")
.docs_url("https://zed.dev/docs/languages/typescript") .docs_url("https://zed.dev/docs/languages/typescript")
} }
}; };

View file

@ -17,6 +17,13 @@ pub use telemetry_events::FlexibleEvent as Event;
/// ``` /// ```
#[macro_export] #[macro_export]
macro_rules! event { macro_rules! event {
($name:expr) => {{
let event = $crate::Event {
event_type: $name.to_string(),
event_properties: std::collections::HashMap::new(),
};
$crate::send_event(event);
}};
($name:expr, $($key:ident $(= $value:expr)?),+ $(,)?) => {{ ($name:expr, $($key:ident $(= $value:expr)?),+ $(,)?) => {{
let event = $crate::Event { let event = $crate::Event {
event_type: $name.to_string(), event_type: $name.to_string(),