Troubleshoot Cost Visibility
When a Cost Visibility figure looks wrong, the cluster says why: every unpriced or partly priced figure carries a notice with a code, a title, a message and, where there is one, a next step. This page is what each one means. How to read coverage and missing hours is on Cost.
When to use it
- Observed spend reads Not priced, or a figure followed by "+ Not priced".
- The total is lower than your cloud bill.
- The add-on is healthy and there is no cost yet.
- A configuration change doesn't take effect.
Before you start
- Cost Visibility installed: Cost Visibility.
In the console
-
Open the cluster from the cluster list and select Cost. Read the notices under the cards: each names what is not priced and its next step.
Open zoom view -
Select the Add-ons tab and open Cost Visibility. The Health card shows the
availabilityandcost reportingchecks; Events shows why a change did not apply. -
Follow the notice's next step, such as Set a price sheet or Update the cluster.
You should see
Once a notice's cause is fixed, the next closed hour is priced and the notice goes. Closed hours keep the price, or lack of one, they were reported with: rates added now apply from the next hour, not to history.
Cost reads Not priced
Read the reasons from the API:
astroctl infra k8s cost summary <cluster> --window 24h -o yaml
pricingNotes say how the cluster is priced, and an unpriced entry's unpricedReasons say what has no price. Each code is under If it's refused. A registered cluster outside AWS and Azure, or a local one, has no published prices and no notice: give it a price sheet.
The total is lower than your cloud bill
astroctl infra k8s cost allocation <cluster> --group-by Namespace --window 24h -o yaml
- A notice in
pricingNotesorunpricedReasons: that part is left out. Follow it. complete: false: some hours were not measured. See Cost.- The Cluster infrastructure rows are the management fee and what AstroPulse provisioned around the cluster. No NAT gateway rows on an EKS cluster AstroPulse created means it runs in a VPC you supplied, whose gateways are yours, or its NAT gateway count is not recorded yet (
CostCountNotRecorded): update the cluster. - Some charges are never in the total, such as data transfer, support, taxes, credits and discounts: What the total includes.
- Published prices are list prices. With discounts, a price sheet at your real rates comes closer.
No cost yet, add-on healthy
Expected for one to two hours. Spend is reported one closed UTC hour at a time, starting with the first hour the add-on watched from its start: installing at 10:05 or at 10:50 makes 11:00 to 12:00 the first hour, reported a few minutes after 12:00. Usage is measured from the start; only the money waits. The add-on's cost reporting check says which hour it is waiting for.
A change doesn't take effect
Before switching to a backend of yours, the add-on checks it, and refuses rather than replace a working source with a broken one. Read why:
kubectl -n astro-cost get jobs
kubectl -n astro-cost logs job/<the -source-preflight job>
A failed check is kept for a day; a passed one is removed. The usual cause is a missing series: What the backend must carry.
Every node reports no cost
On a backend of yours, kube_node_labels is missing: kube-state-metrics needs node labels enabled.
Spot rates seem ignored
Spot rates in a price sheet apply only to nodes carrying the Spot label you declared. Check what your nodes carry:
kubectl get nodes -o json | jq -r '.items[].metadata.labels | keys[]' \
| sort -u | grep -iE 'spot|preempt|capacity'
Other ways in
- Nova: ask it, for example "why is eks-prod's cost lower than my AWS bill?"
- SDK and API: the same operations, in the API reference.
With astroctl
astroctl infra k8s addons get <cluster> cost-visibility -o yaml
astroctl infra k8s cost summary <cluster> --window 24h -o yaml
astroctl infra k8s cost trend <cluster> --window 7d --interval 1h
The add-on's pricing.notices carry the same notices before any hour is reported.
Settings
This page has no settings of its own: Cost Visibility settings and price sheet settings.
If it's refused
Each notice by its code, with the title and message the console shows.
CostListPriceUnavailable: This cluster's costs aren't priced, "The metering engine can't read Google Cloud list prices on this cluster, so its costs aren't priced. Set a price sheet on the cost-visibility add-on to price it at your rates."CostSpotPriceUnavailable: Spot nodes are priced at On-Demand ratesCostGPUNotPriced: GPU usage isn't priced, "Usage on GPU nodes isn't priced: the price sheet sets no rate for them."gpuHour.CostSpotGPUNotPriced: Spot GPU usage isn't priced, "Usage on Spot GPU nodes isn't priced: the price sheet has no Spot GPU rate."spotGpuHour.CostManagementNoRate: Cluster management isn't priced, "Cluster management isn't priced: the price sheet sets no cluster management rate."clusterManagementHour."0" if the cluster has no management fee.CostAgentUpgradeRequired: Cluster management isn't priced, "Cluster management isn't priced: the astro-agent on this cluster is older than the price sheet's cluster management rate needs."clusterManagementHour.CostAttributionInconsistent: Some hours can't be split by applicationCostNotMetered: Some charges aren't measuredCostNoPriceSource: No published price for some chargesCostCountNotRecorded: Some charges aren't countedCostPriceUnavailable: Some charges couldn't be pricedCostPriceStale: Some charges use the last prices read