Skip to main content
A cost alert is a rule: a threshold, a period, a cost source and an optional scope. The Thoras worker checks every rule hourly and posts to your Slack webhook when a period’s cost goes above the rule’s threshold. You manage rules on the dashboard’s Alerts tab. Cost alerts are off by default.
Requires chart version 5.8.2 (platform 4.129.1).

Turn on cost alerts

Turn on the feature flag and give Thoras a Slack incoming webhook:
To keep the webhook out of your values, store it in a Secret in the namespace you installed Thoras into (thoras below), and reference it instead of setting slackWebhookUrl:
Then helm upgrade your release. The worker checks the rules once at startup, then hourly. Thoras uses the same webhook for its other Slack notifications, such as errors when slackErrorsEnabled is on. With thorasDashboard.read_only set, the Alerts tab lists the rules but can’t create, change or delete them. The rules keep running.

Create an alert

Open Cost analysis -> Alerts and select New alert:
  • Name — shown in the table and in the Slack message.
  • Threshold — in US dollars for estimated cost, or in your billing currency for billed cost.
  • Cost source — Estimated or Billed. See Cost sources. The choice appears only when the billed_cost dashboard extra is on; otherwise every rule uses estimated cost. Before chart 5.13.0, the extra is cluster_daily_cost; see Deprecations.
  • Period — Daily, Weekly or Monthly. See When an alert is sent.
  • Edit scope — the namespaces and workloads the rule covers. With no scope, an estimated rule covers all managed workloads, and a billed rule covers the whole cluster.
Each row in the table has buttons to turn the rule off or on, edit it, send a test alert, and delete it. You can also list, create, change and delete rules from an AI assistant through the MCP server in read-write mode, from platform 4.132.0.

Cost sources

The cost and usage report is usable once the worker has read it and found your cluster’s pods in it, the same rule the Billed cost tab follows. Like the graph, a scoped billed rule then counts only workloads that an AIScaleTarget covers.
Scoped billed rules read the cost and usage report from chart version 5.14.0 (platform 4.133.0). Earlier versions always split the cluster’s bill for a scope, which needs Cost Explorer collection.
Billed cost usually arrives within a day, so a billed rule alerts later than an estimated one for the same day.

When an alert is sent

Periods are in UTC, and only completed days count:
  • Daily — a completed day.
  • Weekly — Monday to Sunday, through yesterday.
  • Monthly — the calendar month, through yesterday.
A rule alerts when its period’s cost goes above the threshold, at most once per period. A weekly or monthly rule can alert partway through its period, as soon as its completed days add up to more than the threshold. Today’s cost counts once the day is over. Cost that arrives late still counts. A daily rule checks each of the last 7 completed days, and a weekly or monthly rule keeps checking its period for 2 days after it ends. A new rule covers periods from the day before you created it, so a rule set up in the morning covers the day that just ended. Changing a rule’s threshold, period, scope or source starts it over: it can alert again for a period it already alerted on. Renaming it, or turning it off and on, doesn’t. A scoped billed rule that reads the cost and usage report adds up each period through the last day the report covers, and adds later days as the report delivers them. Each month’s report is read on its own, so a day counts only once its own month’s report covers it. If the report stops updating, the rule records an error and still alerts on the days it covers.

The Slack message

An alert posts a message titled Budget alert: <rule name> with:
  • The cost, the threshold and the overage, for example $661.57, $500.00 and $161.57 (32%).
  • Scope and Period, for example Monthly · November 2026.
  • Cost through, when the cost covers only part of the period so far.
  • A note on where the cost comes from:
    • “Estimated from requests and node pricing”
    • “Billed by your cloud provider, before commitments”
    • “Billed by AWS: each pod’s share of its node’s cost, from your cost and usage report”
  • “Not included: N days with no allocation data”, when a split bill has days it couldn’t split for the scope, or “Not included: N days the cost and usage report doesn’t cover”, when the report starts partway through the period or is missing days in it.
  • “Incomplete pricing: …”, when some pods could not be priced. See Missing or Partial Pricing.
The test button posts a Test alert: <rule name> message with the current period’s cost against the threshold, whether or not it’s over and whether or not the rule is on. A test doesn’t count as the period’s alert.

Rule status

The Status column shows the result of the rule’s last check. Hover over the icon next to it for details. The Latest cost column shows the cost of the latest period the rule checked.

Troubleshooting

No Alerts tab — featureFlags.enableCostAlerts is off. Turn it on and helm upgrade. No Cost source choice — the billed_cost dashboard extra is off, so every rule uses estimated cost. Turn on Cost Explorer collection or the cost and usage report, and the extra. “Error: billed cost is not being collected; enable the cost and usage collector or switch the rule to estimated cost” — the rule needs Cost Explorer collection. Before chart 5.14.0, every billed rule does. From 5.14.0, a rule with no scope does, and so does a rule with a scope until the cost and usage report is usable. Turn on thorasWorker.enableCostAndUsageCollector, set up the cost and usage report for a scoped rule on 5.14.0 or later, or switch the rule to estimated cost. “Error: no Slack webhook is configured” — set slackWebhookUrl, or slackWebhookUrlSecretRefName and slackWebhookUrlSecretRefKey, as in Turn on cost alerts. “Error: posting to the Slack webhook: …” — Slack refused the message or couldn’t be reached. Check that the webhook is still active, and that the worker can reach hooks.slack.com if a network policy limits its egress. “Error: the cost and usage report is not updating: …” — a scoped billed rule reads the cost and usage report, but the worker hasn’t read it for two days, or it has no cost stored for the cluster. The rule still alerts on the days the report covers. Check the worker logs and the cost and usage report troubleshooting. “Error: estimated cost is incomplete: …” — some pods in the period could not be priced, so the cost covers the priced pods only. See Missing or Partial Pricing.