feat: add cluster upgrade partial and complete SLO observability#5752
feat: add cluster upgrade partial and complete SLO observability#5752machi1990 wants to merge 4 commits into
Conversation
|
Skipping CI for Draft Pull Request. |
0374474 to
f13b732
Compare
| } | ||
| { | ||
| record: 'hosted_control_plane_version:selection_to_partial:desired_pending_seconds' | ||
| expression: '( time() - hosted_control_plane_version:selection_to_partial:state_first_seen_timestamp{state="desired"} ) and on(cluster, resource_id, subscription_id, cluster_uuid, version) ( backend_cluster_version_info{state="desired"} == 1 )' |
There was a problem hiding this comment.
Is the goal of the second part of this query to ensure we only capture metrics with the desired state to see how long it's been in that state (ignores when it moves to partial/completed).
Looking at the way the metrics are emitted (PR), it seems to re-emit every sync and there wouldn't be a recording rule hosted_control_plane_version:selection_to_partial:state_first_seen_timestamp{state="desired"} for it anymore cause backend_cluster_version_info == 1 for that state would not exist? If my understanding there is correct, is the second half of the query really needed?
There was a problem hiding this comment.
backend_cluster_version_info{state="desired"} == 1
The intent of this was to capture "the given desired version is stuck on desired".
To only show up upgrades that are currently stuck as opposed to the version was ever stuck on desired.
Though I am wondering what's the best approach between the two differences; should we interest ourselves with the current stuck or current and any previous stuck?
| # Multi-window burn-rate alerts for cluster upgrade version selection-to-partial SLO. Sev 4 (info). | ||
| - name: rp-uj-cluster-upgrade-version-selection-to-partial-monitor-rules | ||
| rules: | ||
| - alert: UJClusterUpgradeVersionSelectionToPartial5m1h |
There was a problem hiding this comment.
Tier suffix should be long-window-first (1h5m, 6h30m, 3d6h) per the convention in the KAS and NodePool alerts.
| annotations: | ||
| summary: "{{ $labels.cluster }}: Cluster upgrade version selection-to-partial error budget burning rapidly (>14.4x)" | ||
| description: "More than 14.4x of the 99.95% cluster upgrade version selection-to-partial error budget is being consumed over 5m and 1h windows. Cluster upgrades are stuck for over 20 minutes without the target version reaching partial. Investigate backend_cluster_version_info on affected clusters." | ||
| runbook_url: TBD |
There was a problem hiding this comment.
RP lane alerts need a resolvable aka.ms/arohcp-runbook-... short-link before merge, even if the runbook is still high level.
5e3117e to
3896b9f
Compare
There was a problem hiding this comment.
I am unsure if this is the correct lane to use. https://github.com/swiencki/architecture/blob/16fbc2fb1ffa04b61d21ae6f61f7a6b1845c1825/offerings/aro/decisions/adr-001-aro-hcp-alerting-recommendation-for-sre.md#routing-lanes-in-aro-hcp
Discussing with @swiencki to confirm this
There was a problem hiding this comment.
Simon has confirmed that's a good lane
| hosted_control_plane_version:upgrade_complete:stuck_over_30m:burnrate1h > 14.4 | ||
| for: 5m | ||
| labels: | ||
| severity: info |
There was a problem hiding this comment.
intentionally as sev4 for now and over time it'll be graduated to the corresponding severity as par https://github.com/swiencki/architecture/blob/16fbc2fb1ffa04b61d21ae6f61f7a6b1845c1825/offerings/aro/decisions/adr-001-aro-hcp-alerting-recommendation-for-sre.md#burn-rate-tiers-timing-precision
| hosted_control_plane_version:upgrade_complete:stuck_over_30m:burnrate6h > 6 | ||
| for: 30m | ||
| labels: | ||
| severity: info |
There was a problem hiding this comment.
same as https://github.com/Azure/ARO-HCP/pull/5752/changes#r3476800035 intentional as info for now and will be graduated over time
| hosted_control_plane_version:upgrade_complete:stuck_over_30m:burnrate3d > 1 | ||
| for: 30m | ||
| labels: | ||
| severity: info |
There was a problem hiding this comment.
same as https://github.com/Azure/ARO-HCP/pull/5752/changes#r3476800035 to make it info and graduate over time
| hosted_control_plane_version:selection_to_partial:stuck_over_20m:burnrate6h > 6 | ||
| for: 30m | ||
| labels: | ||
| severity: info |
There was a problem hiding this comment.
same comment as https://github.com/Azure/ARO-HCP/pull/5752/changes#r3476800035
| hosted_control_plane_version:selection_to_partial:stuck_over_20m:burnrate3d > 1 | ||
| for: 30m | ||
| labels: | ||
| severity: info |
There was a problem hiding this comment.
same comment as https://github.com/Azure/ARO-HCP/pull/5752/changes#r3476800035
| annotations: | ||
| summary: "{{ $labels.cluster }}: Cluster upgrade version selection-to-partial error budget burning rapidly (>14.4x)" | ||
| description: "More than 14.4x of the 99.95% cluster upgrade version selection-to-partial error budget is being consumed over 5m and 1h windows. Cluster upgrades are stuck for over 20 minutes without the target version reaching partial. Investigate backend_cluster_version_info on affected clusters." | ||
| runbook_url: "aka.ms/arohcp-runbook-cluster-upgrade" |
There was a problem hiding this comment.
Needs the https:// prefix to render as a clickable link in IcM: https://aka.ms/arohcp-runbook-cluster-upgrade.
|
Before the alert goes live we need a runbook / tsg, and shorthand aka.ms url following the format in https://github.com/openshift-online/architecture/pull/79. I or another ARO Classic lead should be able to create that for you. |
About the runbook and TSG, I have created a PR for AZure-Docs-Common. Sent you the link, PTAL |
3896b9f to
cc93eab
Compare
cc93eab to
3a616ab
Compare
There was a problem hiding this comment.
Pull request overview
This PR adds user-journey observability for HCP cluster upgrades by introducing Prometheus recording rules, burn-rate alerts, promtool tests, and SRE Grafana dashboards for two SLOs: version selection → partial (20m) and upgrade complete (30m).
Changes:
- Add recording rules to derive “first-seen” timestamps, latency, fleet totals, stuck counts/rates, and multi-window burn rates for both SLOs.
- Add multi-window burn-rate alerting rules (info severity) for both SLOs and wire them into the RP alerting ruleset.
- Add two new Grafana dashboards and regenerate the corresponding Azure Monitor Prometheus rule-group Bicep outputs.
Reviewed changes
Copilot reviewed 14 out of 14 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| observability/recording-rules-services.yaml | Registers the new cluster-upgrade recording rule definitions for generation. |
| observability/grafana-dashboards/sre/user-journey/cluster-upgrade-version-selection-to-partial-slo.json | New dashboard for selection→partial SLI/SLO and stuck/burn-rate visualization. |
| observability/grafana-dashboards/sre/user-journey/cluster-upgrade-complete-slo.json | New dashboard for upgrade-complete SLI/SLO and stuck/burn-rate visualization. |
| observability/alerts/userJourneyClusterUpgradeVersionSelectionToPartialRecord-prometheusRule.yaml | Recording rules for first-seen timestamps, latency, stuck detection, fleet totals, and burn rates (selection→partial). |
| observability/alerts/userJourneyClusterUpgradeVersionSelectionToPartialRecord-prometheusRule_test.yaml | Promtool tests for the selection→partial recording rules. |
| observability/alerts/userJourneyClusterUpgradeVersionSelectionToPartialMonitor-prometheusRule.yaml | Burn-rate alert rules for the selection→partial SLO. |
| observability/alerts/userJourneyClusterUpgradeVersionSelectionToPartialMonitor-prometheusRule_test.yaml | Promtool tests for the selection→partial burn-rate alerts. |
| observability/alerts/userJourneyClusterUpgradeCompleteRecord-prometheusRule.yaml | Recording rules for upgrade-complete pending/latency, stuck detection, totals/rates, and burn rates. |
| observability/alerts/userJourneyClusterUpgradeCompleteRecord-prometheusRule_test.yaml | Promtool tests for the upgrade-complete recording rules. |
| observability/alerts/userJourneyClusterUpgradeCompleteMonitor-prometheusRule.yaml | Burn-rate alert rules for the upgrade-complete SLO. |
| observability/alerts/userJourneyClusterUpgradeCompleteMonitor-prometheusRule_test.yaml | Promtool tests for the upgrade-complete burn-rate alerts. |
| observability/alerts-rp-services.yaml | Wires the new burn-rate alert rules into the RP services ruleset. |
| dev-infrastructure/modules/metrics/rules/generatedRPPrometheusAlertingRules.bicep | Generated Azure Monitor rule-group resources for the new RP alert rules. |
| dev-infrastructure/modules/metrics/rules/generatedRecordingRules.bicep | Generated Azure Monitor rule-group resources for the new recording rules. |
| ( | ||
| time() - hosted_control_plane_version:state_first_seen_timestamp{state="desired"} | ||
| ) | ||
| unless on(cluster, resource_id, subscription_id, cluster_uuid, version) ( | ||
| backend_cluster_version_info{state="completed"} == 1 | ||
| ) |
| description: | | ||
| More than 14.4x of the 99.95% cluster upgrade version selection-to-partial error budget is being consumed. Cluster upgrades are stuck for over 20 minutes without the target version reaching partial. Investigate backend_cluster_version_info on affected clusters. | ||
| Window: 1h/5m | ||
| Management Cluster: {{ $labels.cluster }} |
| description: | | ||
| More than 6x of the 99.95% cluster upgrade version selection-to-partial error budget is being consumed. Cluster upgrades are stuck for over 20 minutes without the target version reaching partial. Investigate backend_cluster_version_info on affected clusters. | ||
| Window: 6h/30m | ||
| Management Cluster: {{ $labels.cluster }} |
| description: | | ||
| Cluster upgrade version selection-to-partial has been steadily consuming the 99.95% SLO error budget (1x burn). Cluster upgrades are stuck for over 20 minutes without reaching partial. Investigate backend_cluster_version_info on affected clusters. | ||
| Window: 3d/6h | ||
| Management Cluster: {{ $labels.cluster }} |
| description: | | ||
| More than 14.4x of the 99.95% cluster upgrade complete error budget is being consumed. Cluster upgrades are stuck for over 30 minutes without reaching completed. Investigate backend_cluster_version_info on affected clusters. | ||
| Window: 1h/5m | ||
| Management Cluster: {{ $labels.cluster }} |
| description: | | ||
| More than 6x of the 99.95% cluster upgrade complete error budget is being consumed. Cluster upgrades are stuck for over 30 minutes without reaching completed. Investigate backend_cluster_version_info on affected clusters. | ||
| Window: 6h/30m | ||
| Management Cluster: {{ $labels.cluster }} |
| description: | | ||
| Cluster upgrade complete has been steadily consuming the 99.95% SLO error budget (1x burn). Cluster upgrades are stuck for over 30 minutes without reaching completed. Investigate backend_cluster_version_info on affected clusters. | ||
| Window: 3d/6h | ||
| Management Cluster: {{ $labels.cluster }} |
| "Value": "Pending Minutes", | ||
| "cluster": "Service Cluster", | ||
| "cluster_uuid": "Cluster UUID", |
| "Value": "Pending Minutes", | ||
| "cluster": "Service Cluster", | ||
| "cluster_uuid": "Cluster UUID", |
|
/test mega-linter |
7caa9cc to
408b1b0
Compare
| - recording-rules/access-cluster-slo-recordingRule.yaml | ||
| - alerts/userJourneyClusterUpgradeRecord-prometheusRule.yaml |
| "title": "Cluster Upgrade SLO", | ||
| "uid": "cluster-upgrade-slo", | ||
| "version": 1 |
| prometheusRules: | ||
| rulesFolders: | ||
| - recording-rules/access-cluster-slo-recordingRule.yaml | ||
| - alerts/userJourneyClusterUpgradeRecord-prometheusRule.yaml |
567650f to
49b9804
Compare
| description: | | ||
| More than 14.4x of the 99.95% cluster upgrade reach-partial error budget is being consumed. Cluster upgrades are stuck for over 20 minutes without the target version reaching partial. Partial is when the target version becomes active (recognized as active) on the HCP cluster; the upgrade is in progress but not yet complete. Investigate backend_cluster_version_info on affected clusters. | ||
| Window: 1h/5m | ||
| Management Cluster: {{ $labels.cluster }} |
| description: | | ||
| More than 6x of the 99.95% cluster upgrade reach-partial error budget is being consumed. Cluster upgrades are stuck for over 20 minutes without the target version reaching partial. Partial is when the target version becomes active (recognized as active) on the HCP cluster; the upgrade is in progress but not yet complete. Investigate backend_cluster_version_info on affected clusters. | ||
| Window: 6h/30m | ||
| Management Cluster: {{ $labels.cluster }} |
| description: | | ||
| Cluster upgrade reach-partial has been steadily consuming the 99.95% SLO error budget (1x burn). Cluster upgrades are stuck for over 20 minutes without reaching partial. Partial is when the target version becomes active (recognized as active) on the HCP cluster; the upgrade is in progress but not yet complete. Investigate backend_cluster_version_info on affected clusters. | ||
| Window: 3d/6h | ||
| Management Cluster: {{ $labels.cluster }} |
| description: | | ||
| More than 14.4x of the 99.95% cluster upgrade complete error budget is being consumed. Cluster upgrades are stuck for over 30 minutes without reaching completed. Completed is when the target version upgrade has finished and is reported as complete on the HCP cluster. Investigate backend_cluster_version_info on affected clusters. | ||
| Window: 1h/5m | ||
| Management Cluster: {{ $labels.cluster }} |
| description: | | ||
| More than 6x of the 99.95% cluster upgrade complete error budget is being consumed. Cluster upgrades are stuck for over 30 minutes without reaching completed. Completed is when the target version upgrade has finished and is reported as complete on the HCP cluster. Investigate backend_cluster_version_info on affected clusters. | ||
| Window: 6h/30m | ||
| Management Cluster: {{ $labels.cluster }} |
| description: | | ||
| Cluster upgrade complete has been steadily consuming the 99.95% SLO error budget (1x burn). Cluster upgrades are stuck for over 30 minutes without reaching completed. Completed is when the target version upgrade has finished and is reported as complete on the HCP cluster. Investigate backend_cluster_version_info on affected clusters. | ||
| Window: 3d/6h | ||
| Management Cluster: {{ $labels.cluster }} |
Track control plane version upgrade activation against a 99.95% / 30m SLO from backend_cluster_version_info. Register recording rules for Azure Monitor and add multi-window burn-rate alerts at Sev 4. Co-authored-by: Cursor <cursoragent@cursor.com> feat: add cluster version selection-to-active SLO Grafana dashboard Fleet-wide SLI view for upgrade activation latency, stuck rate, and error budget consumption. Co-authored-by: Cursor <cursoragent@cursor.com> feat: clarify cluster upgrade naming in version selection-to-active SLO Rename alerts, summaries, and dashboard copy to explicitly describe cluster upgrade version selection-to-active so on-call context is clearer. Co-authored-by: Cursor <cursoragent@cursor.com> feat: add UJ cluster upgrade partial and complete SLO observability Introduce user-journey recording rules, burn-rate alerts, promtool tests, and Grafana dashboards for selection-to-partial (20m) and upgrade-complete SLOs, replacing the earlier selection-to-active prototype with UJClusterUpgrade naming aligned to cluster-upgrade dashboards and slo labels. Co-authored-by: Cursor <cursoragent@cursor.com> refactor: make runbook as TBD refactor: rename shared cluster version state_first_seen_timestamp metric Drop selection_to_partial from the first-seen recording rule name since it tracks desired, partial, and completed states and is shared by both upgrade SLOs. Co-authored-by: Cursor <cursoragent@cursor.com> refactor: align cluster upgrade SLO alerts with RP lane conventions Use long-window-first alert tier suffixes and aka.ms/arohcp-runbook-cluster-upgrade runbook URLs so RP lane monitors match team naming and review requirements. Co-authored-by: Cursor <cursoragent@cursor.com> refactor: rename the recording rules following PR reviews Uses https://prometheus.io/docs/practices/rules/#naming for guidance Co-authored-by: Cursor <cursoragent@cursor.com>
Only consider clusters that have 2 distict version labels to effectively ignore clusters that are under install.
Replace fleet burn-rate alerting with per-upgrade duration alerts at low upgrade volumes, and trim observability to operational essentials. Addresses review feedback that regional burn-rate ratios are equivalent to single-failure detection until upgrade volume supports meaningful denominators: Azure#5752 (comment) - Merge reach-partial and complete monitors into one PrometheusRule - Add userJourneyClusterUpgradeStuckInDesired and StuckInProgress alerts - Drop burn-rate recording rules; keep duration and in-progress metrics - Slim dashboard to in-flight table, stuck counts, and detail tables
d178a7e to
685294f
Compare
|
/hold cancel |
| # https://github.com/Azure/ARO-HCP/blob/main/backend/pkg/controllers/operationcontrollers/operation_cluster_create.go#L316-L320 | ||
| # | ||
| # Naming: level:metric:operations per https://prometheus.io/docs/practices/rules/#naming | ||
| - name: user-journey-cluster-upgrade-recording-rules |
| # completed; missing console component in external auth prevents CVO from marking the | ||
| # upgrade complete. The complete alert may therefore fire due to missing data plane | ||
| # configuration rather than control plane failure. The runbook accommodates this. | ||
| - name: rp-user-journey-cluster-upgrade-monitor-rules |
| runbook_url: https://aka.ms/arohcp-runbook-cluster-upgrade | ||
| correlationId: "userJourneyClusterUpgradeStuckInDesired/{{ $labels.resource_id }}/{{ $labels.version }}" |
There was a problem hiding this comment.
The redirection is there and there is WIP PR being worked on
| runbook_url: https://aka.ms/arohcp-runbook-cluster-upgrade | ||
| correlationId: "userJourneyClusterUpgradeStuckInProgress/{{ $labels.resource_id }}/{{ $labels.version }}" |
| "content": "### Cluster Upgrade SLOs\n\nPer-upgrade observability from `backend_cluster_version_info` via `hosted_control_plane_upgrade:*` recording rules.\n\n| SLO | Target | Alert |\n|-----|--------|-------|\n| **Reach partial** | `partial` within 20m | `userJourneyClusterUpgradeStuckInDesired` (>20m in `desired`) |\n| **Upgrade complete** | `completed` within 30m | `userJourneyClusterUpgradeStuckInProgress` (>30m in progress) |\n\n**Runbook:** [https://aka.ms/arohcp-runbook-cluster-upgrade](https://aka.ms/arohcp-runbook-cluster-upgrade)", | ||
| "mode": "markdown" |
There was a problem hiding this comment.
The redirection is there and the PR is being worked on.
There was a problem hiding this comment.
be sure to hold this PR until the runbook merges - you are sending this alert to the production SRE queue. The runbook must resolve and be complete before ICM alerts go to the SRE team.
| "title": "Cluster Upgrade SLO", | ||
| "uid": "cluster-upgrade-slo", |
Replace fleet burn-rate alerting with per-upgrade duration alerts at low upgrade volumes, and trim observability to operational essentials. Addresses review feedback that regional burn-rate ratios are equivalent to single-failure detection until upgrade volume supports meaningful denominators: Azure#5752 (comment) - Merge reach-partial and complete monitors into one PrometheusRule - Add userJourneyClusterUpgradeStuckInDesired and StuckInProgress alerts - Drop burn-rate recording rules; keep duration and in-progress metrics - Slim dashboard to in-flight table, stuck counts, and detail tables
685294f to
74a9e68
Compare
| - record: hosted_control_plane_upgrade:duration_in_progress:seconds | ||
| expr: | | ||
| ( | ||
| time() - hosted_control_plane_upgrade:version_state_first_seen:timestamp{state="desired"} | ||
| ) | ||
| unless on(cluster, resource_id, subscription_id, cluster_uuid, version) ( | ||
| backend_cluster_version_info{state="completed"} == 1 | ||
| ) | ||
| and on(cluster, resource_id, subscription_id, cluster_uuid, version) ( | ||
| backend_cluster_version_info{state=~"desired|partial"} == 1 | ||
| ) |
SudoBrendan
left a comment
There was a problem hiding this comment.
We for sure need to fix the leak in the series we're recording.
| } | ||
| { | ||
| record: 'hosted_control_plane_upgrade:version_state_first_seen:timestamp' | ||
| expression: 'min without (prometheus_replica) (min by (cluster, resource_id, subscription_id, cluster_uuid, version, state) (hosted_control_plane_upgrade:version_state_first_seen:timestamp or (timestamp(backend_cluster_version_info{state=~"desired|partial"} == 1) and on (cluster, resource_id) (hosted_control_plane_upgrade:upgrade_eligible:info == 1)) or timestamp(backend_cluster_version_info{state="completed"} == 1)))' |
There was a problem hiding this comment.
If I'm reading this correctly - this persists series indefinitely due to the self-reference / recursion. After a single upgrade for a single cluster, we'll have:
{resource_id="foo", version="4.21.0", state="desired"} TIME_FIRST_SEEN
{resource_id="foo", version="4.21.0", state="partial"} TIME_FIRST_SEEN
{resource_id="foo", version="4.21.0", state="completed"} TIME_FIRST_SEEN
With two upgrades, we'll see double.
{resource_id="foo", version="4.21.0", state="desired"} TIME_FIRST_SEEN
{resource_id="foo", version="4.21.0", state="partial"} TIME_FIRST_SEEN
{resource_id="foo", version="4.21.0", state="completed"} TIME_FIRST_SEEN
{resource_id="foo", version="4.21.1", state="desired"} TIME_FIRST_SEEN
{resource_id="foo", version="4.21.1", state="partial"} TIME_FIRST_SEEN
{resource_id="foo", version="4.21.1", state="completed"} TIME_FIRST_SEEN
For 10000 clusters, each upgrading 1/wk (52 times) on z-stream, we'll have 1.5 million different series in a year's time - and nearly all of them will be irrelevant (old upgrades).
Regardless of if the upgrade completed or not - prometheus will continue to track the series and record the data in the interval specified - we'll be up to 1.5 million samples a minute (PT1M) - recording the same metric value for upgrades that completed months/years prior.
We should add a guard to kill old series. What about:
hosted_control_plane_upgrade:version_state_first_seen:timestamp
unless on(cluster, resource_id, subscription_id, cluster_uuid, version) (
backend_cluster_version_info{state="completed"} == 1
)...
In addition - we should probably remove this unused part
or timestamp(backend_cluster_version_info{state="completed"} == 1
This would make it so we only record the most recent upgrade, and only until it's done (no lingering artifacts).
| - labels: 'hosted_control_plane_upgrade:in_progress:count{cluster="svc-1"}' | ||
| value: 0 | ||
| # ======================================== | ||
| # Test 4: Complete — desired transitions to completed within 30m (upgrade) |
There was a problem hiding this comment.
Adding a test here to verify that the series disappears after upgrade completes would ensure we don't leak now or in the future.
| evaluation_interval: 1m | ||
| tests: | ||
| # ======================================== | ||
| # Test 1: Reach partial — desired transitions to partial within 20m (upgrade) |
There was a problem hiding this comment.
This could also use a test to ensure we get to the state="desired" clause, so we don't fire for "stuck in desired" for things actively progressing.
| # upgrade complete. The complete alert may therefore fire due to missing data plane | ||
| # configuration rather than control plane failure. The runbook accommodates this. | ||
| - name: rp-user-journey-cluster-upgrade-monitor-rules | ||
| rules: |
There was a problem hiding this comment.
Alerts should probably define a for, even if it's brief, all others do.
Replace fleet burn-rate alerting with per-upgrade duration alerts at low upgrade volumes, and trim observability to operational essentials. Addresses review feedback that regional burn-rate ratios are equivalent to single-failure detection until upgrade volume supports meaningful denominators: Azure#5752 (comment) - Merge reach-partial and complete monitors into one PrometheusRule - Add userJourneyClusterUpgradeStuckInDesired and StuckInProgress alerts - Drop burn-rate recording rules; keep duration and in-progress metrics - Slim dashboard to in-flight table, stuck counts, and detail tables
74a9e68 to
e8f39db
Compare
| Cluster upgrade target version {{ $labels.version }} has been in desired for over 20 minutes without reaching partial. Partial is when the target version becomes active (recognized as active) on the HCP cluster; the upgrade is in progress but not yet complete. Investigate backend_cluster_version_info on the affected cluster. | ||
| Service Cluster: {{ $labels.cluster }} | ||
| runbook_url: https://aka.ms/arohcp-runbook-cluster-upgrade | ||
| correlationId: "userJourneyClusterUpgradeStuckInDesired/{{ $labels.resource_id }}/{{ $labels.version }}" | ||
| - alert: userJourneyClusterUpgradeStuckInProgress |
| Cluster upgrade target version {{ $labels.version }} has been in progress for over 30 minutes without reaching completed. Completed is when the target version upgrade has finished and is reported as complete on the HCP cluster. Investigate backend_cluster_version_info on the affected cluster. | ||
| Service Cluster: {{ $labels.cluster }} | ||
| runbook_url: https://aka.ms/arohcp-runbook-cluster-upgrade | ||
| correlationId: "userJourneyClusterUpgradeStuckInProgress/{{ $labels.resource_id }}/{{ $labels.version }}" |
| "code": { "language": "plaintext", "showLineNumbers": false, "showMiniMap": false }, | ||
| "content": "### Cluster Upgrade SLOs\n\nPer-upgrade observability from `backend_cluster_version_info` via `hosted_control_plane_upgrade:*` recording rules.\n\n| SLO | Target | Alert |\n|-----|--------|-------|\n| **Reach partial** | `partial` within 20m | `userJourneyClusterUpgradeStuckInDesired` (>20m in `desired`) |\n| **Upgrade complete** | `completed` within 30m | `userJourneyClusterUpgradeStuckInProgress` (>30m in progress) |\n\n**Runbook:** [https://aka.ms/arohcp-runbook-cluster-upgrade](https://aka.ms/arohcp-runbook-cluster-upgrade)", | ||
| "mode": "markdown" | ||
| }, |
What
Add cluster version selection-to-active SLO recording rules, alerts & slo dashboard
Why
feat: add UJ cluster upgrade partial and complete SLO observability
Testing
Special notes for your reviewer
PR Checklist