Allow telemetry::event! with no properties (#22190)
CC @josephTLyons Release Notes: - N/A
This commit is contained in:
parent
433cb99170
commit
77abf13f42
5 changed files with 54 additions and 78 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -4412,6 +4412,7 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
"settings",
|
"settings",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
|
"telemetry",
|
||||||
"theme",
|
"theme",
|
||||||
"ui",
|
"ui",
|
||||||
"util",
|
"util",
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -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 |this, _, cx| {
|
move |_, cx| {
|
||||||
this.telemetry
|
telemetry::event!("Extension Installed");
|
||||||
.report_app_event("extensions: install extension".to_string());
|
|
||||||
ExtensionStore::global(cx).update(cx, |store, cx| {
|
ExtensionStore::global(cx).update(cx, |store, cx| {
|
||||||
store.install_latest_extension(extension_id.clone(), 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 |this, _, cx| {
|
move |_, cx| {
|
||||||
this.telemetry
|
telemetry::event!("Extension Uninstalled", extension_id);
|
||||||
.report_app_event("extensions: uninstall extension".to_string());
|
|
||||||
ExtensionStore::global(cx).update(cx, |store, cx| {
|
ExtensionStore::global(cx).update(cx, |store, cx| {
|
||||||
store.uninstall_extension(extension_id.clone(), 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")
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue