Skip to content

Hand over observability to the estate path #660

Closed

Description

@ExtraToast

Parent

Rewrite the spec and the compiler in place, release 1.0.0, and hand over every Project

What to build

The observability Project leaves fleet-infra and is delivered from the estate repository, in the order #381 sets.

The estate's observability file declares otel-collector and prometheus. Add prometheus-operator, kube-state-metrics, grafana-operator, loki, tempo, pyroscope, gatus, alloy, alertmanager and grafana from the worked example. The namespace moves from observability to observability-system, where the stores start fresh; the old claims stay until their retention runs out (decided 2026-10-27). The otel-collector serving statement leaves the handover ledger.

The estate-side changes are recorded in the estate repository's HANDOVER.md.

Acceptance criteria

  • The render's diff against the Project's hand-written objects in fleet-infra is clean, or each difference is explained.
  • The Project's Reconcile Units report Ready.
  • A consumer-visible value checks out: Grafana's dashboards show live data, and an alert reaches Discord.
  • One change flips the handover ledger entry and deletes the hand-written objects, the descriptor and the drift-check entry.

Blocked by

Activity

  1. added
    type: choreMaintenance work without intended behavior change.
    area: platformPlatform, deployment, cluster, or runtime concern.
    priority: P1High; important and should be handled in the current iteration.
    status: blockedCannot move forward until an external dependency is resolved.
    on Oct 27, 2026
  2. ExtraToast commented on Oct 27, 2026

    @ExtraToast
    ContributorAuthor

    Resume here

  3. ExtraToast commented on Oct 29, 2026

    @ExtraToast
    ContributorAuthor

    #653 has landed (#689): grafana is now in the observability example. The estate's observability file copies spec/v1/examples/observability/ as it stands on main.

    What changes for this handover:

    • grafana is an Application of observability, beside grafana-operator. It keeps its native Client against identity's provider, holding a secret. Its env file is observability/env/grafana/base.env. The Platform document names the monitoring Grafana observability/grafana.
    • Its credential path is secret/data/observability-system/grafana/client. The provider writes it there, and nothing writes the old identity-system path any more.
    • Observability now has a public exposure, so its Flux unit carries grafana's URL for rollout events and dependsOn: apps-edge (pins/rendered/projects/observability/source.yaml). It reconciles only after edge's unit.
  4. ExtraToast commented on Oct 29, 2026

    @ExtraToast
    ContributorAuthor

    #655 has landed (#699): the metrics stack scrapes Flux, and it can now reach its scrape targets.

    • The estate's Platform document should record bootstrap.flux.metrics: {port: 8080, path: /metrics}. observability then renders the flux-controllers PodMonitor in its own namespace, replacing fleet-infra's observability/flux-monitoring.
    • Prometheus's policy now admits egress to every declared scrape port and to Flux's port 8080. Before feat(model): scrape Flux where the bootstrap set records its metrics, and derive the metrics stack's egress #699 the rendered Prometheus could reach only DNS, so an observability handover before it would have scraped nothing.
    • Check at the handover: the Flux series' job becomes each controller's name (for example kustomize-controller) instead of flux-system/flux-controllers. Any live alert that filters on that job needs adjusting.
  5. ExtraToast commented on Oct 29, 2026

    @ExtraToast
    ContributorAuthor

    #380 is closed: delivery, _canary and _estate are on the 1.0 contract (evidence in #380 (comment)).

  6. ExtraToast commented on Oct 29, 2026

    @ExtraToast
    ContributorAuthor

    Handover prepared: drafts only, nothing merged. The render-against-live diff is in JorisJonkers-dev/estate#260 and its runbook, docs/runbooks/observability-handover.md.

    Merge order

    1. JorisJonkers-dev/fleet-infra#563: prune guards. Before the window, and safe now.
      • The namespace observability, gatus-data, observability-backups and the grafana, gatus and faro routes get the prune mark.
      • loki's StatefulSet stops deleting its claim, and grafana's claim gets helm.sh/resource-policy: keep.
      • After it lands, by hand: the eight PVs to Retain.
    2. feat(bootstrap): pin the monitoring stack's CRDs in the bootstrap set estate#259: the monitoring stack's CRDs join the bootstrap set (monitoring.coreos.com/v1alpha1, grafana.integreatly.org/v1beta1) and cluster.sh applies them. Before the window.
    3. JorisJonkers-dev/fleet-infra#564: orphan. Every object is marked, the seven HelmReleases are suspended (not dcgm-exporter), and the three Kustomizations get prune: false. Window step 1.
    4. JorisJonkers-dev/fleet-infra#566: drop the manifests and the three Kustomizations. The backup CronJobs, observability-backups and dcgm-exporter stay under apps-observability-namespace, and the routes move unchanged to apps-edge. Window step 2.
    5. feat: hand the observability Project over to the estate path estate#260, then its release: the flip. Window step 3.
    6. JorisJonkers-dev/fleet-infra#568: the routes and both Traefiks' traces move to observability-system, and the old VSO copies go. After the flip, once Ready.

    Blockers

    Until #722 and #723 are released, the runbook describes a bridge: the old Prometheus, Alertmanager and Grafana keep running under the estate path's operators, and the old operators and the old AlertmanagerConfig are deleted by hand. Without the bridge, the flip is a total alert gap.

    Decisions for the maintainer

  7. ExtraToast commented on Nov 1, 2026

    @ExtraToast
    ContributorAuthor

    Observability is on the estate path (estate 0.36.4) and the old stack is deleted.

    Follow-ups, outside this handover: release-gate's scrape answers 403; auth-api's error-budget rule counts authorization denials as errors; kube-state-metrics' namespace label is overwritten by the scrape's own.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: platformPlatform, deployment, cluster, or runtime concern.priority: P1High; important and should be handled in the current iteration.status: blockedCannot move forward until an external dependency is resolved.type: choreMaintenance work without intended behavior change.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions