Follows on from https://github.com/zed-industries/zed/pull/37716#pullrequestreview-3195695110 by @SomeoneToIgnore After this the doctests will be run in CI to check that the examples are still accurate. Note that doctests aren't run by Nextest: you can run them locally with `cargo test --doc`. Summary: * Run tests from CI * Loosen an exact float comparison to match approximately (otherwise it fails) * Fixed one actual bug in the tests for `dilate` where the test code assumed that `dilate` mutates `self` rather than returning a new object * Add some `must_use` on some functions that seemed at risk of similar bugs, following the Rust stdlib style to add it where ignoring the result is almost certainly a bug. * Fix some cases where the doc examples seem to have gone out of date with the code * Add imports to doctests that need them * Add some dev-dependencies to make the tests build * Fix the `key_dispatch` module docstring, which was accidentally attached to objects within that module * Skip some doctest examples that seem like they need an async environment or that just looked hard to get running AI usage: I asked Claude to do some of the repetitive tests. I checked the output and fixed up some things that seemed to not be in the right spirit of the test, or too longwinded. I think we could reasonably run the tests on only Linux to save CI CPU-seconds and latency, but I haven't done that yet, partly because of how it's implemented in the action. Release Notes: - N/A
67 lines
2.0 KiB
Rust
67 lines
2.0 KiB
Rust
//! See [Telemetry in Zed](https://zed.dev/docs/telemetry) for additional information.
|
|
use futures::channel::mpsc;
|
|
pub use serde_json;
|
|
use std::sync::OnceLock;
|
|
pub use telemetry_events::FlexibleEvent as Event;
|
|
|
|
/// Macro to create telemetry events and send them to the telemetry queue.
|
|
///
|
|
/// By convention, the name should be "Noun Verbed", e.g. "Keymap Changed"
|
|
/// or "Project Diagnostics Opened".
|
|
///
|
|
/// The properties can be any value that implements serde::Serialize.
|
|
///
|
|
/// ```
|
|
/// # let url = "https://example.com";
|
|
/// telemetry::event!("Keymap Changed", version = "1.0.0");
|
|
/// telemetry::event!("Documentation Viewed", url, source = "Extension Upsell");
|
|
/// ```
|
|
///
|
|
/// If you want to debug logging in development, export `RUST_LOG=telemetry=trace`
|
|
#[macro_export]
|
|
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)?),+ $(,)?) => {{
|
|
let event = $crate::Event {
|
|
event_type: $name.to_string(),
|
|
event_properties: std::collections::HashMap::from([
|
|
$(
|
|
(stringify!($key).to_string(),
|
|
$crate::serde_json::value::to_value(&$crate::serialize_property!($key $(= $value)?))
|
|
.unwrap_or_else(|_| $crate::serde_json::to_value(&()).unwrap())
|
|
),
|
|
)+
|
|
]),
|
|
};
|
|
$crate::send_event(event);
|
|
}};
|
|
}
|
|
|
|
#[macro_export]
|
|
macro_rules! serialize_property {
|
|
($key:ident) => {
|
|
$key
|
|
};
|
|
($key:ident = $value:expr) => {
|
|
$value
|
|
};
|
|
}
|
|
|
|
pub fn send_event(event: Event) {
|
|
if let Some(queue) = TELEMETRY_QUEUE.get() {
|
|
queue.unbounded_send(event).ok();
|
|
}
|
|
}
|
|
|
|
pub fn init(tx: mpsc::UnboundedSender<Event>) {
|
|
TELEMETRY_QUEUE.set(tx).ok();
|
|
}
|
|
|
|
static TELEMETRY_QUEUE: OnceLock<mpsc::UnboundedSender<Event>> = OnceLock::new();
|