Skip to content

[Bug]: Indent guide hover state is written on every mouse move but nothing reads it #4328

Open

Description

@SohamJuneja

What happened?

Hovering an indent guide in the trace timeline dispatches Redux actions that update hoverIndentGuideIds, but nothing reads that state anymore, so nothing renders from it.

It used to drive an ancestor highlight: hovering one guide lit up the same ancestor's guide in the other rows. #3302 rewrote the guides and removed the is-active class and its CSS, but left the state, the actions, the reducers, mapStateToProps and a useSelector in place.

So every mouse move across a guide costs a dispatch, a new Set, and a re-render of VirtualizedTraceViewWrapper, for no visual effect. Deeper traces have more guides per row, so it dispatches more.

Steps to reproduce

  1. Open any trace with nested spans.
  2. Move the mouse across the vertical indent guides in the left column.
  3. Nothing highlights in the other rows. Redux actions still fire on every guide.

Expected behavior

Either the hover should highlight the ancestor's guides across rows as it used to, or the state should not exist.

Relevant log output

Screenshot

No response

Additional context

Before #3302, SpanTreeOffset.tsx had:

'is-active': hoverIndentGuideIds.has(ancestorId),

#3302 removed that and the CSS behind it:

-.SpanTreeOffset--indentGuide.is-active {
-.SpanTreeOffset--indentGuide.is-active:before {

#3753 later removed the unused destructure, which was correct — oxlint flagged it because nothing used it by then. The write path was untouched.

Still on main:

  • SpanTreeOffset.tsx — handleMouseEnter/handleMouseLeave dispatch addHoverIndentGuideId/removeHoverIndentGuideId
  • duck.ts:416-427 — both reducers clone the Set
  • SpanTreeOffset.tsx:209 — mapStateToProps returns it, TProps declares it, the component never destructures it
  • VirtualizedTraceView.tsx:580 — read via useSelector, spread into combinedProps at 702, unused by the class component. Only type-checks because VirtualizedTraceViewProps includes TTraceTimeline.

SpanTreeOffset.css has no class keyed on the set.

RFC-0004 Phase 1c step 3 lists this as "hover state still lives only in the duck", pending a move to Zustand. If it's dead there's nothing to migrate — deleting it also removes the last useSelector in VirtualizedTraceView and the connect() in SpanTreeOffset.

Was dropping the highlight in #3302 intentional? Two options, and I'd rather ask before opening a PR:

  1. Delete the state, the actions, the reducers, the connect(), the useSelector and the handlers.
  2. Restore the feature and migrate the state to useTraceTimelineStore as Phase 1c.3 planned.

Happy to do either.

UI-only; reproducible against any backend since it's a client-side state question.

Jaeger backend version

No response

SDK

No response

Pipeline

No response

Stogage backend

No response

Operating system

No response

Deployment model

No response

Deployment configs

Activity

  1. lakshaydevoo-arch commented on Sep 20, 2026

    @lakshaydevoo-arch

    Hi, I'd like to investigate this issue.

    I noticed the two possible approaches mentioned in the issue: removing the unused hoverIndentGuideIds state and its dispatch/reducer/connect logic, or restoring the ancestor-highlight behavior and migrating it to the timeline store.

    I'd like to work on this, but before making changes, could you confirm which direction is preferred? If the highlight behavior is intentionally removed, I can investigate removing the now-dead state and the associated Redux plumbing, along with the relevant tests.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions