Skip to content

PMM-14109 Improve Advisor UX - #5656

Draft
ademidoff wants to merge 169 commits into
mainfrom
PMM-14109-improve-advisor-ux
Draft

PMM-14109 Improve Advisor UX#5656
ademidoff wants to merge 169 commits into
mainfrom
PMM-14109-improve-advisor-ux

Conversation

@ademidoff

@ademidoff ademidoff commented Jul 16, 2026

Copy link
Copy Markdown
Member

ademidoff and others added 30 commits June 27, 2026 10:53
- Implemented MarkCheckResultsRead function in the service layer to update the read state of check results.
- Added corresponding API endpoint for marking check results as read.
- Introduced new parameters and response structures for the API.
- Updated settings model to include Advisor notification settings.
- Enhanced environment variable parsing to support new Advisor notification feature.
- Added tests for the new functionality to ensure proper behavior.
…y Fields

- Introduced CheckSeverity and CheckTriggeredBy types to represent the severity levels and initiators of advisor checks.
- Updated CheckResult model to include Severity (CheckSeverity) and TriggeredBy (CheckTriggeredBy) fields.
- Modified database schema to accommodate new fields in the check_results table.
- Adjusted related services and models to handle the new fields, including changes in the execution flow of advisor checks.
- Updated API services to support the new fields in requests and responses.
- Enhanced tests to cover new functionality and ensure proper handling of severity and triggered by information.
… components

- Introduced new fields: environment, cluster, replication_set, and outcome to CheckResultHistoryItem in advisors.proto.
- Updated validation logic in advisors.pb.validate.go to include new fields.
- Modified JSON representations in list_check_results_history_responses.go and v1.json to accommodate new fields.
- Adjusted database schema and models to reflect new fields in CheckResult.
- Enhanced tests to validate new fields and ensure proper functionality in AdvisorInsights components.
…, updating labels, and enhancing test coverage
ademidoff and others added 15 commits August 9, 2026 17:00
MySQL 8.0.30 sizes the redo log with innodb_redo_log_capacity and
ignores innodb_log_file_size/innodb_log_files_in_group, which keep
reporting their defaults. The check multiplied the legacy pair, so it
under-reported the redo log size: measured on MySQL 8.4.10, 48M * 2 =
96M against an actual capacity of 100M, and the gap grows for anyone who
sets capacity explicitly. The query now prefers the capacity variable
and falls back to the legacy pair for older servers.

The written and size values also went through int() on strings that
increase() and avg() render as floats, which fails with "invalid literal
with base 10"; they are parsed with int(float(...)) now.

The missing-metrics insight no longer claims the gap is transient:
checkpoint age comes from a Percona Server status variable that vanilla
MySQL does not expose, so on those servers the condition is permanent.

Signed-off-by: Alex Demidoff <a@demidoff.me>
Stakeholder review found the menu items under Advisors repetitive: the
parent already says Advisors, so every child repeated the word. They are
now Insights, Catalog and Run history.

The page headings and document titles keep the Advisor prefix. There are
no breadcrumbs, so the full name is what distinguishes a browser tab, and
it keeps the canonical "Advisor checks" term visible on the page that the
documentation, the tour and the email report all refer to by that name.

The routing table in ui/AGENTS.md also gains the /advisors/runs row that
was missed when the page was added.

Signed-off-by: Alex Demidoff <a@demidoff.me>
Reviewing the catalog for the category rework surfaced metadata that
misdescribes the check on screen.

mysql_configuration_innodb_strict_mode carried the description of
mysql_security_password_lifetime ("This check warns about password
lifetime"), and that check in turn was summarized as "InnoDB password
lifetime". Both now describe themselves.

Three checks shared the summary "MySQL configuration check" and two more
shared "Server is not configured to enforce data integrity", so the
catalog listed them as indistinguishable rows. Each now names the
condition it reports, matching the wording of the insight it raises.
mysql_require_secure_transport also cited a variable that does not
exist: it reads require_secure_transport, not mysql_secure_transport_only.

Also fixes the "Unspported" typo in the mongodb_unsupported_version
summary.

Signed-off-by: Alex Demidoff <a@demidoff.me>
Removing the subcategory leaves the category as the only grouping, and
the categories as authored do not survive that: Configuration held 66 of
the 109 checks and said nothing about any of them, while Query held
schema and index checks.

Each check is now filed under what it actually examines: Security (27),
Durability (12), Replication (11), Versions (11), Performance (11),
Resources (11), Maintenance (7), Schema & indexes (7), Connections (6)
and Logging (6). Grouping follows the risk rather than the feature, so
for example sync_binlog is Durability rather than Replication, and the
replication grant checks stay in Security.

The subcategory field is dropped from every check file and from the
three example templates.

Signed-off-by: Alex Demidoff <a@demidoff.me>
With the catalog recategorized, the category groups the checks on its
own and the second level only added a column to scan past.

Subcategory is removed from the check format, the advisor_checks and
advisor_insights tables, the API and the UI: the catalog loses its Sub
category column and filter, the check form its field, and both details
panes their row. An advisor group is now identified by its category
alone.

Migrations 119-121 are unreleased, so they are edited in place rather
than followed by a drop-column migration.

The four Prometheus check metrics labelled a check by its subcategory;
the label is renamed to category and carries the category now. The only
dashboard query on those metrics sums without a label selector.

Removing the field left holes in three messages, so AdvisorCheck,
Advisor and Insight are renumbered to close them, and the buf breaking
baseline in api/descriptor.bin is refreshed accordingly.

Signed-off-by: Alex Demidoff <a@demidoff.me>
The check name is the longest value on the pane and was truncating in a
quarter-width column while Source, which holds either "Builtin" or
"Custom", had a column to itself on the first row.

Check name now spans two columns and Source moves down to sit with
Interval and Status.

Signed-off-by: Alex Demidoff <a@demidoff.me>
PMM has no SMTP configuration of its own: the sender reads the GF_SMTP_*
variables it inherits from Grafana. Nothing in the UI told an operator
whether those are set, so the only way to find out was to configure an
unrelated Alerting contact point, or wait for a run to produce findings
and hope the summary arrived.

Settings -> Advisors now offers "Send test email" below the recipients
field. It emails the addresses currently in the field, unsaved edits
included, since verifying delivery is what the operator is about to rely
on, and is disabled until they parse.

The message is the real report: it goes through the same builder the
scheduler uses, with one made-up finding per severity filtered by the
configured threshold, so the recipient sees the format they will get. The
subject is prefixed with [Test] and the body opens by saying the findings
are samples and nothing was recorded, so a recipient who did not press
the button cannot mistake them for real.

Since SMTP cannot be fixed from this page, an unconfigured server has to
say so: the sender wraps a new services.ErrSMTPNotConfigured naming the
missing variable, and the endpoint returns it as a precondition failure.

Signed-off-by: Alex Demidoff <a@demidoff.me>
The row menu already acts on one insight, whose service the surrounding
items name, so "for this service" spent two words to say what the row
already said.

Signed-off-by: Alex Demidoff <a@demidoff.me>
…isor-ux

Signed-off-by: Alex Demidoff <a@demidoff.me>

# Conflicts:
#	api/advisors/v1/advisors.pb.gw.go
#	managed/cmd/pmm-managed-starlark/main_test.go
#	ui/apps/pmm/src/App.tsx
A run shows no duration until it finishes, so the list went stale with
no sign the run had completed. Refetch once a minute while any run on
the page is still open, and stop once none is. The interval belongs to
the query, so concurrent runs cost one request per minute, not one
each.

Signed-off-by: Alex Demidoff <a@demidoff.me>
Run all ignores the active filters, so offering it next to a narrowed
list invited running every check by accident. The two run actions are
now mutually exclusive: Run all unfiltered, Run selected once a filter
or the search box applies.

Signed-off-by: Alex Demidoff <a@demidoff.me>
The advisors list gave no at-a-glance signal for a check that is off,
beyond the Status toggle. Dim those rows at the same 0.5 opacity the
insights table already uses.

Signed-off-by: Alex Demidoff <a@demidoff.me>
Comment thread managed/cmd/pmm-managed-starlark/main_test.go Outdated
ademidoff and others added 3 commits August 18, 2026 16:42
Regroup the topology fields so each row reads as one idea:
Category / Service / Technology / Node, then Environment / Cluster /
Replication set / Region. Technology renders the insight's service
type through a new MANAGED_SERVICE_TYPE label map.

Signed-off-by: Alex Demidoff <a@demidoff.me>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Documentation changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants