Skip to content

U4 — FinOps Dashboard — Test Runbook

Asset: U4 — FinOps cost-governance Grafana dashboard (modules/azure/grafana-dashboards/dashboards/snowops-finops.json). Extends J5; no new module. Pairs with U1 (budgets) + U2 (tag policy) + U5 (cost anomaly) + J7 (log-cost lever) to round out the U cost-governance series. Owner: CO · Milestone: M4.


Part A — Offline gate (~2 min, $0)

cd modules/azure/grafana-dashboards
./scripts/validate.sh            # or: python3 scripts/validate_dashboards.py

Acceptance: - [ ] Gate reports the dashboard set valid, including snowops-finops.json. - [ ] Required datasource + workspace template variables present; every non-row panel binds to the Azure Monitor datasource with an Azure query.


Part B — Dashboard shape review (~3 min, $0)

The dashboard surfaces the cost-governance signals available without a Cost Management spend export — it is honest about that boundary:

  • Log-ingestion cost (the J7 Basic-Logs lever): daily billable ingestion GB + top tables by ingestion (the Usage table) — these are the tables to consider moving to J7's Basic tier.
  • Tag governance & allocation: untagged-resource count (missing CostCenter), resources by CostCenter tag, resources by type — the cost-allocation readiness signals from Azure Resource Graph.
  • No fabricated spend — subscription $ spend needs a Cost Management export feed (not yet wired; same honest stance as V5's cost section). The dashboard description states this explicitly. U1 (budgets) + U5 (anomaly alerts) cover threshold + anomaly alerting on real spend in the meantime.

Part C — Live (requires a deployed J5 instance + the J1 workspace)

  1. Deploy via the J5 path:
    cd modules/azure/grafana-dashboards
    ./scripts/deploy-dashboards.sh <grafana-name> <rg> "$(terraform output -raw workspace_id)"
    
  2. SnowOps — FinOps & Cost Governance renders; the Usage panels show ingestion (every workspace has Usage), and the ARG panels show resource inventory across the subscription the instance identity can read.
  3. Cross-check "top tables by ingestion" against J7's Basic/Analytics split — high-ingestion, low-query tables are Basic candidates.
  4. Untagged-resource count should trend toward zero as U2 (tag policy) enforcement takes hold.

Notes

  • ARG panels need the Grafana identity to have Reader (covered by J5's monitoring_reader_scopes at subscription scope where granted); the offline gate checks structure only, not data presence.