Skip to content

Alert when a Crossplane managed resource stops reconciling (Ready=True hides Synced=False) #2820

Description

@devantler

🤖 Generated by the Agentic Engineer

Evidence

17 of the 20 Repository managed resources in github-config sat in a failing sync state for weeks with no signal. Measured on the live cluster 2026-07-27:

  • Every one of the 17 reports Synced: False.
  • Every one of the 17 simultaneously reports Ready: True.

That second line is why nothing surfaced it. Any health check keyed on Ready — which is the obvious one — reads this fleet as entirely healthy. Meanwhile no declared setting was reaching GitHub at all, including the visibility pins two repositories rely on. The control was voided silently, which is worse than not having it, because the config file still reads as the truth.

This is the detection half of devantler-tech/.github#123. The trigger for that specific outage is fixed (devantler-tech/.github#125), but nothing would surface the next one.

Problem

There is currently no mechanism that could raise this. docs/dr/alerting.md records that Coroot replaced the kube-prometheus-stack assembly, and with it went the PrometheusRule / ServiceMonitor / PodMonitor CRDs — there is no prometheus-operator in the cluster. Coroot's built-in alerting is SLO-based plus automatic inspections (node down, OOM kills, crashloops, disk filling, deployment issues, saturation). Those cover workload health well, and none of them observes a Crossplane managed resource's Synced condition.

So "alert on Synced: False" is not a rule we can simply author — the usual surface for it does not exist here. That is the actual work in this issue, and it is why it is worth its own item rather than a line on the parent.

Expected behaviour

A managed resource that stops reconciling raises a signal to the same Slack destination Coroot already delivers to, rather than sitting quietly. Scope it to the condition, not to one provider: this failure mode is generic to every Crossplane managed resource, not specific to GitHub repositories.

Worth weighing (not a decision):

  1. A small exporter that surfaces managed-resource conditions as metrics Coroot's bundled Prometheus can scrape, then a Coroot alert on it.
  2. A Kyverno policy or admission-time check that reports resources stuck in Synced: False beyond a threshold.
  3. A scheduled job that queries the conditions directly and posts to the existing webhook.

Option 1 generalises best and reuses the delivery path already wired declaratively; options 2 and 3 are cheaper.

Acceptance criteria

  • A managed resource held in Synced: False beyond a short grace period produces an alert, delivered through the existing Coroot → Slack path.
  • The check keys on Synced, not on Ready — the two disagreed on 17 resources here, and Ready alone is what made this invisible.
  • Applies to any Crossplane managed resource, not just Repository.
  • RED-proved: a deliberately broken resource fires it, and a healthy fleet does not (no standing false alarm).

Rough size: M.

Part of devantler-tech/.github#123

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

Status
🏃🏻‍♂️ In Progress

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions