Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ML] AIOps: Fix race condition where stale url state would reset search bar. #154885

Merged
merged 8 commits into from
Apr 18, 2023

Conversation

walterra
Copy link
Contributor

@walterra walterra commented Apr 13, 2023

Summary

Fixes an issue there the global state _g and app state _a would get out of sync and overwrite each other. For example, a click on Refresh in the date picker (global state) could reset the search bar (app state) to empty.

The issue was that in x-pack/packages/ml/url_state/src/url_state.tsx the searchString could become a stale value in setUrlState. This PR fixes it by using the approach already used in usePageUrlState: The searchString is passed on to be stored via useRef so that the setUrlState setter can always access the most recent value.

The exact sequence of actions to trigger the bug is a bit cumbersome to find, it doesn't always happen. Functional tests have been extended to cover the case reliably, actually it was these functional tests which surfaced the bug. use_data.ts has been refactored to rely less on callbacks and use useMemo instead.

Checklist

@walterra walterra added bug Fixes for quality problems that affect the customer experience release_note:fix :ml Feature:ML/AIOps ML AIOps features: Change Point Detection, Log Pattern Analysis, Log Rate Analysis v8.8.0 labels Apr 13, 2023
@walterra walterra requested a review from a team as a code owner April 13, 2023 06:10
@walterra walterra self-assigned this Apr 13, 2023
@elasticmachine
Copy link
Contributor

Pinging @elastic/ml-ui (:ml)

x-pack/packages/ml/url_state/src/url_state.tsx Outdated Show resolved Hide resolved
@@ -45,9 +45,6 @@ export const useData = (
} = useAiopsAppContext();

const [lastRefresh, setLastRefresh] = useState(0);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reckon we should get rid of this local state and use useRefresh and useTimeRangeUpdates hooks instead.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since lastRefresh is also passed on to use_document_count_stats.ts it will result in quite a rewrite, that's a bit out of scope for this PR, I'd like to focus on just fixing the bug here.

};
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [lastRefresh, searchQuery]);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

and afterwards fieldStatsRequest should be triggered based on explicit refresh or time range updates.

const timefilter = useTimefilter({
timeRangeSelector: selectedDataView?.timeFieldName !== undefined,
autoRefreshSelector: true,
});

const fieldStatsRequest: DocumentStatsSearchStrategyParams | undefined = useMemo(() => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not related to this line...

In my current WIP PR for embedding log categorisation in Discover I've had to add a hack to stop this file from calling the various set functions in filterManager because they update the URL and cause Discover problems.
It makes me wonder if this could be considered an unexpected side effect and whether this file should be updating the URL at all?

I don't have a good solution, apart from perhaps creating a different hook which monitors the aiopsListState and updates the URL.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good point, we'll have to consider this also for Explain Log Rate Spike once it gets used in other places. I added a note to the meta issue here: #146065

@kibana-ci
Copy link
Collaborator

💚 Build Succeeded

Metrics [docs]

Async chunks

Total size of all lazy-loaded chunks that will be downloaded as the user navigates the app

id before after diff
aiops 766.1KB 766.1KB +42.0B
transform 376.2KB 376.3KB +92.0B
total +134.0B

Page load bundle

Size of the bundles that are downloaded on every page load. Target size is below 100kb

id before after diff
ml 79.6KB 79.6KB +92.0B
Unknown metric groups

ESLint disabled line counts

id before after diff
@kbn/ml-url-state 5 7 +2
securitySolution 432 435 +3
total +5

Total ESLint disabled count

id before after diff
@kbn/ml-url-state 5 7 +2
securitySolution 512 515 +3
total +5

History

To update your PR or re-run it, just comment with:
@elasticmachine merge upstream

cc @walterra

Copy link
Contributor

@darnautov darnautov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code LGTM

Copy link
Member

@jgowdyelastic jgowdyelastic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@walterra walterra merged commit 5b1b15a into elastic:main Apr 18, 2023
@kibanamachine kibanamachine added the backport:skip This commit does not require backporting label Apr 18, 2023
@walterra walterra deleted the ml-fix-url-state branch April 18, 2023 13:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backport:skip This commit does not require backporting bug Fixes for quality problems that affect the customer experience Feature:ML/AIOps ML AIOps features: Change Point Detection, Log Pattern Analysis, Log Rate Analysis :ml release_note:fix v8.8.0
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants