Add support for manual spans, expand instrumentation (#44663)

Release Notes:

- N/A

---------

Co-authored-by: Cameron <cameron@zed.dev>
This commit is contained in:
Yara 🏳️‍⚧️
2025-12-11 22:29:47 +00:00
committed by GitHub
co-authored by Cameron
parent 07748b7bae
commit 1029a8fbaf
13 changed files with 118 additions and 5 deletions
Generated
+3
View File
@@ -14445,12 +14445,14 @@ dependencies = [
"settings",
"smol",
"theme",
"tracing",
"ui",
"unindent",
"util",
"util_macros",
"workspace",
"zed_actions",
"ztracing",
]
[[package]]
@@ -21022,6 +21024,7 @@ dependencies = [
"tracing",
"tracing-subscriber",
"tracing-tracy",
"zlog",
"ztracing_macro",
]
+42
View File
@@ -56,6 +56,7 @@ use sum_tree::{Bias, TreeMap};
use text::{BufferId, LineIndent};
use ui::{SharedString, px};
use unicode_segmentation::UnicodeSegmentation;
use ztracing::instrument;
use std::{
any::TypeId,
@@ -168,6 +169,7 @@ impl DisplayMap {
}
}
#[instrument(skip_all)]
pub fn snapshot(&mut self, cx: &mut Context<Self>) -> DisplaySnapshot {
let tab_size = Self::tab_size(&self.buffer, cx);
@@ -195,6 +197,7 @@ impl DisplayMap {
}
}
#[instrument(skip_all)]
pub fn set_state(&mut self, other: &DisplaySnapshot, cx: &mut Context<Self>) {
self.fold(
other
@@ -211,6 +214,7 @@ impl DisplayMap {
}
/// Creates folds for the given creases.
#[instrument(skip_all)]
pub fn fold<T: Clone + ToOffset>(&mut self, creases: Vec<Crease<T>>, cx: &mut Context<Self>) {
let buffer_snapshot = self.buffer.read(cx).snapshot(cx);
let edits = self.buffer_subscription.consume().into_inner();
@@ -279,6 +283,7 @@ impl DisplayMap {
}
/// Removes any folds with the given ranges.
#[instrument(skip_all)]
pub fn remove_folds_with_type<T: ToOffset>(
&mut self,
ranges: impl IntoIterator<Item = Range<T>>,
@@ -304,6 +309,7 @@ impl DisplayMap {
}
/// Removes any folds whose ranges intersect any of the given ranges.
#[instrument(skip_all)]
pub fn unfold_intersecting<T: ToOffset>(
&mut self,
ranges: impl IntoIterator<Item = Range<T>>,
@@ -335,6 +341,7 @@ impl DisplayMap {
block_map.remove_intersecting_replace_blocks(offset_ranges, inclusive);
}
#[instrument(skip_all)]
pub fn disable_header_for_buffer(&mut self, buffer_id: BufferId, cx: &mut Context<Self>) {
let snapshot = self.buffer.read(cx).snapshot(cx);
let edits = self.buffer_subscription.consume().into_inner();
@@ -349,6 +356,7 @@ impl DisplayMap {
block_map.disable_header_for_buffer(buffer_id)
}
#[instrument(skip_all)]
pub fn fold_buffers(
&mut self,
buffer_ids: impl IntoIterator<Item = language::BufferId>,
@@ -367,6 +375,7 @@ impl DisplayMap {
block_map.fold_buffers(buffer_ids, self.buffer.read(cx), cx)
}
#[instrument(skip_all)]
pub fn unfold_buffers(
&mut self,
buffer_ids: impl IntoIterator<Item = language::BufferId>,
@@ -385,14 +394,17 @@ impl DisplayMap {
block_map.unfold_buffers(buffer_ids, self.buffer.read(cx), cx)
}
#[instrument(skip_all)]
pub(crate) fn is_buffer_folded(&self, buffer_id: language::BufferId) -> bool {
self.block_map.folded_buffers.contains(&buffer_id)
}
#[instrument(skip_all)]
pub(crate) fn folded_buffers(&self) -> &HashSet<BufferId> {
&self.block_map.folded_buffers
}
#[instrument(skip_all)]
pub fn insert_creases(
&mut self,
creases: impl IntoIterator<Item = Crease<Anchor>>,
@@ -402,6 +414,7 @@ impl DisplayMap {
self.crease_map.insert(creases, &snapshot)
}
#[instrument(skip_all)]
pub fn remove_creases(
&mut self,
crease_ids: impl IntoIterator<Item = CreaseId>,
@@ -411,6 +424,7 @@ impl DisplayMap {
self.crease_map.remove(crease_ids, &snapshot)
}
#[instrument(skip_all)]
pub fn insert_blocks(
&mut self,
blocks: impl IntoIterator<Item = BlockProperties<Anchor>>,
@@ -429,6 +443,7 @@ impl DisplayMap {
block_map.insert(blocks)
}
#[instrument(skip_all)]
pub fn resize_blocks(&mut self, heights: HashMap<CustomBlockId, u32>, cx: &mut Context<Self>) {
let snapshot = self.buffer.read(cx).snapshot(cx);
let edits = self.buffer_subscription.consume().into_inner();
@@ -443,10 +458,12 @@ impl DisplayMap {
block_map.resize(heights);
}
#[instrument(skip_all)]
pub fn replace_blocks(&mut self, renderers: HashMap<CustomBlockId, RenderBlock>) {
self.block_map.replace_blocks(renderers);
}
#[instrument(skip_all)]
pub fn remove_blocks(&mut self, ids: HashSet<CustomBlockId>, cx: &mut Context<Self>) {
let snapshot = self.buffer.read(cx).snapshot(cx);
let edits = self.buffer_subscription.consume().into_inner();
@@ -461,6 +478,7 @@ impl DisplayMap {
block_map.remove(ids);
}
#[instrument(skip_all)]
pub fn row_for_block(
&mut self,
block_id: CustomBlockId,
@@ -480,6 +498,7 @@ impl DisplayMap {
Some(DisplayRow(block_row.0))
}
#[instrument(skip_all)]
pub fn highlight_text(
&mut self,
key: HighlightKey,
@@ -507,6 +526,7 @@ impl DisplayMap {
self.text_highlights.insert(key, to_insert);
}
#[instrument(skip_all)]
pub(crate) fn highlight_inlays(
&mut self,
type_id: TypeId,
@@ -526,6 +546,7 @@ impl DisplayMap {
}
}
#[instrument(skip_all)]
pub fn text_highlights(&self, type_id: TypeId) -> Option<(HighlightStyle, &[Range<Anchor>])> {
let highlights = self.text_highlights.get(&HighlightKey::Type(type_id))?;
Some((highlights.0, &highlights.1))
@@ -538,6 +559,7 @@ impl DisplayMap {
self.text_highlights.values()
}
#[instrument(skip_all)]
pub fn clear_highlights(&mut self, type_id: TypeId) -> bool {
let mut cleared = self
.text_highlights
@@ -566,6 +588,7 @@ impl DisplayMap {
.update(cx, |map, cx| map.set_wrap_width(width, cx))
}
#[instrument(skip_all)]
pub fn update_fold_widths(
&mut self,
widths: impl IntoIterator<Item = (ChunkRendererId, Pixels)>,
@@ -597,6 +620,7 @@ impl DisplayMap {
self.inlay_map.current_inlays()
}
#[instrument(skip_all)]
pub(crate) fn splice_inlays(
&mut self,
to_remove: &[InlayId],
@@ -626,6 +650,7 @@ impl DisplayMap {
self.block_map.read(snapshot, edits);
}
#[instrument(skip_all)]
fn tab_size(buffer: &Entity<MultiBuffer>, cx: &App) -> NonZeroU32 {
let buffer = buffer.read(cx).as_singleton().map(|buffer| buffer.read(cx));
let language = buffer
@@ -675,6 +700,7 @@ pub struct HighlightedChunk<'a> {
}
impl<'a> HighlightedChunk<'a> {
#[instrument(skip_all)]
fn highlight_invisibles(
self,
editor_style: &'a EditorStyle,
@@ -832,6 +858,7 @@ impl DisplaySnapshot {
self.buffer_snapshot().widest_line_number()
}
#[instrument(skip_all)]
pub fn prev_line_boundary(&self, mut point: MultiBufferPoint) -> (Point, DisplayPoint) {
loop {
let mut inlay_point = self.inlay_snapshot().to_inlay_point(point);
@@ -850,6 +877,7 @@ impl DisplaySnapshot {
}
}
#[instrument(skip_all)]
pub fn next_line_boundary(
&self,
mut point: MultiBufferPoint,
@@ -888,6 +916,7 @@ impl DisplaySnapshot {
new_start..new_end
}
#[instrument(skip_all)]
pub fn point_to_display_point(&self, point: MultiBufferPoint, bias: Bias) -> DisplayPoint {
let inlay_point = self.inlay_snapshot().to_inlay_point(point);
let fold_point = self.fold_snapshot().to_fold_point(inlay_point, bias);
@@ -917,6 +946,7 @@ impl DisplaySnapshot {
.anchor_at(point.to_offset(self, bias), bias)
}
#[instrument(skip_all)]
fn display_point_to_inlay_point(&self, point: DisplayPoint, bias: Bias) -> InlayPoint {
let block_point = point.0;
let wrap_point = self.block_snapshot.to_wrap_point(block_point, bias);
@@ -928,6 +958,7 @@ impl DisplaySnapshot {
fold_point.to_inlay_point(self.fold_snapshot())
}
#[instrument(skip_all)]
pub fn display_point_to_fold_point(&self, point: DisplayPoint, bias: Bias) -> FoldPoint {
let block_point = point.0;
let wrap_point = self.block_snapshot.to_wrap_point(block_point, bias);
@@ -937,6 +968,7 @@ impl DisplaySnapshot {
.0
}
#[instrument(skip_all)]
pub fn fold_point_to_display_point(&self, fold_point: FoldPoint) -> DisplayPoint {
let tab_point = self.tab_snapshot().fold_point_to_tab_point(fold_point);
let wrap_point = self.wrap_snapshot().tab_point_to_wrap_point(tab_point);
@@ -949,6 +981,7 @@ impl DisplaySnapshot {
}
/// Returns text chunks starting at the given display row until the end of the file
#[instrument(skip_all)]
pub fn text_chunks(&self, display_row: DisplayRow) -> impl Iterator<Item = &str> {
self.block_snapshot
.chunks(
@@ -961,6 +994,7 @@ impl DisplaySnapshot {
}
/// Returns text chunks starting at the end of the given display row in reverse until the start of the file
#[instrument(skip_all)]
pub fn reverse_text_chunks(&self, display_row: DisplayRow) -> impl Iterator<Item = &str> {
(0..=display_row.0).rev().flat_map(move |row| {
self.block_snapshot
@@ -977,6 +1011,7 @@ impl DisplaySnapshot {
})
}
#[instrument(skip_all)]
pub fn chunks(
&self,
display_rows: Range<DisplayRow>,
@@ -995,6 +1030,7 @@ impl DisplaySnapshot {
)
}
#[instrument(skip_all)]
pub fn highlighted_chunks<'a>(
&'a self,
display_rows: Range<DisplayRow>,
@@ -1071,6 +1107,7 @@ impl DisplaySnapshot {
})
}
#[instrument(skip_all)]
pub fn layout_row(
&self,
display_row: DisplayRow,
@@ -1132,6 +1169,7 @@ impl DisplaySnapshot {
layout_line.closest_index_for_x(x) as u32
}
#[instrument(skip_all)]
pub fn grapheme_at(&self, mut point: DisplayPoint) -> Option<SharedString> {
point = DisplayPoint(self.block_snapshot.clip_point(point.0, Bias::Left));
let chars = self
@@ -1321,6 +1359,7 @@ impl DisplaySnapshot {
.unwrap_or(false)
}
#[instrument(skip_all)]
pub fn crease_for_buffer_row(&self, buffer_row: MultiBufferRow) -> Option<Crease<Point>> {
let start =
MultiBufferPoint::new(buffer_row.0, self.buffer_snapshot().line_len(buffer_row));
@@ -1407,6 +1446,7 @@ impl DisplaySnapshot {
}
#[cfg(any(test, feature = "test-support"))]
#[instrument(skip_all)]
pub fn text_highlight_ranges<Tag: ?Sized + 'static>(
&self,
) -> Option<Arc<(HighlightStyle, Vec<Range<Anchor>>)>> {
@@ -1417,6 +1457,7 @@ impl DisplaySnapshot {
}
#[cfg(any(test, feature = "test-support"))]
#[instrument(skip_all)]
pub fn all_text_highlight_ranges<Tag: ?Sized + 'static>(
&self,
) -> Vec<(gpui::Hsla, Range<Point>)> {
@@ -1466,6 +1507,7 @@ impl DisplaySnapshot {
///
/// This moves by buffer rows instead of display rows, a distinction that is
/// important when soft wrapping is enabled.
#[instrument(skip_all)]
pub fn start_of_relative_buffer_row(&self, point: DisplayPoint, times: isize) -> DisplayPoint {
let start = self.display_point_to_fold_point(point, Bias::Left);
let target = start.row() as isize + times;
+11 -1
View File
@@ -529,7 +529,7 @@ impl BlockMap {
BlockMapWriter(self)
}
#[ztracing::instrument(skip_all, fields(edits))]
#[ztracing::instrument(skip_all, fields(edits = ?edits))]
fn sync(&self, wrap_snapshot: &WrapSnapshot, mut edits: WrapPatch) {
let _timer = zlog::time!("BlockMap::sync").warn_if_gt(std::time::Duration::from_millis(50));
@@ -570,6 +570,9 @@ impl BlockMap {
let mut wrap_point_cursor = wrap_snapshot.wrap_point_cursor();
while let Some(edit) = edits.next() {
let span = ztracing::debug_span!("while edits", edit = ?edit);
let _enter = span.enter();
let mut old_start = edit.old.start;
let mut new_start = edit.new.start;
@@ -628,6 +631,8 @@ impl BlockMap {
let mut old_end = edit.old.end;
let mut new_end = edit.new.end;
loop {
let span = ztracing::debug_span!("decide where edit ends loop");
let _enter = span.enter();
// Seek to the transform starting at or after the end of the edit
cursor.seek(&old_end, Bias::Left);
cursor.next();
@@ -736,6 +741,10 @@ impl BlockMap {
// and then insert the block itself.
let mut just_processed_folded_buffer = false;
for (block_placement, block) in blocks_in_edit.drain(..) {
let span =
ztracing::debug_span!("for block in edits", block_height = block.height());
let _enter = span.enter();
let mut summary = TransformSummary {
input_rows: WrapRow(0),
output_rows: BlockRow(block.height()),
@@ -957,6 +966,7 @@ impl BlockMap {
}
}
#[ztracing::instrument(skip(tree, wrap_snapshot))]
fn push_isomorphic(tree: &mut SumTree<Transform>, rows: RowDelta, wrap_snapshot: &WrapSnapshot) {
if rows == RowDelta(0) {
return;
+5 -1
View File
@@ -840,7 +840,7 @@ impl WrapSnapshot {
self.tab_point_to_wrap_point(self.tab_snapshot.clip_point(self.to_tab_point(point), bias))
}
#[ztracing::instrument(skip_all, fields(point, ret))]
#[ztracing::instrument(skip_all, fields(point=?point, ret))]
pub fn prev_row_boundary(&self, mut point: WrapPoint) -> WrapRow {
if self.transforms.is_empty() {
return WrapRow(0);
@@ -851,11 +851,14 @@ impl WrapSnapshot {
let mut cursor = self
.transforms
.cursor::<Dimensions<WrapPoint, TabPoint>>(());
// start
cursor.seek(&point, Bias::Right);
// end
if cursor.item().is_none() {
cursor.prev();
}
// start
while let Some(transform) = cursor.item() {
if transform.is_isomorphic() && cursor.start().1.column() == 0 {
return cmp::min(cursor.end().0.row(), point.row());
@@ -863,6 +866,7 @@ impl WrapSnapshot {
cursor.prev();
}
}
// end
unreachable!()
}
+2
View File
@@ -7135,6 +7135,7 @@ impl Editor {
Some((query, selection_anchor_range))
}
#[ztracing::instrument(skip_all)]
fn update_selection_occurrence_highlights(
&mut self,
query_text: String,
@@ -7279,6 +7280,7 @@ impl Editor {
});
}
#[ztracing::instrument(skip_all)]
fn refresh_selected_text_highlights(
&mut self,
on_buffer_edit: bool,
@@ -7,6 +7,7 @@ use theme::ActiveTheme;
enum MatchingBracketHighlight {}
impl Editor {
#[ztracing::instrument(skip_all)]
pub fn refresh_matching_bracket_highlights(
&mut self,
window: &Window,
+3
View File
@@ -111,6 +111,7 @@ fn excerpt_for_buffer_updated(
);
}
#[ztracing::instrument(skip_all)]
fn buffer_added(editor: &mut Editor, buffer: Entity<Buffer>, cx: &mut Context<Editor>) {
let Some(project) = editor.project() else {
return;
@@ -166,6 +167,7 @@ fn buffers_removed(editor: &mut Editor, removed_buffer_ids: &[BufferId], cx: &mu
editor.remove_blocks(removed_block_ids, None, cx);
}
#[ztracing::instrument(skip_all)]
fn conflicts_updated(
editor: &mut Editor,
conflict_set: Entity<ConflictSet>,
@@ -311,6 +313,7 @@ fn conflicts_updated(
}
}
#[ztracing::instrument(skip_all)]
fn update_conflict_highlighting(
editor: &mut Editor,
conflict: &ConflictRegion,
+4
View File
@@ -1202,6 +1202,7 @@ impl MultiBuffer {
}
/// Returns an up-to-date snapshot of the MultiBuffer.
#[ztracing::instrument(skip_all)]
pub fn snapshot(&self, cx: &App) -> MultiBufferSnapshot {
self.sync(cx);
self.snapshot.borrow().clone()
@@ -1927,6 +1928,7 @@ impl MultiBuffer {
cx.notify();
}
#[ztracing::instrument(skip_all)]
pub fn excerpts_for_buffer(
&self,
buffer_id: BufferId,
@@ -2887,6 +2889,7 @@ impl MultiBuffer {
cx.notify();
}
#[ztracing::instrument(skip_all)]
fn sync(&self, cx: &App) {
let changed = self.buffer_changed_since_sync.replace(false);
if !changed {
@@ -5627,6 +5630,7 @@ impl MultiBufferSnapshot {
/// excerpt
///
/// Can optionally pass a range_filter to filter the ranges of brackets to consider
#[ztracing::instrument(skip_all)]
pub fn innermost_enclosing_bracket_ranges<T: ToOffset>(
&self,
range: Range<T>,
+6
View File
@@ -43,6 +43,8 @@ util_macros.workspace = true
workspace.workspace = true
zed_actions.workspace = true
itertools.workspace = true
ztracing.workspace = true
tracing.workspace = true
[dev-dependencies]
client = { workspace = true, features = ["test-support"] }
@@ -53,3 +55,7 @@ lsp.workspace = true
pretty_assertions.workspace = true
unindent.workspace = true
workspace = { workspace = true, features = ["test-support"] }
[package.metadata.cargo-machete]
ignored = ["tracing"]
+1
View File
@@ -1545,6 +1545,7 @@ impl ProjectSearchView {
}
}
#[ztracing::instrument(skip_all)]
fn highlight_matches(
&self,
match_ranges: &[Range<Anchor>],
+2 -2
View File
@@ -166,8 +166,6 @@ fn fail_to_open_window(e: anyhow::Error, _cx: &mut App) {
pub static STARTUP_TIME: OnceLock<Instant> = OnceLock::new();
pub fn main() {
ztracing::init();
STARTUP_TIME.get_or_init(|| Instant::now());
#[cfg(unix)]
@@ -242,6 +240,7 @@ pub fn main() {
}
zlog::init();
if stdout_is_a_pty() {
zlog::init_output_stdout();
} else {
@@ -251,6 +250,7 @@ pub fn main() {
zlog::init_output_stdout();
};
}
ztracing::init();
let version = option_env!("ZED_BUILD_ID");
let app_commit_sha =
+1
View File
@@ -12,6 +12,7 @@ workspace = true
tracy = ["tracing-tracy"]
[dependencies]
zlog.workspace = true
tracing.workspace = true
tracing-subscriber = "0.3.22"
+37 -1
View File
@@ -1,10 +1,46 @@
pub use tracing::Level;
#[cfg(ztracing)]
pub use tracing::instrument;
pub use tracing::{
debug_span, error_span, event, info_span, instrument, span, trace_span, warn_span,
};
#[cfg(not(ztracing))]
pub use ztracing_macro::instrument;
#[cfg(not(ztracing))]
pub use __consume_all_tokens as trace_span;
#[cfg(not(ztracing))]
pub use __consume_all_tokens as info_span;
#[cfg(not(ztracing))]
pub use __consume_all_tokens as debug_span;
#[cfg(not(ztracing))]
pub use __consume_all_tokens as warn_span;
#[cfg(not(ztracing))]
pub use __consume_all_tokens as error_span;
#[cfg(not(ztracing))]
pub use __consume_all_tokens as event;
#[cfg(not(ztracing))]
pub use __consume_all_tokens as span;
#[cfg(not(ztracing))]
#[macro_export]
macro_rules! __consume_all_tokens {
($($t:tt)*) => {
$crate::FakeSpan
};
}
pub struct FakeSpan;
impl FakeSpan {
pub fn enter(&self) {}
}
// #[cfg(not(ztracing))]
// pub use span;
#[cfg(ztracing)]
pub fn init() {
zlog::info!("Starting tracy subscriber, you can now connect the profiler");
use tracing_subscriber::prelude::*;
tracing::subscriber::set_global_default(
tracing_subscriber::registry().with(tracing_tracy::TracyLayer::default()),