🤖 Generated by the Agentic Engineer
First increment of #2820. The alerting rule cannot be written before the series
exists, so this child delivers only the metric source.
Evidence
Measured on the live cluster 2026-08-06, over repositories.repo.github.m.upbound.io:
That gives the increment a live positive fixture (3) and a live negative one (17)
without constructing anything.
Scope
Repository only, deliberately. CustomResourceStateMetrics matches an exact
groupVersionKind — there is no wildcard and no categories: managed selector — so
each of the 16 managed-resource kinds must be listed individually. Starting with the
one kind that carries the observed failure proves the pipeline end to end before
committing to a list that will drift. Extending coverage is a separate child, and
until it lands the exporter's coverage is explicitly partial.
Acceptance criteria
Rough size: one Kustomize component, off-the-shelf images, no bespoke code.
First increment of #2820. The alerting rule cannot be written before the series
exists, so this child delivers only the metric source.
Evidence
Measured on the live cluster 2026-08-06, over
repositories.repo.github.m.upbound.io:Synced=Falseon 3,Synced=Trueon 17.Ready=TruewhileSynced=False— the exact silent stateAlert when a Crossplane managed resource stops reconciling (Ready=True hides Synced=False) #2820 describes, present right now and non-zero.
Synced,Ready,LastAsyncOperation), every onecarrying a non-null
reason, and the value domain is exactlyTrue/False.That gives the increment a live positive fixture (3) and a live negative one (17)
without constructing anything.
Scope
Repositoryonly, deliberately.CustomResourceStateMetricsmatches an exactgroupVersionKind— there is no wildcard and nocategories: managedselector — soeach of the 16 managed-resource kinds must be listed individually. Starting with the
one kind that carries the observed failure proves the pipeline end to end before
committing to a list that will drift. Extending coverage is a separate child, and
until it lands the exporter's coverage is explicitly partial.
Acceptance criteria
crossplane_managed_resource_conditionis queryable incoroot-prometheus,one series per (resource, condition), value 1 for
Trueand 0 forFalse.Readyis exported alongsideSynced, so the Ready-True-while-Synced-Falsepair is expressible as a single query.
independently reversible change.
apiGroups: ["*"].kubectlread: 3Synced=False, 17Synced=True.Rough size: one Kustomize component, off-the-shelf images, no bespoke code.