Commit fbde116
[Streams] Fix timerange lost retention tab (elastic#247544)
Closes elastic#244616
## Summary
This PR fixes time range persistence issues in the Streams app. What
started as a simple fix for the Retention tab exposed deeper
architectural inconsistencies in time state management that needed to be
addressed.
### Problem
Time lost on Retention tab refresh: When setting a time range on the
Retention tab and refreshing the page, the time would reset to the
default 15 minutes. This happened because the Streams app wasn't syncing
the global timefilter with the URL.
### Initial Fix and Exposed Issues
The initial fix was straightforward: add `syncGlobalQueryStateWithUrl`
to sync the timefilter with the `_g` URL parameter (following the
pattern used by Discover and other Kibana apps).
However, this fix exposed pre-existing architectural inconsistencies
that weren't visible before:
1. Time not syncing between tabs: After adding global sync, we expected
time to be consistent across all tabs. But navigating from Main page →
Data Quality tab would show different times. This happened because:
- The Data Quality tab maintained its own time state via a separate
`pageState` URL parameter
- The router preserved `pageState` across navigations, which contained
stale time values
- The Data Quality controller prioritized `pageState` over the global
timefilter
2. Time lost when clicking stream links: Setting time on the Main page
and clicking a stream name would lose the time. This happened because:
- Stream name links used `href={router.link(...)}` which captured URL
params at render time
- When users set a new time, the `_g` was updated in the URL, but the
link's `href` was already rendered with the old value
- Clicking the link navigated to the stale URL without the updated `_g`
These issues existed before but weren't noticed because without global
sync, there was no expectation of time consistency across tabs—each part
of the app effectively managed time independently
### Revised Approach
After review feedback, the solution was changed from using the `_g`
global state pattern to using explicit route query params
(`rangeFrom/rangeTo`). This approach is more consistent with the Streams
app's existing routing architecture and avoids pulling in additional
helper functions for global state management
### Changes
**Route Configuration**
- Added `timeRangeQueryParams` (`rangeFrom`/`rangeTo`) to each child
route that needs time state. Management routes have extended
`managementQueryParams` that also include `openFlyout`,
`selectedFeatures`, and `pageState` for feature-specific navigation
- Time params are now recognized by the typed router
**New Hooks**
- `useTimeRange` - Reads time range from URL params via `useLocation()`,
converts relative times (e.g., "now-15m") to absolute timestamps. Uses
direct URL reading to work universally across all routes.
- `useTimeRangeUpdate` - Updates time range in URL while preserving
other query params
**DateRangeRedirect Component**
- Ensures time params are always present in the URL
- If missing, populates them from the global timefilter (session state)
or Kibana defaults
- Syncs URL time params to the global timefilter so `useTimefilter()`
consumers stay in sync
**Updated Components**
- `StreamsAppSearchBar` - Now uses URL-based time state instead of
global timefilter directly
- `StreamDetailSignificantEventsView` - Uses new time hooks
**Data Quality Controller**
- Now reads time from URL params (`rangeFrom`/`rangeTo`) as source of
truth
- Always overrides `pageState` time with URL time params, ensuring
consistency even when stale pageState exists
- Uses shared `useTimeRangeUpdate` hook instead of custom time-setting
logic
## Limitations & Workarounds
### Not all navigation calls pass time params explicitly
**Current state**: Key navigation paths now explicitly pass time params
via the typed router. Some secondary navigation calls (e.g., links in
schema editor, routing views, discovery pages) still don't pass them
explicitly
**Workaround**: `DateRangeRedirect` reads from the global timefilter
when time params are missing. Since the timefilter retains the last
known time within the session, time is effectively preserved even
through links that don't pass params explicitly
**Why**: Updating all ~20 navigation calls would significantly expand
the scope of this PR and touch unrelated parts of the codebase. The
current approach works correctly for in-session navigation
**Future improvement**: A follow-up could update all navigation calls to
pass time params explicitly. See TODO comment in `DateRangeRedirect`
### No refresh interval persistence
The `refreshPaused` and `refreshInterval` params are not yet
implemented. As Streams is primarily used for configuration and analysis
rather than real-time monitoring, I believe we can skip this, at least
for now
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>1 parent eb23d96 commit fbde116
19 files changed
Lines changed: 502 additions & 101 deletions
File tree
Lines changed: 10 additions & 7 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
| 23 | + | |
23 | 24 | | |
24 | 25 | | |
25 | 26 | | |
| |||
53 | 54 | | |
54 | 55 | | |
55 | 56 | | |
56 | | - | |
57 | | - | |
58 | | - | |
59 | | - | |
60 | | - | |
61 | | - | |
62 | | - | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
63 | 66 | | |
64 | 67 | | |
65 | 68 | | |
| |||
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
118 | 118 | | |
119 | 119 | | |
120 | 120 | | |
121 | | - | |
| 121 | + | |
122 | 122 | | |
123 | 123 | | |
124 | 124 | | |
| |||
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
113 | 113 | | |
114 | 114 | | |
115 | 115 | | |
116 | | - | |
| 116 | + | |
117 | 117 | | |
118 | 118 | | |
119 | 119 | | |
| |||
Lines changed: 3 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| 19 | + | |
19 | 20 | | |
20 | 21 | | |
21 | 22 | | |
| |||
48 | 49 | | |
49 | 50 | | |
50 | 51 | | |
| 52 | + | |
51 | 53 | | |
52 | 54 | | |
53 | 55 | | |
| |||
82 | 84 | | |
83 | 85 | | |
84 | 86 | | |
| 87 | + | |
85 | 88 | | |
86 | 89 | | |
87 | 90 | | |
| |||
Lines changed: 1 addition & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
137 | 137 | | |
138 | 138 | | |
139 | 139 | | |
| 140 | + | |
140 | 141 | | |
141 | 142 | | |
142 | 143 | | |
| |||
Lines changed: 103 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
Lines changed: 10 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
| 20 | + | |
| 21 | + | |
20 | 22 | | |
21 | 23 | | |
22 | 24 | | |
| |||
34 | 36 | | |
35 | 37 | | |
36 | 38 | | |
37 | | - | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
38 | 42 | | |
39 | 43 | | |
40 | 44 | | |
| |||
44 | 48 | | |
45 | 49 | | |
46 | 50 | | |
47 | | - | |
48 | | - | |
| 51 | + | |
| 52 | + | |
49 | 53 | | |
50 | 54 | | |
51 | 55 | | |
| |||
60 | 64 | | |
61 | 65 | | |
62 | 66 | | |
63 | | - | |
| 67 | + | |
64 | 68 | | |
65 | 69 | | |
66 | 70 | | |
| |||
158 | 162 | | |
159 | 163 | | |
160 | 164 | | |
161 | | - | |
162 | | - | |
| 165 | + | |
| 166 | + | |
163 | 167 | | |
164 | 168 | | |
165 | 169 | | |
| |||
Lines changed: 6 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | | - | |
24 | | - | |
25 | | - | |
26 | | - | |
27 | 23 | | |
28 | 24 | | |
| 25 | + | |
29 | 26 | | |
30 | 27 | | |
31 | 28 | | |
| |||
44 | 41 | | |
45 | 42 | | |
46 | 43 | | |
| 44 | + | |
47 | 45 | | |
48 | 46 | | |
49 | 47 | | |
| |||
59 | 57 | | |
60 | 58 | | |
61 | 59 | | |
62 | | - | |
63 | | - | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
64 | 64 | | |
65 | 65 | | |
66 | 66 | | |
| |||
Lines changed: 12 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
| 20 | + | |
20 | 21 | | |
21 | 22 | | |
22 | 23 | | |
| |||
37 | 38 | | |
38 | 39 | | |
39 | 40 | | |
| 41 | + | |
40 | 42 | | |
41 | 43 | | |
42 | 44 | | |
| |||
108 | 110 | | |
109 | 111 | | |
110 | 112 | | |
111 | | - | |
| 113 | + | |
112 | 114 | | |
113 | 115 | | |
114 | 116 | | |
| |||
124 | 126 | | |
125 | 127 | | |
126 | 128 | | |
127 | | - | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
128 | 138 | | |
129 | 139 | | |
130 | 140 | | |
| |||
Lines changed: 13 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
40 | 40 | | |
41 | 41 | | |
42 | 42 | | |
| 43 | + | |
43 | 44 | | |
44 | 45 | | |
45 | 46 | | |
| |||
73 | 74 | | |
74 | 75 | | |
75 | 76 | | |
| 77 | + | |
76 | 78 | | |
77 | 79 | | |
78 | 80 | | |
| |||
396 | 398 | | |
397 | 399 | | |
398 | 400 | | |
399 | | - | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
400 | 412 | | |
401 | 413 | | |
402 | 414 | | |
| |||
0 commit comments