Add event timeline histogram with zoom, scope lens, and group-by#650
Merged
Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
Adds a timeline histogram feature to the log table view, including rendering/interaction (zoom/pan/scope), persisted visibility, group-by dimensions, and “Find hit” markers driven by the Find subsystem.
Changes:
- Introduces a new
HistogramPaneUI component (Razor/CSS/JS interop) with navigation, scoping intoShowTimeRange, group-by legend, and marker overlays. - Adds runtime/eventing support for building and aggregating histograms (bucketing by severity/field/event-id, downsampling, anomaly flagging) plus persisted “Timeline visible” state.
- Expands test coverage across UI, runtime, and eventing layers for histogram primitives, scaling, summary strings, and Find marker publishing/clearing.
Reviewed changes
Copilot reviewed 58 out of 58 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/Unit/EventLogExpert.UI.Tests/TestUtils/LogTablePaneDependenciesExtensions.cs | Registers IFindMarkerSource in UI test DI. |
| tests/Unit/EventLogExpert.UI.Tests/Menu/MenuBarGroupingTests.cs | Adds histogram visibility state selection to menu tests. |
| tests/Unit/EventLogExpert.UI.Tests/LogTable/LogTablePaneFindTests.cs | Verifies Find publishes/clears marker ticks via IFindMarkerSource. |
| tests/Unit/EventLogExpert.UI.Tests/LogTable/FindMarkerSourceTests.cs | Unit tests for FindMarkerSource publish/clear behavior. |
| tests/Unit/EventLogExpert.UI.Tests/Layout/MainContentTests.cs | Verifies histogram pane renders conditionally on visibility state. |
| tests/Unit/EventLogExpert.Runtime.Tests/LogTable/TestSupport/LegacyEventColumnView.cs | Extends legacy test view with histogram/time-tick APIs. |
| tests/Unit/EventLogExpert.Runtime.Tests/Histogram/HistogramSummaryTests.cs | Tests accessible summary/announcement string generation. |
| tests/Unit/EventLogExpert.Runtime.Tests/Histogram/HistogramScaleTests.cs | Tests sqrt scaling + stacked pixel allocation behavior. |
| tests/Unit/EventLogExpert.Runtime.Tests/Histogram/HistogramGroupsTests.cs | Tests group key stability/uniqueness semantics. |
| tests/Unit/EventLogExpert.Runtime.Tests/Histogram/HistogramBuilderTests.cs | Tests histogram scan/build across dimensions and combined views. |
| tests/Unit/EventLogExpert.Runtime.Tests/Histogram/HistogramAggregatorTests.cs | Tests downsampling, window snapping, anomalies, and totals. |
| tests/Unit/EventLogExpert.Runtime.Tests/FilterLenses/FilterLensCommandsTests.cs | Adds tests for ShowTimeRange and label conversion edge case. |
| tests/Unit/EventLogExpert.Eventing.Tests/Common/Events/TimeTicksHistogramTests.cs | Validates eventing bucketing/counting/tick-range primitives. |
| tests/Shared/EventLogExpert.Eventing.TestUtils/Common/Events/LegacyEventColumnReader.cs | Implements histogram-related reader APIs for shared tests. |
| src/EventLogExpert/DependencyInjection/MauiProgramExtensions.cs | Registers histogram preferences provider for Maui app. |
| src/EventLogExpert/Adapters/Settings/HistogramPreferencesAdapter.cs | Implements persisted “histogram visible” preference using Preferences. |
| src/EventLogExpert/Adapters/Menu/MauiMenuActionService.cs | Wires menu action to histogram visibility command. |
| src/EventLogExpert.UI/Menu/MenuBar.razor.cs | Adds View > Timeline toggle bound to HistogramState.IsVisible. |
| src/EventLogExpert.UI/LogTable/LogTablePane.Find.cs | Publishes Find match timestamps to IFindMarkerSource. |
| src/EventLogExpert.UI/LogTable/Histogram/HistogramPane.razor.js | New JS interop for pan/zoom/drag/tooltip/backpressure/session gating. |
| src/EventLogExpert.UI/LogTable/Histogram/HistogramPane.razor.css | New styles for histogram pane, legend, markers, forced-colors hatching. |
| src/EventLogExpert.UI/LogTable/Histogram/HistogramPane.razor.cs | New pane logic: scan/build, aggregate/render, navigation history, scoping, markers. |
| src/EventLogExpert.UI/LogTable/Histogram/HistogramPane.razor | New Razor markup for histogram UI + legend + live announcements. |
| src/EventLogExpert.UI/LogTable/Find/IFindMarkerSource.cs | Defines Find marker source contract (owner + ascending ticks). |
| src/EventLogExpert.UI/LogTable/Find/FindMarkerSource.cs | Singleton implementation raising MarksChanged. |
| src/EventLogExpert.UI/Layout/MainContent.razor.cs | Adds histogram visibility state selection. |
| src/EventLogExpert.UI/Layout/MainContent.razor | Conditionally renders HistogramPane above LogTablePane. |
| src/EventLogExpert.UI/DependencyInjection/UiServiceCollectionExtensions.cs | Registers IFindMarkerSource in UI services. |
| src/EventLogExpert.UI/_Imports.razor | Imports histogram namespace for Razor usage. |
| src/EventLogExpert.Runtime/Menu/IMenuActionService.cs | Adds SetHistogramVisible to menu action interface. |
| src/EventLogExpert.Runtime/LogTable/IEventColumnView.cs | Extends view interface with bucketing/counting/time-tick APIs for histograms. |
| src/EventLogExpert.Runtime/LogTable/EventColumnView.cs | Implements new histogram/time-tick APIs for single-log views. |
| src/EventLogExpert.Runtime/LogTable/CombinedColumnView.cs | Aggregates histogram/time-tick operations across child views. |
| src/EventLogExpert.Runtime/Histogram/SetHistogramVisibleAction.cs | New Fluxor action for histogram visibility. |
| src/EventLogExpert.Runtime/Histogram/Reducers.cs | New reducer to update HistogramState.IsVisible. |
| src/EventLogExpert.Runtime/Histogram/IHistogramPreferencesProvider.cs | Preference provider interface for visibility persistence. |
| src/EventLogExpert.Runtime/Histogram/IHistogramCommands.cs | Command interface for setting histogram visibility. |
| src/EventLogExpert.Runtime/Histogram/HistogramSummary.cs | Generates region label + debounced window announcements. |
| src/EventLogExpert.Runtime/Histogram/HistogramState.cs | New Fluxor feature state for histogram visibility. |
| src/EventLogExpert.Runtime/Histogram/HistogramScale.cs | Sqrt scaling and stacked-segment pixel allocation utilities. |
| src/EventLogExpert.Runtime/Histogram/HistogramRender.cs | Render model types for aggregated bins/totals/anomalies. |
| src/EventLogExpert.Runtime/Histogram/HistogramGroups.cs | Defines severity groups and category grouping generator. |
| src/EventLogExpert.Runtime/Histogram/HistogramDimension.cs | Defines histogram group-by dimensions. |
| src/EventLogExpert.Runtime/Histogram/HistogramData.cs | Defines scanned base histogram data representation. |
| src/EventLogExpert.Runtime/Histogram/HistogramConstants.cs | Defines histogram bucket/category caps. |
| src/EventLogExpert.Runtime/Histogram/HistogramCommands.cs | Dispatches visibility action. |
| src/EventLogExpert.Runtime/Histogram/HistogramBuilder.cs | Builds histogram base data by scanning the active view. |
| src/EventLogExpert.Runtime/Histogram/HistogramAggregator.cs | Downsamples base bins into render bins; flags anomalies. |
| src/EventLogExpert.Runtime/Histogram/Effects.cs | Persists visibility preference and hydrates on store init. |
| src/EventLogExpert.Runtime/FilterLenses/IFilterLensCommands.cs | Adds ShowTimeRange command to lens API. |
| src/EventLogExpert.Runtime/FilterLenses/FilterLensFactory.cs | Adds factory for inclusive UTC time-range lens. |
| src/EventLogExpert.Runtime/FilterLenses/FilterLensCommands.cs | Implements ShowTimeRange by pushing a time-range lens. |
| src/EventLogExpert.Runtime/DependencyInjection/RuntimeServiceCollectionExtensions.cs | Registers IHistogramCommands in runtime DI. |
| src/EventLogExpert.Eventing/Common/Events/LevelSeverity.cs | Adds dense severity slot helpers for histogram bucketing. |
| src/EventLogExpert.Eventing/Common/Events/IEventColumnReader.cs | Extends reader interface with histogram bucketing/counting/time-tick APIs. |
| src/EventLogExpert.Eventing/Common/Events/EventColumnStoreReader.cs | Implements new reader APIs over EventColumnStore. |
| src/EventLogExpert.Eventing/Common/Events/EventColumnStore.cs | Implements survivor-scoped bucketing/counting and time-tick span. |
| src/EventLogExpert.Eventing/Common/Events/EventColumnPool.cs | Adds TryGetIndex to resolve pooled strings for fast bucketing. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
jschick04
force-pushed
the
feat/histogram-timeline
branch
from
July 16, 2026 21:18
3c201fa to
ac9e609
Compare
jschick04
force-pushed
the
feat/histogram-timeline
branch
from
July 16, 2026 22:07
ac9e609 to
594dfa1
Compare
jschick04
force-pushed
the
feat/histogram-timeline
branch
from
July 16, 2026 22:58
594dfa1 to
46a246e
Compare
jschick04
marked this pull request as ready for review
July 16, 2026 23:08
|
Azure Pipelines: Some pipeline(s) encountered errors during trigger evaluation. |
NikTilton
approved these changes
Jul 17, 2026
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.
Summary
Adds an event-timeline histogram to the log-table view (ADO 62704677): a compact, toggleable strip above the table that plots event volume over time with WPA-style continuous zoom and horizontal pan, a scope lens that drills the table into a time range, and group-by dimensions (severity / source / event id / task category / opcode / log). Toggle it from View > Timeline; its visibility persists across launches (default on).
What's included
+/-/ Fit toolbar buttons, and keyboard arrows /+/-/ Home. The default view fits the whole survivor span; zooming narrows the window and reveals a thin horizontal scrollbar that matches the app.ShowTimeRange); double-click resets. Zoom is visual navigation, Scope is the explicit filter action (kept distinct and visually cued).role=region(roledescription=Timeline) whosearia-labelsummarizes the entire loaded view (total events, overall time range, group breakdown); pan/zoom updates a debounced visually-hiddenaria-live=politestatus with the current window's count / range / breakdown, and keyboard bin-cursor navigation announces the focused bin via a visually-hiddenaria-live=assertiveregion.aria-keyshortcutsadvertises the commands, and the decorative plot SVG isrole=presentation.Implementation notes
IEventColumnReaderseam.IEventColumnViewbucketing (single-log views delegate; the combined view aggregates children) and a pure client-sideHistogramAggregatorthat folds base bins into viewport-width render bins with sqrt-scaled stacked-band geometry (1px floor, largest-remainder distribution).InvokeAsync, and a per-session token prevents a disposed pane's in-flight interop from clobbering a re-initialized one.short (parent)or full path only when short names collide.Validation
Manual acceptance (WebView2)
Visual and interaction outcomes automated tests can't verify:
+/-/ Fit, keyboard navigation; Undo (button and right-click); double-click reset.