Feature/waterfall view phase1#141
Merged
georgidhristov merged 2 commits intoJul 4, 2026
Merged
Conversation
Collaborator
|
Tested this locally and everything works as expected. The waterfall view renders correctly above the existing outgoing request cards, the bars are positioned properly, and the current server-rendered approach fits well with the existing dashboard architecture. Good phase 1 implementation. Approved and merged. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Waterfall/Timeline View — Phase 1
What
Adds a simple, server-rendered horizontal bar (waterfall) view showing outgoing
HTTP dependency calls positioned and sized proportionally within the parent
request's total duration. This replaces the "flat list only" view with an
at-a-glance visual of which calls ran sequentially/in parallel and which is
the bottleneck.
Why
Today, DebugProbe shows outgoing calls as a flat list (e.g. "Restaurant API
→ 800ms"). This tells you how long each call took, but not when it started
relative to the others, or where time is being lost. A waterfall makes the
bottleneck visible in one glance.
Scope
Phase 1 = simple CSS bars only. No JavaScript, no tooltips, no zoom, no
new dependencies — matches the existing architecture where every dashboard
element (
BuildTraceCard,BuildOutgoingRequestCard, etc.) is server-renderedHTML styled with CSS. Interactive features are intentionally deferred to a
future proposal, pending review of this simpler version.
Files changed
HtmlRenderer.cs— addedBuildWaterfallSection(DebugEntry entry), wiredinto
RenderDetailsPageabove the existing outgoing-request cards (whichare unchanged).
debugprobe.css— added.waterfall-container,.waterfall-row,.wf-label,.wf-track,.wf-bar,.wf-bar--error, plus a mobile clamp.No changes to
DebugProbeMiddleware.cs,DebugProbeHttpClientHandler.cs,DebugEntryStore.cs, or any data-capture code — all required timing datawas already being captured, this is a display-layer-only change.
How it works
left%andwidth%for each outgoing call relative to theparent request's total duration, clamped to 0–100% to avoid edge-case
rendering bugs.
InvariantCulturefor percentage formatting to guarantee dot-decimalCSS values regardless of server locale.
GetDisplayTarget())— no new redaction path introduced.
.wf-bar--errormodifier (red), matching the existingstatus-color convention elsewhere in the dashboard.
OutgoingRequests→ no waterfall section rendered (guard clause).Testing
dotnet test: 61/61 passing, no regressions./Demo/ExecuteExternalRequests(2 sequentialoutgoing calls), confirmed via
/debug/{id}:.waterfall-rowelements renderedFollow-up polish included in this PR
in the file (the collection is never null by contract).
0.0/100.0clamp bounds into named constants, matching theconstpattern already used inRenderIndexPage.{ms}ms→{ms} ms) to matchformatting used everywhere else on the details page.
private method in
HtmlRenderer.cshas one — adding one only here wouldbe inconsistent with the file's convention.