Skip to content

feat(observe): export drain-marked members independently of held-out - #403

Merged
rldyourmnd merged 6 commits into
mainfrom
feat/observe-drain-marked-visibility
Sep 4, 2026
Merged

feat(observe): export drain-marked members independently of held-out#403
rldyourmnd merged 6 commits into
mainfrom
feat/observe-drain-marked-visibility

Conversation

@rldyourmnd

@rldyourmnd rldyourmnd commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Summary

Public #402 keeps platform health up during a full online drain, but that exception was invisible: HeldOutMembers stays empty because the listing is complete. Operators could not see the authorized hold except by inferring it from health staying one.

Snapshot schema 16 and Prometheus now name every drain-marked member, online or offline. Only a reason with the drained: prefix counts; an empty member listing is not a full drain. gha_fleet_visibility_held_out_members is still the offline listing-incomplete subset. Queue and assigned pages still fire. No alert threshold was retuned.

Also in this PR, from the same bake-window audit:

  • fleet_health_flapping uses sum_over_time of healthy < bool 1 so a quiet fleet is not an empty vector (OpenObserve 20008 → alert_evaluation_failed).
  • Host-signal tickets and dashboards use last-min of the cumulative counter, not unsigned max-min.
  • Operator-facing copy matches shipped thresholds (queued-delivery 30m, slow-burn 5–30m band, created-unbound 15m).

Verify

  • gofmt -l internal/fleetobserve
  • go vet ./internal/fleetobserve/
  • go test ./internal/fleetobserve/ ./internal/observabilitydashboards/ ./internal/observabilityrules/ ./cmd/gha-fleet-observer/

A full online drain keeps platform health up but left that exception
invisible: HeldOutMembers stays empty because the listing is complete.
Snapshot schema 16 and Prometheus now name every drain-marked member,
online or off. Queue and assigned pages still fire.
Runbooks now name drain-marked members as the authorized-hold signal
and keep held-out as the offline listing-incomplete subset.
The provider already filters user.gha_pressure.reason through that
prefix. The observer now does the same, so a pressure-closed or
operator-typed string cannot look like an authorized hold. A blank
member listing is fail-closed: it is not evidence every member was
marked.
count_over_time of (healthy < 1) is empty on a quiet fleet, and hold
greater than eval then wraps that empty vector into error 20008.
sum_over_time of the bool keeps a matrix. Host-signal tickets and
dashboards use last-min of the cumulative counter so a collector
restart or series reset is not an unsigned burst. Thresholds are
unchanged.
Queued-delivery is thirty minutes, slow-burn is the five-to-thirty
band, created-unbound is fifteen minutes. Inventory-gap pages on any
of the three mins, not each of them. Alert rule count is thirty-one.
host_utilization and job_lifecycle were already in the contract.
@rldyourmnd
rldyourmnd merged commit 741130d into main Sep 4, 2026
10 checks passed
@rldyourmnd
rldyourmnd deleted the feat/observe-drain-marked-visibility branch September 4, 2026 23:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant