Add tooltip linking to traces for moving average charts of scorers#20503
Add tooltip linking to traces for moving average charts of scorers#20503serena-ruan merged 1 commit intomasterfrom
Conversation
670dc3f to
5bf75da
Compare
5bf75da to
1888a19
Compare
🛠 DevTools 🛠
Install mlflow from this PRFor Databricks, use the following command: |
There was a problem hiding this comment.
Pull request overview
This PR adds support for IS NULL/IS NOT NULL operators for assessment filters and implements tooltip links in overview charts that allow users to navigate to the traces tab with time range and assessment filters applied.
Changes:
- Backend: Added IS NULL/IS NOT NULL operators support for assessment filters in the SQL store and search utilities
- Frontend: Added IS_NULL and IS_NOT_NULL operators to the FilterOperator enum and updated filter UI to hide value input for null operators
- Charts: Enhanced all overview charts with interactive tooltips that link to filtered traces views with appropriate time ranges and assessment filters
Reviewed changes
Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
tests/store/tracking/test_sqlalchemy_store.py |
Adds comprehensive tests for IS NULL/IS NOT NULL assessment filter functionality |
mlflow/utils/search_utils.py |
Adds VALID_ASSESSMENT_COMPARATORS constant with null operators support |
mlflow/store/tracking/sqlalchemy_store.py |
Implements SQL subquery logic for IS NULL/IS NOT NULL assessment filters |
mlflow/server/js/src/shared/web-shared/genai-traces-table/types.ts |
Adds IS_NULL and IS_NOT_NULL to FilterOperator enum and helper function |
mlflow/server/js/src/shared/web-shared/genai-traces-table/hooks/useMlflowTraces.tsx |
Updates filter routing to handle null operators correctly for assessments |
mlflow/server/js/src/shared/web-shared/genai-traces-table/hooks/useFilters.tsx |
Allows filters without values when using null operators |
mlflow/server/js/src/shared/web-shared/genai-traces-table/components/filters/TableFilterItem.tsx |
Adds null operators to assessment filter UI and conditionally hides value input |
mlflow/server/js/src/experiment-tracking/pages/experiment-overview/hooks/*.ts |
Adds timestampMs field to all chart data types for navigation support |
mlflow/server/js/src/experiment-tracking/pages/experiment-overview/components/*.tsx |
Updates all chart components to include tooltip links with proper memoization |
mlflow/server/js/src/experiment-tracking/pages/experiment-overview/components/OverviewChartComponents.tsx |
Implements URL generation helpers, filter creators, and enhanced ScrollableTooltip with navigation support |
mlflow/server/js/src/lang/default/en.json |
Adds internationalized messages for tooltip links |
| Test files | Comprehensive test coverage for new functionality across backend and frontend |
| * @returns Filter string in format "column::operator::value::key" | ||
| */ | ||
| export function createAssessmentExistsFilter(assessmentName: string): string { | ||
| return [TracesTableColumnGroup.ASSESSMENT, HiddenFilterOperator.IS_NOT_NULL, '', assessmentName].join('::'); |
There was a problem hiding this comment.
The function uses HiddenFilterOperator.IS_NOT_NULL but this creates an inconsistency because IS_NOT_NULL is now also available in the public FilterOperator enum (added in line 193 of types.ts). For consistency with how assessment filters are handled elsewhere in the codebase (e.g., in useMlflowTraces.tsx line 726 and TableFilterItem.tsx line 94), this should use FilterOperator.IS_NOT_NULL instead of HiddenFilterOperator.IS_NOT_NULL.
The HiddenFilterOperator enum was originally intended for operators not displayed in the UI, but now that IS_NULL and IS_NOT_NULL are user-facing operators for assessments, they should use the public FilterOperator enum.
| return [TracesTableColumnGroup.ASSESSMENT, HiddenFilterOperator.IS_NOT_NULL, '', assessmentName].join('::'); | |
| return [TracesTableColumnGroup.ASSESSMENT, FilterOperator.IS_NOT_NULL, '', assessmentName].join('::'); |
| // IS NULL / IS NOT NULL operators don't require a value | ||
| if (!column || !urlOperator || (!value && !isNullOperator(urlOperator))) return filters; |
There was a problem hiding this comment.
The check on line 29 correctly allows null operators to proceed without a value. However, for assessment filters with null operators, the empty value string will be passed to serializedStringToAssessmentValueV2 at line 36 (outside the diff), which returns an empty string. While this doesn't cause bugs since the value isn't used for null operators, it would be clearer to explicitly handle null operators by setting the value to undefined when a null operator is used, making it clear that no value is needed for these operators.
|
Documentation preview for 3765fca is available at: More info
|
181f149 to
066f643
Compare
4ced762 to
9a320be
Compare
Signed-off-by: Serena Ruan <serena.rxy@gmail.com>
9a320be to
3765fca
Compare
🥞 Stacked PR
Use this link to review incremental changes.
Related Issues/PRs
#xxxWhat changes are proposed in this pull request?
Add tooltip link to traces for moving average chart, this applies the selected data point's time range filter, and assessment existence.
Screen.Recording.2026-02-02.at.5.45.07.PM.mov
How is this PR tested?
Does this PR require documentation update?
Release Notes
Is this a user-facing change?
What component(s), interfaces, languages, and integrations does this PR affect?
Components
area/tracking: Tracking Service, tracking client APIs, autologgingarea/models: MLmodel format, model serialization/deserialization, flavorsarea/model-registry: Model Registry service, APIs, and the fluent client calls for Model Registryarea/scoring: MLflow Model server, model deployment tools, Spark UDFsarea/evaluation: MLflow model evaluation features, evaluation metrics, and evaluation workflowsarea/gateway: MLflow AI Gateway client APIs, server, and third-party integrationsarea/prompts: MLflow prompt engineering features, prompt templates, and prompt managementarea/tracing: MLflow Tracing features, tracing APIs, and LLM tracing functionalityarea/projects: MLproject format, project running backendsarea/uiux: Front-end, user experience, plotting, JavaScript, JavaScript dev serverarea/build: Build and test infrastructure for MLflowarea/docs: MLflow documentation pagesHow should the PR be classified in the release notes? Choose one:
rn/none- No description will be included. The PR will be mentioned only by the PR number in the "Small Bugfixes and Documentation Updates" sectionrn/breaking-change- The PR will be mentioned in the "Breaking Changes" sectionrn/feature- A new user-facing feature worth mentioning in the release notesrn/bug-fix- A user-facing bug fix worth mentioning in the release notesrn/documentation- A user-facing documentation change worth mentioning in the release notesShould this PR be included in the next patch release?
Yesshould be selected for bug fixes, documentation updates, and other small changes.Noshould be selected for new features and larger changes. If you're unsure about the release classification of this PR, leave this unchecked to let the maintainers decide.What is a minor/patch release?
Bug fixes, doc updates and new features usually go into minor releases.
Bug fixes and doc updates usually go into patch releases.