finowl breakdown
finowl breakdown [OPTIONS] -b, --bundle PATH Path to the databricks.yml bundle file. [default: databricks.yml] -t, --target TEXT Target environment to act on. [required] -o, --output [table|json] Output format. [default: table] -p, --profile TEXT Authentication profile to act as. [env: FINOWL_CONFIG_PROFILE]
Examples
# the common case
finowl breakdown --target dev
# a bundle somewhere else in a monorepo
finowl breakdown -b products/sales/databricks.yml -t prod
# machine-readable, for a script or a comment bot
finowl breakdown -t prod -o json
# just the total
finowl breakdown -t prod -o json | jq '.result.total_cost_incl_vat'
# as a second organization
finowl breakdown -t prod --profile acme-euHow a cost is derived
Three inputs multiply out to a monthly figure.
| INPUT | SOURCE | GIVES |
|---|---|---|
| Cluster shape | The bundle, resolved for --target | What one hour costs — VM rate per node plus DBU consumption. |
| Frequency | The schedule or trigger in the bundle (quartz_cron_expression, periodic triggers, continuous: true) | How many runs a month, or 730 hours for a continuous resource. |
| Duration | The workload word in finowl.yml for this target | How long one run takes. |
Runtime hours get a 20% safety factor on top, because a job that overruns its typical duration costs money and a projection that assumes it never does is optimistic by construction.
What the pricing covers
- Jobs compute and all-purpose compute, at the workspace tier, with Photon accounted for — on jobs compute Photon doubles the DBU rate.
- DLT pipelines by edition — core, pro, advanced — with the DLT DBU formula, where Photon doubles the DBU count per node rather than the rate.
- Spot instances, including
first_on_demand: the driver and the first on-demand workers are billed pay-as-you-go and the remainder at spot. - Serverless jobs and pipelines, sized from the workload word.
- SQL warehouses, classic and serverless, always at 730 hours a month.
Rates are fetched live from the platform rather than shipped in the package, so a breakdown reflects current list prices. Figures are in EUR for France Central by default, with 20% VAT shown separately.
Reading the output
$ finowl breakdown --target prod
Loading bundle: databricks.yml (target: prod)
╭───────────────────────────────────────────────────╮
│ Monthly Cost Breakdown │
│ Pricing Model: Azure Pay As You Go — Premium tier │
╰───────────────────────────────────────────────────╯
💼 Jobs / Pipelines Cost Breakdown
┏━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃ Job-Pipeline / Task ┃ Instance ┃ Workers ┃ Monthly Hours ┃ VM Cost ┃ DBU Cost ┃ Total Cost ┃
┡━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩
│ daily_ingest [mixed] │ │ │ │ │ │ €59.04 │
│ Task: main [light] │ Standard_DS3_v2 │ 4 │ 37.2h │ €18.60 │ €26.04 │ €44.64 │
│ Task: notify │ Serverless │ — │ 12.0h │ €0.00 │ €14.40 │ €9.60 – €14.40 │
│ [trivial] │
│ (estimated) │
└───────────────────────┴─────────────────┴─────────┴───────────────┴─────────┴──────────┴─────────────────┘
Jobs Total: €54.24 – €59.04 (P50–P90)/month
🔄 DLT Pipelines Cost Breakdown
┏━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Pipeline Name ┃ Instance ┃ Workers ┃ Edition ┃ Monthly Hours ┃ VM Cost ┃ DBU Cost ┃ Total Cost ┃
┡━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━┩
│ customer_scd [medium] │ Standard_DS4_v2 │ 2 │ Advanced │ 73.0h │ €43.80 │ €58.40 │ €102.20 │
└───────────────────────┴─────────────────┴─────────┴──────────┴───────────────┴─────────┴──────────┴────────────┘
Pipelines Total: €102.20/month
Storage and data transfer are not yet measured for this product.
╭─────────────────────────────────────────────────────────────────────╮
│ 📊 Total Monthly Cost Summary │
│ │
│ Subtotal (HT) €156.44 – €161.24 (P50–P90) │
│ VAT (20%) €32.25 │
│ Total (TTC) €187.73 – €193.49 (P50–P90) │
│ serverless rows estimated — guard evaluates │
│ the P90 bound │
╰─────────────────────────────────────────────────────────────────────╯Cost bands
When a bundle contains serverless resources, totals render as a band rather than a point: €142.00 – €161.24 (P50–P90). Serverless cost depends on how much data the workload actually processes, which the bundle does not state. The lower bound is the midpoint estimate; the upper bound is what finowl guard evaluates against your thresholds.
Measured storage and data transfer
Below the calculated tables, breakdown shows storage and data transfer as billed, when the platform has them for this product. They are labelled measured, carry the period they cover, and are not added into the estimated total — mixing a measurement into a projection makes both unreadable.
Nothing measured yet is stated rather than shown as zero. Nothing measured and nothing spent are different facts.
When it refuses to produce a number
| SITUATION | BEHAVIOUR |
|---|---|
| A compute has no workload word for this target | Exits 2 with the complete list of gaps — every missing compute at once, before any pricing call. Run init for that target. |
| A job_cluster_key does not resolve | Exits 1 naming the job and the reference. databricks bundle validate catches it: a cluster that is not there makes the cost wrong rather than missing. |
| The target is not declared by the bundle | Exits 2 listing the declared targets. Checked before anything reads the bundle. |
| No credential | Exits 2 with one authentication error. Pricing rates come from the platform. |
| The bundle declares no resources | Exits 0 reporting a zero total. An empty bundle is not an error. |
What gets reported
Every run — successful or not — is filed against the product identity in finowl.yml. In CI it is authoritative and updates the deployment's cost figures. Locally it is a preview attributed to your git identity.
A name in finowl.yml that no longer matches the registered name produces a warning here, and a failure in finowl guard. Fix it with finowl rename.